|
@@ -13,6 +13,25 @@ namespace oxygine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ void mywait(pthread_cond_t* cond, pthread_mutex_t* mutex)
|
|
|
|
|
+ {
|
|
|
|
|
+#ifdef __S3E__
|
|
|
|
|
+ timespec ts;
|
|
|
|
|
+ clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
+ addtime(ts, 300);
|
|
|
|
|
+ pthread_cond_timedwait(cond, mutex, &ts);
|
|
|
|
|
+#elif __ANDROID__
|
|
|
|
|
+ timespec ts;
|
|
|
|
|
+ clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
+ addtime(ts, 500);
|
|
|
|
|
+ pthread_cond_timedwait(cond, mutex, &ts);
|
|
|
|
|
+#else
|
|
|
|
|
+ pthread_cond_wait(cond, mutex);
|
|
|
|
|
+#endif
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
MutexPthreadLock::MutexPthreadLock(pthread_mutex_t& m, bool lock) : _mutex(m), _locked(lock)
|
|
MutexPthreadLock::MutexPthreadLock(pthread_mutex_t& m, bool lock) : _mutex(m), _locked(lock)
|
|
|
{
|
|
{
|
|
|
if (_locked)
|
|
if (_locked)
|
|
@@ -24,7 +43,7 @@ namespace oxygine
|
|
|
pthread_mutex_unlock(&_mutex);
|
|
pthread_mutex_unlock(&_mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ThreadMessages::ThreadMessages(): _id(0), _waitReplyID(0)
|
|
|
|
|
|
|
+ ThreadMessages::ThreadMessages(): _id(0), _waitReplyID(0), _result(0)
|
|
|
{
|
|
{
|
|
|
pthread_cond_init(&_cond, 0);
|
|
pthread_cond_init(&_cond, 0);
|
|
|
|
|
|
|
@@ -43,14 +62,19 @@ namespace oxygine
|
|
|
pthread_cond_destroy(&_cond);
|
|
pthread_cond_destroy(&_cond);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void ThreadMessages::wait()
|
|
|
|
|
|
|
+ void ThreadMessages::_waitMessage()
|
|
|
{
|
|
{
|
|
|
- MutexPthreadLock lock(_mutex);
|
|
|
|
|
_replyLast(0);
|
|
_replyLast(0);
|
|
|
while (_events.empty())
|
|
while (_events.empty())
|
|
|
pthread_cond_wait(&_cond, &_mutex);
|
|
pthread_cond_wait(&_cond, &_mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void ThreadMessages::wait()
|
|
|
|
|
+ {
|
|
|
|
|
+ MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ _waitMessage();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
void addtime(timespec& ts, int ms)
|
|
void addtime(timespec& ts, int ms)
|
|
|
{
|
|
{
|
|
|
ts.tv_nsec += ms * 1000000;
|
|
ts.tv_nsec += ms * 1000000;
|
|
@@ -62,35 +86,12 @@ namespace oxygine
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- void mywait(pthread_cond_t* cond, pthread_mutex_t* mutex)
|
|
|
|
|
- {
|
|
|
|
|
-#ifdef __S3E__
|
|
|
|
|
- timespec ts;
|
|
|
|
|
- clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
- addtime(ts, 300);
|
|
|
|
|
- pthread_cond_timedwait(cond, mutex, &ts);
|
|
|
|
|
-#elif __ANDROID__
|
|
|
|
|
- timespec ts;
|
|
|
|
|
- clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
- addtime(ts, 500);
|
|
|
|
|
- pthread_cond_timedwait(cond, mutex, &ts);
|
|
|
|
|
-#else
|
|
|
|
|
- pthread_cond_wait(cond, mutex);
|
|
|
|
|
-#endif
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
void ThreadMessages::get(message& ev)
|
|
void ThreadMessages::get(message& ev)
|
|
|
{
|
|
{
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
LOGDN("ThreadMessages::get");
|
|
LOGDN("ThreadMessages::get");
|
|
|
|
|
|
|
|
- _replyLast(0);
|
|
|
|
|
-
|
|
|
|
|
- while (_events.empty())
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::get pthread_cond_wait");
|
|
|
|
|
- mywait(&_cond, &_mutex);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ _waitMessage();
|
|
|
|
|
|
|
|
ev = _events.front();
|
|
ev = _events.front();
|
|
|
_events.erase(_events.begin());
|
|
_events.erase(_events.begin());
|
|
@@ -148,26 +149,29 @@ namespace oxygine
|
|
|
void ThreadMessages::_replyLast(void* val)
|
|
void ThreadMessages::_replyLast(void* val)
|
|
|
{
|
|
{
|
|
|
LOGDN("ThreadMessages::_replyLast");
|
|
LOGDN("ThreadMessages::_replyLast");
|
|
|
- if (!_last._replied)
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::_replyLast not replied yet");
|
|
|
|
|
- _last._replied = true;
|
|
|
|
|
- _last._result = val;
|
|
|
|
|
|
|
|
|
|
- if (_last.cb)
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::running callback");
|
|
|
|
|
- _last.cb(_last);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (_last.cb)
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::running callback");
|
|
|
|
|
+ _last.cb(_last);
|
|
|
|
|
+ _last.cb = 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
#ifndef __S3E__
|
|
#ifndef __S3E__
|
|
|
- if (_last.cbFunction)
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::running callback function");
|
|
|
|
|
- _last.cbFunction();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (_last.cbFunction)
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::running callback function");
|
|
|
|
|
+ _last.cbFunction();
|
|
|
|
|
+ _last.cbFunction = std::function< void() >();
|
|
|
|
|
+ }
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
+ if (_waitReplyID == _last._id)
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::_replyLast not replied yet");
|
|
|
|
|
+ _result = val;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
LOGDN("ThreadMessages::_replyLast pre _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
|
|
LOGDN("ThreadMessages::_replyLast pre _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
|
|
|
|
|
|
|
|
if (_waitReplyID && _last._id == _waitReplyID)
|
|
if (_waitReplyID && _last._id == _waitReplyID)
|
|
@@ -189,6 +193,17 @@ namespace oxygine
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ void ThreadMessages::_waitReply()
|
|
|
|
|
+ {
|
|
|
|
|
+ while (_last._id != _waitReplyID)
|
|
|
|
|
+ {
|
|
|
|
|
+ //LOGDN("ThreadMessages::send msgid=%d waiting reply...", msgid);
|
|
|
|
|
+ mywait(&_cond, &_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _waitReplyID = 0;// ?
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
void* ThreadMessages::send(int msgid, void* arg1, void* arg2)
|
|
void* ThreadMessages::send(int msgid, void* arg1, void* arg2)
|
|
|
{
|
|
{
|
|
|
message ev;
|
|
message ev;
|
|
@@ -198,32 +213,53 @@ namespace oxygine
|
|
|
|
|
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
- ev._id = ++_id;
|
|
|
|
|
-
|
|
|
|
|
- _waitReplyID = ev._id;
|
|
|
|
|
- _events.push_back(ev);
|
|
|
|
|
|
|
+ _pushMessageWithReply(ev);
|
|
|
|
|
|
|
|
LOGDN("ThreadMessages::send msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);
|
|
LOGDN("ThreadMessages::send msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);
|
|
|
- pthread_cond_signal(&_cond);
|
|
|
|
|
|
|
+ _waitReply();
|
|
|
|
|
|
|
|
|
|
+ LOGDN("ThreadMessages::send msgid=%d done", msgid);
|
|
|
|
|
|
|
|
- if (_last._replied)
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::send msgid=%d already replied", msgid);
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- while (!_last._replied || _last._id != _waitReplyID)
|
|
|
|
|
- {
|
|
|
|
|
- LOGDN("ThreadMessages::send msgid=%d waiting reply...", msgid);
|
|
|
|
|
- mywait(&_cond, &_mutex);
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- LOGDN("ThreadMessages::send msgid=%d done", msgid);
|
|
|
|
|
|
|
+ return _result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void* ThreadMessages::sendCallback(int msgid, void* arg1, void* arg2, callback cb, void* cbData)
|
|
|
|
|
+ {
|
|
|
|
|
+ message ev;
|
|
|
|
|
+ ev.msgid = msgid;
|
|
|
|
|
+ ev.arg1 = arg1;
|
|
|
|
|
+ ev.arg2 = arg2;
|
|
|
|
|
+ ev.cb = cb;
|
|
|
|
|
+ ev.cbData = cbData;
|
|
|
|
|
+
|
|
|
|
|
+ MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ _pushMessageWithReply(ev);
|
|
|
|
|
+ LOGDN("ThreadMessages::sendCallback msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);
|
|
|
|
|
+
|
|
|
|
|
+ _waitReply();
|
|
|
|
|
+
|
|
|
|
|
+ LOGDN("ThreadMessages::sendCallback msgid=%d done", msgid);
|
|
|
|
|
|
|
|
- _waitReplyID = 0;
|
|
|
|
|
- _last._replied = false;
|
|
|
|
|
|
|
|
|
|
- return _last._result;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return _result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void ThreadMessages::_pushMessageWithReply(message& msg)
|
|
|
|
|
+ {
|
|
|
|
|
+ msg._id = ++_id;
|
|
|
|
|
+ _waitReplyID = msg._id;
|
|
|
|
|
+ _events.push_back(msg);
|
|
|
|
|
+ pthread_cond_signal(&_cond);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void ThreadMessages::_pushMessage(message& msg)
|
|
|
|
|
+ {
|
|
|
|
|
+ msg._id = ++_id;
|
|
|
|
|
+ _events.push_back(msg);
|
|
|
|
|
+ pthread_cond_signal(&_cond);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ThreadMessages::post(int msgid, void* arg1, void* arg2)
|
|
void ThreadMessages::post(int msgid, void* arg1, void* arg2)
|
|
@@ -234,9 +270,7 @@ namespace oxygine
|
|
|
ev.arg2 = arg2;
|
|
ev.arg2 = arg2;
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
- ev._id = ++_id;
|
|
|
|
|
- _events.push_back(ev);
|
|
|
|
|
- pthread_cond_signal(&_cond);
|
|
|
|
|
|
|
+ _pushMessage(ev);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ThreadMessages::postCallback(int msgid, void* arg1, void* arg2, callback cb, void* cbData)
|
|
void ThreadMessages::postCallback(int msgid, void* arg1, void* arg2, callback cb, void* cbData)
|
|
@@ -249,9 +283,7 @@ namespace oxygine
|
|
|
ev.cbData = cbData;
|
|
ev.cbData = cbData;
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
- ev._id = ++_id;
|
|
|
|
|
- _events.push_back(ev);
|
|
|
|
|
- pthread_cond_signal(&_cond);
|
|
|
|
|
|
|
+ _pushMessage(ev);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ThreadMessages::removeCallback(int msgid, callback cb, void* cbData)
|
|
void ThreadMessages::removeCallback(int msgid, callback cb, void* cbData)
|
|
@@ -266,7 +298,6 @@ namespace oxygine
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#ifndef __S3E__
|
|
#ifndef __S3E__
|
|
@@ -281,9 +312,7 @@ namespace oxygine
|
|
|
ev.cbFunction = f;
|
|
ev.cbFunction = f;
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
- ev._id = ++_id;
|
|
|
|
|
- _events.push_back(ev);
|
|
|
|
|
- pthread_cond_signal(&_cond);
|
|
|
|
|
|
|
+ _pushMessage(ev);
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|