From 848958113b7c39ca87c32de36716c2a4f2d86457 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov <borisk@apache.org> Date: Tue, 11 Mar 2008 15:54:37 +0000 Subject: [PATCH] Lock the mutex when parforming cleanup in the WinSock net accessor git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@635984 13f79535-47bb-0310-9956-ffa450edef68 --- .../WinSock/BinHTTPURLInputStream.cpp | 137 ++++++++++-------- .../WinSock/WinSockNetAccessor.cpp | 2 +- 2 files changed, 74 insertions(+), 65 deletions(-) diff --git a/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp b/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp index e2c65d502..24b4097b7 100644 --- a/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp +++ b/src/xercesc/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp @@ -176,68 +176,74 @@ private : bool BinHTTPURLInputStream::fInitialized = false; -void BinHTTPURLInputStream::Initialize(MemoryManager* const manager) { +void BinHTTPURLInputStream::Initialize(MemoryManager* const manager) +{ // // Initialize the WinSock library here. // WORD wVersionRequested; WSADATA wsaData; - LPFN_WSASTARTUP startup = NULL; - if(gWinsockLib == NULL) { + LPFN_WSASTARTUP startup = NULL; + if(gWinsockLib == NULL) + { #ifdef WITH_IPV6 - gWinsockLib = LoadLibraryA("WS2_32"); + gWinsockLib = LoadLibraryA("WS2_32"); #else - gWinsockLib = LoadLibraryA("WSOCK32"); + gWinsockLib = LoadLibraryA("WSOCK32"); #endif - if(gWinsockLib == NULL) { - ThrowXMLwithMemMgr(NetAccessorException, XMLExcepts::NetAcc_InitFailed, manager); - } - else { - startup = (LPFN_WSASTARTUP) GetProcAddress(gWinsockLib,"WSAStartup"); - gWSACleanup = (LPFN_WSACLEANUP) GetProcAddress(gWinsockLib,"WSACleanup"); - gWShtons = (LPFN_HTONS) GetProcAddress(gWinsockLib,"htons"); - gWSsocket = (LPFN_SOCKET) GetProcAddress(gWinsockLib,"socket"); - gWSconnect = (LPFN_CONNECT) GetProcAddress(gWinsockLib,"connect"); - gWSsend = (LPFN_SEND) GetProcAddress(gWinsockLib,"send"); - gWSrecv = (LPFN_RECV) GetProcAddress(gWinsockLib,"recv"); - gWSshutdown = (LPFN_SHUTDOWN) GetProcAddress(gWinsockLib,"shutdown"); - gWSclosesocket = (LPFN_CLOSESOCKET) GetProcAddress(gWinsockLib,"closesocket"); + if(gWinsockLib == NULL) + { + ThrowXMLwithMemMgr(NetAccessorException, XMLExcepts::NetAcc_InitFailed, manager); + } + else + { + startup = (LPFN_WSASTARTUP) GetProcAddress(gWinsockLib,"WSAStartup"); + gWSACleanup = (LPFN_WSACLEANUP) GetProcAddress(gWinsockLib,"WSACleanup"); + gWShtons = (LPFN_HTONS) GetProcAddress(gWinsockLib,"htons"); + gWSsocket = (LPFN_SOCKET) GetProcAddress(gWinsockLib,"socket"); + gWSconnect = (LPFN_CONNECT) GetProcAddress(gWinsockLib,"connect"); + gWSsend = (LPFN_SEND) GetProcAddress(gWinsockLib,"send"); + gWSrecv = (LPFN_RECV) GetProcAddress(gWinsockLib,"recv"); + gWSshutdown = (LPFN_SHUTDOWN) GetProcAddress(gWinsockLib,"shutdown"); + gWSclosesocket = (LPFN_CLOSESOCKET) GetProcAddress(gWinsockLib,"closesocket"); #ifdef WITH_IPV6 - gWSgetaddrinfo = (LPFN_GETADDRINFO) GetProcAddress(gWinsockLib,"getaddrinfo"); - gWSfreeaddrinfo = (LPFN_FREEADDRINFO) GetProcAddress(gWinsockLib,"freeaddrinfo"); + gWSgetaddrinfo = (LPFN_GETADDRINFO) GetProcAddress(gWinsockLib,"getaddrinfo"); + gWSfreeaddrinfo = (LPFN_FREEADDRINFO) GetProcAddress(gWinsockLib,"freeaddrinfo"); #else - gWSgethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress(gWinsockLib,"gethostbyname"); - gWSgethostbyaddr = (LPFN_GETHOSTBYADDR) GetProcAddress(gWinsockLib,"gethostbyaddr"); - gWSinet_addr = (LPFN_INET_ADDR) GetProcAddress(gWinsockLib,"inet_addr"); + gWSgethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress(gWinsockLib,"gethostbyname"); + gWSgethostbyaddr = (LPFN_GETHOSTBYADDR) GetProcAddress(gWinsockLib,"gethostbyaddr"); + gWSinet_addr = (LPFN_INET_ADDR) GetProcAddress(gWinsockLib,"inet_addr"); #endif - if(startup == NULL - || gWSACleanup == NULL - || gWShtons == NULL - || gWSsocket == NULL - || gWSconnect == NULL - || gWSsend == NULL - || gWSrecv == NULL - || gWSshutdown == NULL - || gWSclosesocket == NULL + if(startup == NULL + || gWSACleanup == NULL + || gWShtons == NULL + || gWSsocket == NULL + || gWSconnect == NULL + || gWSsend == NULL + || gWSrecv == NULL + || gWSshutdown == NULL + || gWSclosesocket == NULL #ifdef WITH_IPV6 - || gWSgetaddrinfo == NULL - || gWSfreeaddrinfo == NULL + || gWSgetaddrinfo == NULL + || gWSfreeaddrinfo == NULL #else - || gWSgethostbyname == NULL - || gWSgethostbyaddr == NULL - || gWSinet_addr == NULL + || gWSgethostbyname == NULL + || gWSgethostbyaddr == NULL + || gWSinet_addr == NULL #endif - ) - { - gWSACleanup = NULL; - Cleanup(); - ThrowXMLwithMemMgr(NetAccessorException, XMLExcepts::NetAcc_InitFailed, manager); - } - } - } + ) + { + gWSACleanup = NULL; + Cleanup(); + ThrowXMLwithMemMgr(NetAccessorException, XMLExcepts::NetAcc_InitFailed, manager); + } + } + } + wVersionRequested = MAKEWORD( 2, 2 ); + int err = (*startup)(wVersionRequested, &wsaData); if (err != 0) { @@ -247,31 +253,34 @@ void BinHTTPURLInputStream::Initialize(MemoryManager* const manager) { fInitialized = true; } -void BinHTTPURLInputStream::Cleanup() { - if(fInitialized) - { - if(gWSACleanup) (*gWSACleanup)(); - gWSACleanup = NULL; - FreeLibrary(gWinsockLib); - gWinsockLib = NULL; - gWShtons = NULL; - gWSsocket = NULL; - gWSconnect = NULL; - gWSsend = NULL; - gWSrecv = NULL; - gWSshutdown = NULL; - gWSclosesocket = NULL; +void BinHTTPURLInputStream::Cleanup() +{ + XMLMutexLock lock(XMLPlatformUtils::fgAtomicMutex); + + if(fInitialized) + { + if(gWSACleanup) (*gWSACleanup)(); + gWSACleanup = NULL; + FreeLibrary(gWinsockLib); + gWinsockLib = NULL; + gWShtons = NULL; + gWSsocket = NULL; + gWSconnect = NULL; + gWSsend = NULL; + gWSrecv = NULL; + gWSshutdown = NULL; + gWSclosesocket = NULL; #ifdef WITH_IPV6 - gWSgetaddrinfo = NULL; + gWSgetaddrinfo = NULL; gWSfreeaddrinfo = NULL; #else - gWSgethostbyname = NULL; - gWSgethostbyaddr = NULL; - gWSinet_addr = NULL; + gWSgethostbyname = NULL; + gWSgethostbyaddr = NULL; + gWSinet_addr = NULL; #endif fInitialized = false; - } + } } diff --git a/src/xercesc/util/NetAccessors/WinSock/WinSockNetAccessor.cpp b/src/xercesc/util/NetAccessors/WinSock/WinSockNetAccessor.cpp index 9d6435354..4ebdada31 100644 --- a/src/xercesc/util/NetAccessors/WinSock/WinSockNetAccessor.cpp +++ b/src/xercesc/util/NetAccessors/WinSock/WinSockNetAccessor.cpp @@ -48,7 +48,7 @@ WinSockNetAccessor::WinSockNetAccessor() WinSockNetAccessor::~WinSockNetAccessor() { // Cleanup code for the WinSock library here. - BinHTTPURLInputStream::Cleanup(); + BinHTTPURLInputStream::Cleanup(); } -- GitLab