merged ERROR_CANT_WAIT patch from RC_0_16

This commit is contained in:
Arvid Norberg 2013-01-10 03:22:49 +00:00
parent 66a9f31ebf
commit 71653be7f0
2 changed files with 26 additions and 8 deletions

View File

@ -9,6 +9,7 @@
* fix uTP edge case where udp socket buffer fills up
* fix nagle implementation in uTP
* attempt to handle ERROR_CANT_WAIT disk error on windows
* improve peers exchanged over PEX
* fixed rare crash in ut_metadata extension
* fixed files checking issue

View File

@ -1324,24 +1324,32 @@ namespace libtorrent
ol.OffsetHigh = DWORD(file_offset >> 32);
ol.Offset = DWORD(file_offset & 0xffffffff);
ol.hEvent = CreateEvent(0, true, false, 0);
if (ol.hEvent == ERROR_INVALID_HANDLE)
{
ec.assign(last_error, get_system_category());
return -1;
}
ret += size;
size = num_pages * m_page_size;
if (ReadFileScatter(m_file_handle, segment_array, size, 0, &ol) == 0)
{
DWORD last_error = GetLastError();
if (last_error != ERROR_IO_PENDING)
if (last_error != ERROR_IO_PENDING
&& last_error != ERROR_CANT_WAIT)
{
ec.assign(GetLastError(), get_system_category());
ec.assign(last_error, get_system_category());
CloseHandle(ol.hEvent);
return -1;
}
DWORD num_read;
if (GetOverlappedResult(m_file_handle, &ol, &num_read, true) == 0)
{
if (GetLastError() != ERROR_HANDLE_EOF)
DWORD last_error = GetLastError();
if (last_error != ERROR_HANDLE_EOF)
{
ec.assign(GetLastError(), get_system_category());
TORRENT_ASSERT(last_error != ERROR_CANT_WAIT);
ec.assign(last_error, get_system_category());
CloseHandle(ol.hEvent);
return -1;
}
@ -1539,6 +1547,11 @@ namespace libtorrent
ol.OffsetHigh = DWORD(file_offset >> 32);
ol.Offset = DWORD(file_offset & 0xffffffff);
ol.hEvent = CreateEvent(0, true, false, 0);
if (ol.hEvent == ERROR_INVALID_HANDLE)
{
ec.assign(last_error, get_system_category());
return -1;
}
ret += size;
size_type file_size = 0;
@ -1554,17 +1567,21 @@ namespace libtorrent
if (WriteFileGather(m_file_handle, segment_array, size, 0, &ol) == 0)
{
if (GetLastError() != ERROR_IO_PENDING)
DWORD last_error = GetLastError();
if (last_error != ERROR_IO_PENDING
&& last_error != ERROR_CANT_WAIT)
{
TORRENT_ASSERT(GetLastError() != ERROR_BAD_ARGUMENTS);
ec.assign(GetLastError(), get_system_category());
TORRENT_ASSERT(last_error != ERROR_BAD_ARGUMENTS);
ec.assign(last_error, get_system_category());
CloseHandle(ol.hEvent);
return -1;
}
DWORD num_written;
if (GetOverlappedResult(m_file_handle, &ol, &num_written, true) == 0)
{
ec.assign(GetLastError(), get_system_category());
DWORD last_error = GetLastError();
TORRENT_ASSERT(last_error != ERROR_CANT_WAIT);
ec.assign(last_error, get_system_category());
CloseHandle(ol.hEvent);
return -1;
}