CancelIo() is supposed to cancel all pending I/O operations associated with the calling thread. In my experience, CancelIo() sometimes cancels future I/O operations as well. Given:
ReadFile(port, buffer, length, &bytesTransferred, overlapped);
- If I invoke
CancelIo(port)immediately before the read,GetQueuedCompletionStatus()will block forever, never receiving the read operation. - If I invoke
CancelIo(port)immediately after the read,GetQueuedCompletionStatus()will return 0 withGetLastError()==ERROR_OPERATION_ABORTED - If I invoke
CancelIo(port)and there are no pending or subsequent reads,GetQueuedCompletionStatus()will block forever.
The key point here is that there is no way to detect when CancelIo() has finished executing. How can I ensure that CancelIo() is done executing and it is safe to issue further read requests?
PS: Looking at http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.html and http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/using.html it sounds like CancelIo() is not really usable. Must customer requires Windows XP support. What are my options?
NOTE: I am reading from a serial port.
CancelIo()works fine. I misunderstood my code.Upon further investigation it turns out that the code was invoking
CancelIo()followed byReadFile()with a timeoutINFINITE. The completion port was never getting notified of the read because the remote end was never sending anything. In other words,CancelIo()did not cancel subsequent operations.I found some eye-opening documentation here:
It turns out that device drivers may choose to treat an asynchronous operation in a synchronous manner if the data being read is already cached by the device driver. Upon further investigation, I discovered that when
CancelIo()was being invoked beforeReadFile()it would sometimes cause the latter to return synchronously. I have no idea why the completion port was never getting notified ofReadFile()after aCancelIo()but I can no longer reproduce this problem.The completion port is signaled regardless of whether
ReadFile()is synchronous or asynchronous.