crystal icon indicating copy to clipboard operation
crystal copied to clipboard

Refactor cancellation of `IOCP::OverlappedOperation`

Open straight-shoota opened this issue 7 months ago • 0 comments

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
  • Drops @@cancelled linked list.
  • Drops the workaround from https://github.com/crystal-lang/crystal/pull/14724#issuecomment-2187401075

straight-shoota avatar Jun 25 '24 22:06 straight-shoota