It wouldn’t be too hard to tell it apart. A yield is defined as the task waking itself vs something else waking it. The yield methods already do this.
Again, FuturesUnordered cannot know the difference between a task wanting to yield and a task that wants to be polled immediately. The waker does not get this information, either. It cannot distinguish.
But polling multiple futures independent of each other inside of a future is a thing (like join, race, etc.).
And that means that just because you get "Pending" (i.e. not ready) from one of the futures, doesn't mean you should return Pending now. I only means this future is not ready, but other futures might still be ready.
But in tokio it means this future is not ready, and we magically as a side-effect might have forced all other futures to be non-ready even if they are.
Which means tokio redefined what Pending means in a subtle but potentially massively-braking way.
Which is a problem.
And not a problem of futures-rs, but one of tokio.
And forcing all of the eco-system to increase the complexity of their code by trying to subtile detect weather something yielded or was force yielded IS NOT OK. That's not how rust standarized yielding or polling.