You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2001/10/25 18:26:39 UTC
cvs commit: xml-xerces/c/src/util/NetAccessors/WinSock BinHTTPURLInputStream.cpp BinHTTPURLInputStream.hpp
tng 01/10/25 09:26:39
Modified: c/src/util/NetAccessors/WinSock BinHTTPURLInputStream.cpp
BinHTTPURLInputStream.hpp
Log:
[Bug 4213] BinHTTPURLInputStream initialisation not thread safe. By Mark Weaver.
Revision Changes Path
1.11 +27 -6 xml-xerces/c/src/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp
Index: BinHTTPURLInputStream.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/util/NetAccessors/WinSock/BinHTTPURLInputStream.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- BinHTTPURLInputStream.cpp 2001/10/25 16:10:46 1.10
+++ BinHTTPURLInputStream.cpp 2001/10/25 16:26:39 1.11
@@ -56,6 +56,9 @@
/*
* $Log: BinHTTPURLInputStream.cpp,v $
+ * Revision 1.11 2001/10/25 16:26:39 tng
+ * [Bug 4213] BinHTTPURLInputStream initialisation not thread safe. By Mark Weaver.
+ *
* Revision 1.10 2001/10/25 16:10:46 tng
* [Bug 4121] BinHTTPUrlInputStream needds to read entire HTTP header. By John Clayton.
*
@@ -112,6 +115,8 @@
#include <string.h>
#include <stdlib.h>
+
+#include <util/PlatformUtils.hpp>
#include <util/XMLNetAccessor.hpp>
#include <util/NetAccessors/WinSock/BinHTTPURLInputStream.hpp>
#include <util/XMLString.hpp>
@@ -134,12 +139,12 @@
LPFN_WSACLEANUP gWSACleanup = NULL;
bool BinHTTPURLInputStream::fInitialized = false;
+XMLMutex* BinHTTPURLInputStream::fInitMutex = 0;
void BinHTTPURLInputStream::Initialize() {
//
// Initialize the WinSock library here.
//
- fInitialized = true;
WORD wVersionRequested;
WSADATA wsaData;
@@ -189,6 +194,7 @@
// Call WSAGetLastError() to get the last error.
ThrowXML(NetAccessorException, XMLExcepts::NetAcc_InitFailed);
}
+ fInitialized = true;
}
void BinHTTPURLInputStream::Cleanup() {
@@ -208,7 +214,9 @@
gWSshutdown = NULL;
gWSclosesocket = NULL;
FreeLibrary(gWinsockLib);
- fInitialized = false;
+ fInitialized = false;
+ delete fInitMutex;
+ fInitMutex = 0;
}
}
@@ -268,10 +276,23 @@
: fSocketHandle(0)
, fBytesProcessed(0)
{
- if(!fInitialized)
- {
- Initialize();
- }
+ if(!fInitialized)
+ {
+ if (!fInitMutex)
+ {
+ XMLMutex* tmpMutex = new XMLMutex;
+ if (XMLPlatformUtils::compareAndSwap((void**)&fInitMutex, tmpMutex, 0))
+ {
+ // Someone beat us to it, so let's clean up ours
+ delete tmpMutex;
+ }
+ }
+ XMLMutexLock lock(fInitMutex);
+ if (!fInitialized)
+ {
+ Initialize();
+ }
+ }
//
// Pull all of the parts of the URL out of th urlSource object, and transcode them
1.5 +9 -2 xml-xerces/c/src/util/NetAccessors/WinSock/BinHTTPURLInputStream.hpp
Index: BinHTTPURLInputStream.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/util/NetAccessors/WinSock/BinHTTPURLInputStream.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- BinHTTPURLInputStream.hpp 2001/01/22 16:43:39 1.4
+++ BinHTTPURLInputStream.hpp 2001/10/25 16:26:39 1.5
@@ -56,6 +56,9 @@
/*
* $Log: BinHTTPURLInputStream.hpp,v $
+ * Revision 1.5 2001/10/25 16:26:39 tng
+ * [Bug 4213] BinHTTPURLInputStream initialisation not thread safe. By Mark Weaver.
+ *
* Revision 1.4 2001/01/22 16:43:39 tng
* Loads winsock dynamically. Fixed by Curt Arnold.
* Winsock2 is not initialized unless an http URL is used. If an http
@@ -89,7 +92,7 @@
#include <util/XMLURL.hpp>
#include <util/XMLExceptMsgs.hpp>
#include <util/BinInputStream.hpp>
-
+#include <util/Mutexes.hpp>
//
@@ -140,7 +143,8 @@
char fBuffer[4000];
char * fBufferEnd;
char * fBufferPos;
- static bool fInitialized;
+ static bool fInitialized;
+ static XMLMutex* fInitMutex;
static void Initialize();
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org