When an overlapped operation gets cancelled, we still need to wait for completion of the operation (with status ERROR_OPERATION_ABORTED) before it can be freed.
Previously we stored a reference to cancelled operations in a linked list and removed them when complete. This allows continuing executing the fiber directly after the cancellation is triggered, but it's also quite a bit of overhead.
Also it makes it impossible to allocate operations on the stack.
Cancellation is triggered when an operation times out.
The change in this patch is that after a timeout the fiber is suspended again, expecting completion via the event loop. Then the operation can be freed.
Removes the CANCELLED state. It's no longer necessary, we only need to distinguish whether a fiber was woken up due to timeout or completion. A follow-up will further simplify the state handling.
Replace special timeout event and fiber scheduling logic with generic sleep and suspend
When an overlapped operation gets cancelled, we still need to wait for completion of the operation (with status
ERROR_OPERATION_ABORTED
) before it can be freed. Previously we stored a reference to cancelled operations in a linked list and removed them when complete. This allows continuing executing the fiber directly after the cancellation is triggered, but it's also quite a bit of overhead. Also it makes it impossible to allocate operations on the stack.Cancellation is triggered when an operation times out.
The change in this patch is that after a timeout the fiber is suspended again, expecting completion via the event loop. Then the operation can be freed.
CANCELLED
state. It's no longer necessary, we only need to distinguish whether a fiber was woken up due to timeout or completion. A follow-up will further simplify the state handling.sleep
andsuspend
@@cancelled
linked list.