Browse Source

Vielleicht ein seltener fehler behoben

Kolja Strohm 5 years ago
parent
commit
215d3608c5
3 changed files with 33 additions and 5 deletions
  1. 17 5
      Critical.cpp
  2. 12 0
      Thread.cpp
  3. 4 0
      Thread.h

+ 17 - 5
Critical.cpp

@@ -26,9 +26,11 @@ Critical::~Critical()
 void Critical::lock()
 {
     pthread_t t = GetCurrentThread();
+    getThreadRegister()->lock();
     Thread *tmp = getThreadRegister()->zThread( t );
     if( tmp )
         tmp->addCriticalLock();
+    getThreadRegister()->unlock();
     EnterCriticalSection( &cs );
     if( !owner )
         owner = tmp;
@@ -39,10 +41,12 @@ void Critical::lock()
 bool Critical::tryLock()
 {
     if( lockCount > 0 )
-        return false;
+        return false; 
+    getThreadRegister()->lock();
     Thread *tmp = getThreadRegister()->zThread( GetCurrentThread() );
     if( tmp )
         tmp->addCriticalLock();
+    getThreadRegister()->unlock();
     EnterCriticalSection( &cs );
     if( !owner )
         owner = tmp;
@@ -53,14 +57,22 @@ bool Critical::tryLock()
 // entsperrt das Objekt
 void Critical::unlock()
 {
-    if( owner && GetThreadId( owner->getThreadHandle() ) != GetThreadId( GetCurrentThread() ) )
-        throw std::runtime_error( "A Thread that does not own a Critical Object trys to unlock it" );
-    Thread *tmp = owner;
+    getThreadRegister()->lock();
+    Thread *tmp = 0;
+    if( getThreadRegister()->isThread( owner ) )
+    {
+        if( owner && GetThreadId( owner->getThreadHandle() ) != GetThreadId( GetCurrentThread() ) )
+            throw std::runtime_error( "A Thread that does not own a Critical Object trys to unlock it" );
+        tmp = owner;
+    }
+    getThreadRegister()->unlock();
     if( !--lockCount )
         owner = 0;
     LeaveCriticalSection( &cs );
-    if( tmp )
+    getThreadRegister()->lock();
+    if( tmp && getThreadRegister()->isThread( tmp ) )
         tmp->removeCriticalLock();
+    getThreadRegister()->unlock();
 }
 
 

+ 12 - 0
Thread.cpp

@@ -254,6 +254,18 @@ Thread *ThreadRegister::zThread( pthread_t handle )
     return 0;
 }
 
+// sperrt das register
+void ThreadRegister::lock()
+{
+    EnterCriticalSection( &cs );
+}
+
+// entsperrt das register
+void ThreadRegister::unlock()
+{
+    LeaveCriticalSection( &cs );
+}
+
 // Löscht die bereits beendetetn Threads und gibt ihre Reccourcen wieder frei
 void ThreadRegister::cleanUpClosedThreads()
 {

+ 4 - 0
Thread.h

@@ -101,6 +101,10 @@ namespace Framework
         // Setzt Wird automatisch aufgerufen, wenn ein Thread beendet wird. Die Reccourcen werden daraufhin in cleanUpClosedThreads freigegeben.
         //  handle: Das Handle des Threads
         void addClosedThread( pthread_t handle );
+        // sperrt das register
+        void lock();
+        // entsperrt das register
+        void unlock();
         // Löscht die bereits beendetetn Threads und gibt ihre Reccourcen wieder frei
         __declspec( dllexport ) void cleanUpClosedThreads();
     };