wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src thread.cpp


From: David White
Subject: [Wesnoth-cvs-commits] wesnoth/src thread.cpp
Date: Thu, 02 Jun 2005 20:44:28 -0400

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     David White <address@hidden>    05/06/03 00:44:28

Modified files:
        src            : thread.cpp 

Log message:
        fixed problem with network threads deadlocking

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/thread.cpp.diff?tr1=1.6&tr2=1.7&r1=text&r2=text

Patches:
Index: wesnoth/src/thread.cpp
diff -u wesnoth/src/thread.cpp:1.6 wesnoth/src/thread.cpp:1.7
--- wesnoth/src/thread.cpp:1.6  Thu Jun  2 23:58:01 2005
+++ wesnoth/src/thread.cpp      Fri Jun  3 00:44:28 2005
@@ -2,6 +2,7 @@
 
 #include "thread.hpp"
 
+#include <new>
 #include <iostream>
 #include <vector>
 
@@ -25,6 +26,7 @@
                delete op;
        }
 
+
        return 0;
 }
 
@@ -130,21 +132,37 @@
 
 async_operation::RESULT async_operation::execute(waiter& wait)
 {
-       const lock l(get_mutex());
-       thread t(run_async_operation,this);
+       //the thread must be created after the lock, and also destroyed after 
it.
+       //this is because during the thread's execution, we must always hold 
the mutex
+       //unless we are waiting on notification that the thread is finished, or 
we have
+       //already received that notification.
+       //
+       //we cannot hold the mutex while waiting for the thread to join though, 
because
+       //the thread needs access to the mutex before it terminates
+       std::auto_ptr<thread> t(NULL);
+       {
+               const lock l(get_mutex());
+               t = std::auto_ptr<thread>(new thread(run_async_operation,this));
+
+               bool completed = false;
+               while(wait.process() == waiter::WAIT) {
+                       const condition::WAIT_TIMEOUT_RESULT res = 
finished_.wait_timeout(get_mutex(),20);
+                       if(res == condition::WAIT_OK) {
+                               completed = true;
+                               break;
+                       } else if(res == condition::WAIT_ERROR) {
+                               break;
+                       }
+               }
 
-       while(wait.process() == waiter::WAIT) {
-               const condition::WAIT_TIMEOUT_RESULT res = 
finished_.wait_timeout(get_mutex(),20);
-               if(res == condition::WAIT_OK) {
-                       return COMPLETED;
-               } else if(res == condition::WAIT_ERROR) {
-                       break;
+               if(!completed) {
+                       aborted_ = true;
+                       t->detach();
+                       return ABORTED;
                }
        }
 
-       aborted_ = true;
-       t.detach();
-       return ABORTED;
+       return COMPLETED;
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]