Browse Source

fixed ThreadDispatcher deadlocks
removed mywait workaround

dmuratshin 9 years ago
parent
commit
ed57260295
2 changed files with 48 additions and 59 deletions
  1. 45 57
      oxygine/src/core/ThreadDispatcher.cpp
  2. 3 2
      oxygine/src/core/ThreadDispatcher.h

+ 45 - 57
oxygine/src/core/ThreadDispatcher.cpp

@@ -31,19 +31,23 @@ namespace oxygine
 
     void mywait(pthread_cond_t* cond, pthread_mutex_t* mutex)
     {
-#ifdef __S3E__
+        /*
+        #ifdef __S3E__
         timespec ts;
         clock_gettime(CLOCK_REALTIME, &ts);
         addtime(ts, 300);
         pthread_cond_timedwait(cond, mutex, &ts);
-#elif __ANDROID__
+        #elif __ANDROID__
         timespec ts;
         clock_gettime(CLOCK_REALTIME, &ts);
         addtime(ts, 500);
         pthread_cond_timedwait(cond, mutex, &ts);
-#else
+        #else
+        pthread_cond_wait(cond, mutex);
+        #endif
+        */
+
         pthread_cond_wait(cond, mutex);
-#endif
     }
 
 
@@ -92,27 +96,23 @@ namespace oxygine
     }
 
     void ThreadDispatcher::get(message& ev)
-    {
-        MutexPthreadLock lock(_mutex);
-        LOGDN("get");
-
-        _waitMessage();
-        _popMessage(ev);
-    }
-
-
-    void ThreadDispatcher::get2(message& ev)
     {
         {
             MutexPthreadLock lock(_mutex);
-            LOGDN("get2");
+            LOGDN("get");
+
             _waitMessage();
 
             _last = _events.front();
             _events.erase(_events.begin());
+            ev = _last;
         }
+        _runCallbacks();
+    }
 
 
+    void ThreadDispatcher::_runCallbacks()
+    {
         if (_last.cb)
         {
             LOGDN("running callback for id=%d", _last._id);
@@ -128,7 +128,6 @@ namespace oxygine
             _last.cbFunction = std::function< void() >();
         }
 #endif
-
     }
 
 
@@ -157,29 +156,7 @@ namespace oxygine
         _last = _events.front();
         _events.erase(_events.begin());
 
-        if (_last.cb)
-        {
-            LOGDN("running callback for id=%d", _last._id);
-            _last.cb(_last);
-            _last.cb = 0;
-        }
-
-#ifndef __S3E__
-        if (_last.cbFunction)
-        {
-            LOGDN("running callback function for id=%d", _last._id);
-            _last.cbFunction();
-            _last.cbFunction = std::function< void() >();
-        }
-#endif
-
         LOGDN("_gotMessage id=%d, msgid=%d", _last._id, _last.msgid);
-
-        if (!_last.msgid)
-        {
-            _replyLast(0);
-        }
-
         res = _last;
     }
 
@@ -189,24 +166,28 @@ namespace oxygine
             return false;
 
 
-        MutexPthreadLock lock(_mutex);
-        if (ev.num == -1)
-            ev.num = (int) _events.size();
+        bool ret = false;
+        {
+            MutexPthreadLock lock(_mutex);
+            if (ev.num == -1)
+                ev.num = (int)_events.size();
 
-        LOGDN("peeking message");
+            LOGDN("peeking message");
 
-        _replyLast(0);
-
-        if (!_events.empty() && ev.num > 0)
-        {
-            if (del)
-                _popMessage(ev);
-            ev.num--;
+            _replyLast(0);
 
-            return true;
+            if (!_events.empty() && ev.num > 0)
+            {
+                if (del)
+                    _popMessage(ev);
+                ev.num--;
+                ret = true;
+            }
         }
 
-        return false;
+        _runCallbacks();
+
+        return ret;
     }
 
     void ThreadDispatcher::_replyLast(void* val)
@@ -243,6 +224,7 @@ namespace oxygine
     void ThreadDispatcher::reply(void* val)
     {
         MutexPthreadLock lock(_mutex);
+        OX_ASSERT(_last.need_reply);
         _replyLast(val);
     }
 
@@ -265,7 +247,6 @@ namespace oxygine
     void ThreadDispatcher::sendCallback(void* arg1, void* arg2, callback cb, void* cbData)
     {
         message ev;
-        ev.msgid = 0;
         ev.arg1 = arg1;
         ev.arg2 = arg2;
         ev.cb = cb;
@@ -318,6 +299,18 @@ namespace oxygine
         _pushMessage(ev);
     }
 
+    void ThreadDispatcher::postCallback(void* arg1, void* arg2, callback cb, void* cbData)
+    {
+        message ev;
+        ev.arg1 = arg1;
+        ev.arg2 = arg2;
+        ev.cb = cb;
+        ev.cbData = cbData;
+
+        MutexPthreadLock lock(_mutex);
+        _pushMessage(ev);
+    }
+
     void ThreadDispatcher::removeCallback(int msgid, callback cb, void* cbData)
     {
         MutexPthreadLock lock(_mutex);
@@ -336,11 +329,6 @@ namespace oxygine
     void ThreadDispatcher::postCallback(const std::function<void()>& f)
     {
         message ev;
-        ev.msgid = 0;
-        ev.arg1 = 0;
-        ev.arg2 = 0;
-        ev.cb = 0;
-        ev.cbData = 0;
         ev.cbFunction = f;
 
         MutexPthreadLock lock(_mutex);

+ 3 - 2
oxygine/src/core/ThreadDispatcher.h

@@ -66,8 +66,6 @@ namespace oxygine
         //blocking
         void get(message& ev);
 
-        //test
-        void get2(message& ev);
 
         bool peek(peekMessage& ev, bool del);
         void clear();
@@ -87,6 +85,7 @@ namespace oxygine
         void post(int msgid, void* arg1, void* arg2);
         //async, sends post callback
         void postCallback(int msgid, void* arg1, void* arg2, callback cb, void* cbData);
+        void postCallback(void* arg1, void* arg2, callback cb, void* cbData);
 #ifndef __S3E__
         //async, sends post callback
         void postCallback(const std::function<void()>&);
@@ -100,6 +99,8 @@ namespace oxygine
         void _waitMessage();
         void _waitReply(int id);
 
+        void _runCallbacks();
+
         void _pushMessage(message&);
         void _pushMessageWaitReply(message&);
         void _popMessage(message&);