Or alternatively maybe, we could perhaps introduce a new select op that cancels and wait for objects?
That would avoid that particular issue as well, I guess. Not sure how much use it would get but I'm going to give it a go and see how it looks.
This was looking pretty good, except I think it doesn't quite work in general: `server_select()` restarts the `select` server call when the original one is interrupted by a `KERNEL_APC`. Depending on timing, we could get:
1. The initial `select` server call cancels an async 2. The initial `select` server call is interrupted by the KERNEL_APC triggered by the cancellation 3. `server_select()` restarts the `select` server call 4. the second instance of `select` doesn't find any pending async, returning `STATUS_NOT_FOUND`
and that sometimes breaks one of the existing pipe tests.
I'm sure we could sidestep this issue in some way (worst case by partially duplicating / reimplementing `server_select()`), but this probably suggests that we don't want to take this route. Unless I'm missing something else (certainly possible).