From 71653be7f04dd7539d54c501e43812b80d003eea Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Thu, 10 Jan 2013 03:22:49 +0000 Subject: [PATCH] merged ERROR_CANT_WAIT patch from RC_0_16 --- ChangeLog | 1 + src/file.cpp | 33 +++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 939b7bb87..4dd679faf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/src/file.cpp b/src/file.cpp index 7b9d7818e..a72e0fd34 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -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; }