diff options
Diffstat (limited to 'nsprpub/pr/src/md/windows')
-rw-r--r-- | nsprpub/pr/src/md/windows/ntthread.c | 23 | ||||
-rw-r--r-- | nsprpub/pr/src/md/windows/w95sock.c | 5 | ||||
-rw-r--r-- | nsprpub/pr/src/md/windows/w95thred.c | 51 | ||||
-rw-r--r-- | nsprpub/pr/src/md/windows/win32_errors.c | 8 |
4 files changed, 87 insertions, 0 deletions
diff --git a/nsprpub/pr/src/md/windows/ntthread.c b/nsprpub/pr/src/md/windows/ntthread.c index fead1236d..1fdf0e93b 100644 --- a/nsprpub/pr/src/md/windows/ntthread.c +++ b/nsprpub/pr/src/md/windows/ntthread.c @@ -27,6 +27,9 @@ PRUint32 _nt_idleCount; extern __declspec(thread) PRThread *_pr_io_restarted_io; extern DWORD _pr_io_restartedIOIndex; +typedef HRESULT (WINAPI *SETTHREADDESCRIPTION)(HANDLE, PCWSTR); +static SETTHREADDESCRIPTION sSetThreadDescription = NULL; + /* Must check the restarted_io *before* decrementing no_sched to 0 */ #define POST_SWITCH_WORK() \ PR_BEGIN_MACRO \ @@ -79,6 +82,8 @@ _nt_handle_restarted_io(PRThread *restarted_io) void _PR_MD_EARLY_INIT() { + HMODULE hModule; + _MD_NEW_LOCK( &_nt_idleLock ); _nt_idleCount = 0; PR_INIT_CLIST(&_nt_idleList); @@ -98,6 +103,15 @@ _PR_MD_EARLY_INIT() _pr_intsOffIndex = TlsAlloc(); _pr_io_restartedIOIndex = TlsAlloc(); } + + // SetThreadDescription is Windows 10 build 1607+ + hModule = GetModuleHandleW(L"kernel32.dll"); + if (hModule) { + sSetThreadDescription = + (SETTHREADDESCRIPTION) GetProcAddress( + hModule, + "SetThreadDescription"); + } } void _PR_MD_CLEANUP_BEFORE_EXIT(void) @@ -293,7 +307,16 @@ _PR_MD_SET_CURRENT_THREAD_NAME(const char *name) { #ifdef _MSC_VER THREADNAME_INFO info; +#endif + + if (sSetThreadDescription) { + WCHAR wideName[MAX_PATH]; + if (MultiByteToWideChar(CP_ACP, 0, name, -1, wideName, MAX_PATH)) { + sSetThreadDescription(GetCurrentThread(), wideName); + } + } +#ifdef _MSC_VER if (!IsDebuggerPresent()) return; diff --git a/nsprpub/pr/src/md/windows/w95sock.c b/nsprpub/pr/src/md/windows/w95sock.c index 0429c655a..c6a3ec111 100644 --- a/nsprpub/pr/src/md/windows/w95sock.c +++ b/nsprpub/pr/src/md/windows/w95sock.c @@ -382,6 +382,11 @@ PRInt32 _PR_MD_TCPSENDTO(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags, const PRNetAddr *addr, PRUint32 addrlen, PRIntervalTime timeout) { + if (!_fd_waiting_for_overlapped_done_lock) { + PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); + return PR_FAILURE; + } + if (PR_CallOnce(&_pr_has_connectex_once, _pr_set_connectex) != PR_SUCCESS) { PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); return PR_FAILURE; diff --git a/nsprpub/pr/src/md/windows/w95thred.c b/nsprpub/pr/src/md/windows/w95thred.c index c27d982a7..a365411f5 100644 --- a/nsprpub/pr/src/md/windows/w95thred.c +++ b/nsprpub/pr/src/md/windows/w95thred.c @@ -1,3 +1,4 @@ + /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -27,14 +28,32 @@ DWORD _pr_currentCPUIndex; int _pr_intsOff = 0; _PRInterruptTable _pr_interruptTable[] = { { 0 } }; +typedef HRESULT (WINAPI *SETTHREADDESCRIPTION)(HANDLE, PCWSTR); +static SETTHREADDESCRIPTION sSetThreadDescription = NULL; + void _PR_MD_EARLY_INIT() { + HMODULE hModule; + #ifndef _PR_USE_STATIC_TLS _pr_currentThreadIndex = TlsAlloc(); _pr_lastThreadIndex = TlsAlloc(); _pr_currentCPUIndex = TlsAlloc(); #endif + +#if defined(_WIN64) && defined(WIN95) + _fd_waiting_for_overlapped_done_lock = PR_NewLock(); +#endif + + // SetThreadDescription is Windows 10 build 1607+ + hModule = GetModuleHandleW(L"kernel32.dll"); + if (hModule) { + sSetThreadDescription = + (SETTHREADDESCRIPTION) GetProcAddress( + hModule, + "SetThreadDescription"); + } } void _PR_MD_CLEANUP_BEFORE_EXIT(void) @@ -50,6 +69,29 @@ void _PR_MD_CLEANUP_BEFORE_EXIT(void) TlsFree(_pr_lastThreadIndex); TlsFree(_pr_currentCPUIndex); #endif + +#if defined(_WIN64) && defined(WIN95) + // For each iteration check if TFO overlapped IOs are down. + if (_fd_waiting_for_overlapped_done_lock) { + PRIntervalTime delay = PR_MillisecondsToInterval(1000); + PRFileDescList *cur; + do { + CheckOverlappedPendingSocketsAreDone(); + + PR_Lock(_fd_waiting_for_overlapped_done_lock); + cur = _fd_waiting_for_overlapped_done; + PR_Unlock(_fd_waiting_for_overlapped_done_lock); +#if defined(DO_NOT_WAIT_FOR_CONNECT_OVERLAPPED_OPERATIONS) + cur = NULL; +#endif + if (cur) { + PR_Sleep(delay); // wait another 1s. + } + } while (cur); + + PR_DestroyLock(_fd_waiting_for_overlapped_done_lock); + } +#endif } PRStatus @@ -190,7 +232,16 @@ _PR_MD_SET_CURRENT_THREAD_NAME(const char *name) { #ifdef _MSC_VER THREADNAME_INFO info; +#endif + + if (sSetThreadDescription) { + WCHAR wideName[MAX_PATH]; + if (MultiByteToWideChar(CP_ACP, 0, name, -1, wideName, MAX_PATH)) { + sSetThreadDescription(GetCurrentThread(), wideName); + } + } +#ifdef _MSC_VER if (!IsDebuggerPresent()) return; diff --git a/nsprpub/pr/src/md/windows/win32_errors.c b/nsprpub/pr/src/md/windows/win32_errors.c index d26820a7a..275792187 100644 --- a/nsprpub/pr/src/md/windows/win32_errors.c +++ b/nsprpub/pr/src/md/windows/win32_errors.c @@ -166,21 +166,26 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_ADDRESS_IN_USE_ERROR; break; case WSAEADDRNOTAVAIL: + case ERROR_INVALID_NETNAME: prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break; case WSAEAFNOSUPPORT: + case ERROR_INCORRECT_ADDRESS: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; case WSAEALREADY: + case ERROR_ALREADY_INITIALIZED: prError = PR_ALREADY_INITIATED_ERROR; break; case WSAEBADF: prError = PR_BAD_DESCRIPTOR_ERROR; break; case WSAECONNABORTED: + case ERROR_CONNECTION_ABORTED: prError = PR_CONNECT_ABORTED_ERROR; break; case WSAECONNREFUSED: + case ERROR_CONNECTION_REFUSED: prError = PR_CONNECT_REFUSED_ERROR; break; case WSAECONNRESET: @@ -193,6 +198,7 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_ACCESS_FAULT_ERROR; break; case WSAEHOSTUNREACH: + case ERROR_HOST_UNREACHABLE: prError = PR_HOST_UNREACHABLE_ERROR; break; case WSAEINVAL: @@ -208,12 +214,14 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_BUFFER_OVERFLOW_ERROR; break; case WSAENETDOWN: + case ERROR_NO_NETWORK: prError = PR_NETWORK_DOWN_ERROR; break; case WSAENETRESET: prError = PR_CONNECT_ABORTED_ERROR; break; case WSAENETUNREACH: + case ERROR_NETWORK_UNREACHABLE: prError = PR_NETWORK_UNREACHABLE_ERROR; break; case WSAENOBUFS: |