On 10/30/06, Christopher Kohlhoff
Hi Christian,
Christian Henning wrote:
Hi Christopher, thanks for putting so much time into this issue. I changed the code as you requested, namely I added a new members to my connection class.
I found another similar problem in image_source::do_write(). I've just implemented a feature for the next version that uses MSVC's iterator debugging to check the buffer validity. These program bugs show up as an assertion failure when this new "buffer debugging" feature is enabled.
I did make the change to all my source classes. A do_write operation now looks like this: void do_write() { int i = 9; std::ostringstream archive_stream; boost::archive::binary_oarchive archive( archive_stream ); archive & i; _outbound_data = archive_stream.str(); std::ostringstream header_stream; header_stream << std::setw( 8 ) << std::hex << _outbound_data.size(); _outbound_header = header_stream.str(); std::vectorboost::asio::const_buffer buffers; buffers.push_back(boost::asio::buffer( _outbound_header )); buffers.push_back(boost::asio::buffer( _outbound_data )); boost::asio::async_write( _socket , buffers , boost::bind( &image_quality_source::handle_write , this , boost::asio::placeholders::error )); } Both the _outbound_heaser and _outbound_data are members of the class.
But unfortunately nothing has changed. I still have memory leaks reported. Did you do the change on your machine?
I have now, and I found what I think is the cause of the leak. Can you please try the following change to asio/detail/win_iocp_io_service.hpp:
@@ -74,10 +74,11 @@ DWORD_PTR completion_key = 0; #endif LPOVERLAPPED overlapped = 0; - ::GetQueuedCompletionStatus(iocp_.handle, + ::SetLastError(0); + BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, &completion_key, &overlapped, 0); DWORD last_error = ::GetLastError(); - if (last_error == WAIT_TIMEOUT) + if (!ok && overlapped == 0 && last_error == WAIT_TIMEOUT) break; if (overlapped) static_cast
(overlapped)->destroy();
This is most likely offtopic, but how do apply that patch to a source file? Have never done that. Is there a program I should use? Thanks Christian