|
|
@@ -65,6 +65,7 @@ namespace oxygine
|
|
|
|
|
|
ThreadDispatcher::ThreadDispatcher(): _id(0), _result(0)
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
pthread_cond_init(&_cond, 0);
|
|
|
|
|
|
pthread_mutexattr_t attr;
|
|
|
@@ -72,36 +73,44 @@ namespace oxygine
|
|
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
|
|
|
|
|
pthread_mutex_init(&_mutex, &attr);
|
|
|
-
|
|
|
+#endif
|
|
|
_events.reserve(10);
|
|
|
}
|
|
|
|
|
|
ThreadDispatcher::~ThreadDispatcher()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
pthread_mutex_destroy(&_mutex);
|
|
|
pthread_cond_destroy(&_cond);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::_waitMessage()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
_replyLast(0);
|
|
|
|
|
|
while (_events.empty())
|
|
|
pthread_cond_wait(&_cond, &_mutex);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::wait()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
_waitMessage();
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::get(message& ev)
|
|
|
{
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
LOGDN("get");
|
|
|
|
|
|
+#endif
|
|
|
_waitMessage();
|
|
|
|
|
|
_last = _events.front();
|
|
|
@@ -134,21 +143,28 @@ namespace oxygine
|
|
|
|
|
|
bool ThreadDispatcher::empty()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
+
|
|
|
bool v = _events.empty();
|
|
|
return v;
|
|
|
}
|
|
|
|
|
|
size_t ThreadDispatcher::size()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
size_t v = _events.size();
|
|
|
return v;
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::clear()
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_events.clear();
|
|
|
}
|
|
|
|
|
|
@@ -169,7 +185,9 @@ namespace oxygine
|
|
|
|
|
|
bool ret = false;
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
if (ev.num == -1)
|
|
|
ev.num = (int)_events.size();
|
|
|
|
|
|
@@ -200,8 +218,10 @@ namespace oxygine
|
|
|
{
|
|
|
LOGDN("replying to id=%d", _last._id);
|
|
|
|
|
|
+#ifndef OX_NO_MT
|
|
|
//pthread_cond_signal(&_cond);
|
|
|
pthread_cond_broadcast(&_cond);
|
|
|
+#endif
|
|
|
mywait(&_cond, &_mutex);
|
|
|
}
|
|
|
}
|
|
|
@@ -213,18 +233,24 @@ namespace oxygine
|
|
|
do
|
|
|
{
|
|
|
LOGDN("ThreadMessages::waiting reply... _replyingTo=%d myid=%d", _replyingTo, id);
|
|
|
+#ifndef OX_NO_MT
|
|
|
pthread_cond_signal(&_cond);
|
|
|
+#endif
|
|
|
mywait(&_cond, &_mutex);
|
|
|
}
|
|
|
while (_replyingTo != id);
|
|
|
|
|
|
_last.need_reply = false;
|
|
|
+#ifndef OX_NO_MT
|
|
|
pthread_cond_signal(&_cond);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::reply(void* val)
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
OX_ASSERT(_last.need_reply);
|
|
|
_replyLast(val);
|
|
|
}
|
|
|
@@ -239,7 +265,9 @@ namespace oxygine
|
|
|
ev.arg1 = arg1;
|
|
|
ev.arg2 = arg2;
|
|
|
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessageWaitReply(ev);
|
|
|
|
|
|
return _result;
|
|
|
@@ -253,7 +281,9 @@ namespace oxygine
|
|
|
ev.cb = cb;
|
|
|
ev.cbData = cbData;
|
|
|
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessageWaitReply(ev);
|
|
|
}
|
|
|
|
|
|
@@ -273,7 +303,9 @@ namespace oxygine
|
|
|
{
|
|
|
msg._id = ++_id;
|
|
|
_events.push_back(msg);
|
|
|
+#ifndef OX_NO_MT
|
|
|
pthread_cond_signal(&_cond);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::post(int msgid, void* arg1, void* arg2)
|
|
|
@@ -283,7 +315,9 @@ namespace oxygine
|
|
|
ev.arg1 = arg1;
|
|
|
ev.arg2 = arg2;
|
|
|
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessage(ev);
|
|
|
}
|
|
|
|
|
|
@@ -295,8 +329,9 @@ namespace oxygine
|
|
|
ev.arg2 = arg2;
|
|
|
ev.cb = cb;
|
|
|
ev.cbData = cbData;
|
|
|
-
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessage(ev);
|
|
|
}
|
|
|
|
|
|
@@ -307,14 +342,17 @@ namespace oxygine
|
|
|
ev.arg2 = arg2;
|
|
|
ev.cb = cb;
|
|
|
ev.cbData = cbData;
|
|
|
-
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessage(ev);
|
|
|
}
|
|
|
|
|
|
void ThreadDispatcher::removeCallback(int msgid, callback cb, void* cbData)
|
|
|
{
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
for (messages::iterator i = _events.begin(); i != _events.end(); ++i)
|
|
|
{
|
|
|
message& m = *i;
|
|
|
@@ -332,7 +370,10 @@ namespace oxygine
|
|
|
message ev;
|
|
|
ev.cbFunction = f;
|
|
|
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
+
|
|
|
_pushMessage(ev);
|
|
|
}
|
|
|
|
|
|
@@ -340,8 +381,9 @@ namespace oxygine
|
|
|
{
|
|
|
message ev;
|
|
|
ev.cbFunction = f;
|
|
|
-
|
|
|
+#ifndef OX_NO_MT
|
|
|
MutexPthreadLock lock(_mutex);
|
|
|
+#endif
|
|
|
_pushMessageWaitReply(ev);
|
|
|
}
|
|
|
#endif
|