changeset 12:005587986965 draft

CCriticalSection using wxWidgets instead of Windows OS calls git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@19 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
date Thu, 29 Oct 2009 05:55:56 +0000
parents aabb318698b9
children a17d69eac18f
files net.h util.cpp util.h
diffstat 3 files changed, 35 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/net.h
+++ b/net.h
@@ -604,7 +604,7 @@
 
     void BeginMessage(const char* pszCommand)
     {
-        EnterCriticalSection(&cs_vSend);
+        cs_vSend.Enter();
         if (nPushPos != -1)
             AbortMessage();
         nPushPos = vSend.size();
@@ -618,7 +618,7 @@
             return;
         vSend.resize(nPushPos);
         nPushPos = -1;
-        LeaveCriticalSection(&cs_vSend);
+        cs_vSend.Leave();
         printf("(aborted)\n");
     }
 
@@ -643,7 +643,7 @@
         printf("\n");
 
         nPushPos = -1;
-        LeaveCriticalSection(&cs_vSend);
+        cs_vSend.Leave();
     }
 
     void EndMessageAbortIfEmpty()
--- a/util.cpp
+++ b/util.cpp
@@ -13,14 +13,14 @@
 
 
 // Init openssl library multithreading support
-static HANDLE* lock_cs;
+static wxMutex** ppmutexOpenSSL;
 
-void win32_locking_callback(int mode, int type, const char* file, int line)
+void win32_locking_callback(int mode, int i, const char* file, int line)
 {
     if (mode & CRYPTO_LOCK)
-        WaitForSingleObject(lock_cs[type], INFINITE);
+        ppmutexOpenSSL[i]->Lock();
     else
-        ReleaseMutex(lock_cs[type]);
+        ppmutexOpenSSL[i]->Unlock();
 }
 
 // Init
@@ -30,9 +30,9 @@
     CInit()
     {
         // Init openssl library multithreading support
-        lock_cs = (HANDLE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
+        ppmutexOpenSSL = (wxMutex**)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(wxMutex*));
         for (int i = 0; i < CRYPTO_num_locks(); i++)
-            lock_cs[i] = CreateMutex(NULL,FALSE,NULL);
+            ppmutexOpenSSL[i] = new wxMutex();
         CRYPTO_set_locking_callback(win32_locking_callback);
 
         // Seed random number generator with screen scrape and other hardware sources
@@ -46,8 +46,8 @@
         // Shutdown openssl library multithreading support
         CRYPTO_set_locking_callback(NULL);
         for (int i =0 ; i < CRYPTO_num_locks(); i++)
-            CloseHandle(lock_cs[i]);
-        OPENSSL_free(lock_cs);
+            delete ppmutexOpenSSL[i];
+        OPENSSL_free(ppmutexOpenSSL);
     }
 }
 instance_of_cinit;
@@ -55,6 +55,10 @@
 
 
 
+
+
+
+
 void RandAddSeed()
 {
     // Seed with CPU performance counter
--- a/util.h
+++ b/util.h
@@ -106,28 +106,38 @@
 // Could use wxCriticalSection for portability, but it doesn't support TryEnterCriticalSection
 class CCriticalSection
 {
+#ifdef __WXMSW__
 protected:
     CRITICAL_SECTION cs;
 public:
-    char* pszFile;
-    int nLine;
     explicit CCriticalSection() { InitializeCriticalSection(&cs); }
     ~CCriticalSection() { DeleteCriticalSection(&cs); }
     void Enter() { EnterCriticalSection(&cs); }
     void Leave() { LeaveCriticalSection(&cs); }
     bool TryEnter() { return TryEnterCriticalSection(&cs); }
-    CRITICAL_SECTION* operator&() { return &cs; }
+#else
+protected:
+    wxMutex mutex;
+public:
+    explicit CCriticalSection() { }
+    ~CCriticalSection() { }
+    void Enter() { mutex.Lock(); }
+    void Leave() { mutex.Unlock(); }
+    bool TryEnter() { return mutex.TryLock() == wxMUTEX_NO_ERROR; }
+#endif
+public:
+    char* pszFile;
+    int nLine;
 };
 
 // Automatically leave critical section when leaving block, needed for exception safety
 class CCriticalBlock
 {
 protected:
-    CRITICAL_SECTION* pcs;
+    CCriticalSection* pcs;
 public:
-    CCriticalBlock(CRITICAL_SECTION& csIn) { pcs = &csIn; EnterCriticalSection(pcs); }
-    CCriticalBlock(CCriticalSection& csIn) { pcs = &csIn; EnterCriticalSection(pcs); }
-    ~CCriticalBlock() { LeaveCriticalSection(pcs); }
+    CCriticalBlock(CCriticalSection& csIn) { pcs = &csIn; pcs->Enter(); }
+    ~CCriticalBlock() { pcs->Leave(); }
 };
 
 // WARNING: This will catch continue and break!
@@ -141,11 +151,10 @@
 class CTryCriticalBlock
 {
 protected:
-    CRITICAL_SECTION* pcs;
+    CCriticalSection* pcs;
 public:
-    CTryCriticalBlock(CRITICAL_SECTION& csIn) { pcs = (TryEnterCriticalSection(&csIn) ? &csIn : NULL); }
-    CTryCriticalBlock(CCriticalSection& csIn) { pcs = (TryEnterCriticalSection(&csIn) ? &csIn : NULL); }
-    ~CTryCriticalBlock() { if (pcs) LeaveCriticalSection(pcs); }
+    CTryCriticalBlock(CCriticalSection& csIn) { pcs = (csIn.TryEnter() ? &csIn : NULL); }
+    ~CTryCriticalBlock() { if (pcs) pcs->Leave(); }
     bool Entered() { return pcs != NULL; }
 };