crystal
crystal copied to clipboard
Refactor cancellation of `IOCP::OverlappedOperation`
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
andsuspend
- Drops
@@cancelled
linked list. - Drops the workaround from https://github.com/crystal-lang/crystal/pull/14724#issuecomment-2187401075