Reputation: 6686
How win32 manages instances of OVERLAPPED struct in context of two functions:
GetQueuedCompletionStatus
PostQueuedCompletionStatus
When I call GetQueuedCompletionStatus does win32 free instance of OVERLAPPED struct or I must do it by my self?
When I send data with PostQueuedCompletionStatus does win32 copy it to internal structs? When I must free memory of sent data?
Where I could find some picture with scheme of processing of OVERLAPPED data between GetQueuedCompletionStatus, PostQueuedCompletionStatus and IOCP queue?
Upvotes: 4
Views: 3232
Reputation: 21616
The OVERLAPPED
structure must exist from when a successful I/O operation (or manual PostQueuedCompletionStatus()) executes until the OVERLAPPED
emerges from a call to GetQueuedCompletionStatus().
You are responsible for the lifetime of the structure.
You'll see from the MSDN docs that GetQueuedCompletionStatus()
actually takes "a pointer to a variable that receives the address of the OVERLAPPED
structure that was specified when the completed I/O operation was started.". What you actually get out of that call is a pointer to the original OVERLAPPED
that you passed when you made the PostQueuedCompletionStatus()
call (or initiated an overlapped I/O operation).
This is all actually very useful as the "normal" way to use the OVERLAPPED
structure is to place it inside a larger structure which holds all of the 'per operation' information that you might need - so it's the ideal way to navigate directly from the limited information that you're given when you call GetQueuedCompletionStatus()
to, for example, the data buffer that you used in your overlapped read call...
I find the best way to deal with OVERLAPPED
structures is to a) embed them in the buffer you're using for read/write b) reference count them and c) return them to a pool for reuse when the ref count drops to 0.
I have some source code that you could download (here) which may make this a little easier to understand (it's a full IOCP server example so it's a little complex, but it works and shows how these things can be used).
Upvotes: 4
Reputation: 129374
OVERLAPPED *
to GetQueuedCompletionStatus
. This gets filled in with the value passed to PostQueuedCompletionStatus
. PostQueuedCompletionStatus
context. It should be done by the context using GetQueuedCompletionStatus
. (Assuming it was allocated dynamically in the first place - there is no requirement that it is a dynamically allocated structure, it could be taken out of a fixed pool, or be allocated on the stack of a function that doesn't return until it has been signalled that the operation is complete). Upvotes: 1