|
@@ -1,21 +1,15 @@
|
|
|
#include "ThreadMessages.h"
|
|
#include "ThreadMessages.h"
|
|
|
|
|
+#include "log.h"
|
|
|
namespace oxygine
|
|
namespace oxygine
|
|
|
{
|
|
{
|
|
|
- class MutexPthreadLock
|
|
|
|
|
- {
|
|
|
|
|
- public:
|
|
|
|
|
- MutexPthreadLock(pthread_mutex_t &m):_mutex(m)
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutex_lock(&_mutex);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- ~MutexPthreadLock()
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutex_unlock(&_mutex);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+#if 0
|
|
|
|
|
+#define LOGDN(...) log::messageln(__VA_ARGS__)
|
|
|
|
|
+#define LOGD(...) log::message(__VA_ARGS__)
|
|
|
|
|
|
|
|
- pthread_mutex_t& _mutex;
|
|
|
|
|
- };
|
|
|
|
|
|
|
+#else
|
|
|
|
|
+#define LOGDN(...) ((void)0)
|
|
|
|
|
+#define LOGD(...) ((void)0)
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
ThreadMessages::ThreadMessages():_id(0), _waitReplyID(0)
|
|
ThreadMessages::ThreadMessages():_id(0), _waitReplyID(0)
|
|
|
{
|
|
{
|
|
@@ -37,26 +31,63 @@ namespace oxygine
|
|
|
pthread_cond_wait(&_cond, &_mutex);
|
|
pthread_cond_wait(&_cond, &_mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void ThreadMessages::get(message &ev)
|
|
|
|
|
|
|
+ void mywait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
|
|
{
|
|
{
|
|
|
|
|
+#ifdef __S3E__
|
|
|
|
|
+ timespec ts;
|
|
|
|
|
+ clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
+ ts.tv_sec += 1;
|
|
|
|
|
+ //ts.tv_nsec += 5000;
|
|
|
|
|
+ pthread_cond_timedwait(cond, mutex, &ts);
|
|
|
|
|
+#else
|
|
|
|
|
+ pthread_cond_wait(cond, mutex);
|
|
|
|
|
+#endif
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void ThreadMessages::get(message &ev)
|
|
|
|
|
+ {
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ LOGDN("ThreadMessages::get");
|
|
|
|
|
|
|
|
_replyLast(0);
|
|
_replyLast(0);
|
|
|
|
|
|
|
|
while (_events.empty())
|
|
while (_events.empty())
|
|
|
- pthread_cond_wait(&_cond, &_mutex);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::get pthread_cond_wait");
|
|
|
|
|
+ mywait(&_cond, &_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
ev = _events.front();
|
|
ev = _events.front();
|
|
|
_events.erase(_events.begin());
|
|
_events.erase(_events.begin());
|
|
|
_last = ev;
|
|
_last = ev;
|
|
|
|
|
+ LOGDN("ThreadMessages::get received msgid=%d id=%d", _last.msgid, _last._id);
|
|
|
|
|
+ }
|
|
|
|
|
+ /*
|
|
|
|
|
+ ThreadMessages::messages &ThreadMessages::pause(pthread_mutex_t &mutex)
|
|
|
|
|
+ {
|
|
|
|
|
+ mutex = _mutex;
|
|
|
|
|
+ pthread_mutex_lock(&_mutex);
|
|
|
|
|
+ return _events;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void ThreadMessages::resume()
|
|
|
|
|
+ {
|
|
|
|
|
+ pthread_mutex_unlock(&_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
bool ThreadMessages::empty()
|
|
bool ThreadMessages::empty()
|
|
|
{
|
|
{
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
return _events.empty();
|
|
return _events.empty();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void ThreadMessages::clear()
|
|
|
|
|
+ {
|
|
|
|
|
+ MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ _events.resize(0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
bool ThreadMessages::peek(message &ev, bool del)
|
|
bool ThreadMessages::peek(message &ev, bool del)
|
|
|
{
|
|
{
|
|
|
bool has = false;
|
|
bool has = false;
|
|
@@ -78,18 +109,27 @@ namespace oxygine
|
|
|
|
|
|
|
|
void ThreadMessages::_replyLast(void *val)
|
|
void ThreadMessages::_replyLast(void *val)
|
|
|
{
|
|
{
|
|
|
|
|
+ LOGDN("ThreadMessages::_replyLast");
|
|
|
if (!_last._replied)
|
|
if (!_last._replied)
|
|
|
{
|
|
{
|
|
|
|
|
+ LOGDN("ThreadMessages::_replyLast not replied yet");
|
|
|
_last._replied = true;
|
|
_last._replied = true;
|
|
|
_last._result = val;
|
|
_last._result = val;
|
|
|
|
|
|
|
|
if (_last.cb)
|
|
if (_last.cb)
|
|
|
_last.cb(_last);
|
|
_last.cb(_last);
|
|
|
|
|
|
|
|
|
|
+ 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)
|
|
|
{
|
|
{
|
|
|
|
|
+ LOGDN("ThreadMessages::_replyLast pthread_cond_signal _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
|
|
|
pthread_cond_signal(&_cond);
|
|
pthread_cond_signal(&_cond);
|
|
|
}
|
|
}
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::_replyLast else _waitReplyID = %d, _last._id = %d, _last.msgid=%d", _waitReplyID, _last._id, _last.msgid);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -105,17 +145,31 @@ namespace oxygine
|
|
|
message ev;
|
|
message ev;
|
|
|
ev.msgid = msgid;
|
|
ev.msgid = msgid;
|
|
|
ev.arg1 = arg1;
|
|
ev.arg1 = arg1;
|
|
|
- ev.arg2 = arg2;
|
|
|
|
|
- ev._id = ++_id;
|
|
|
|
|
|
|
+ ev.arg2 = arg2;
|
|
|
|
|
+
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ ev._id = ++_id;
|
|
|
|
|
|
|
|
_waitReplyID = ev._id;
|
|
_waitReplyID = ev._id;
|
|
|
_events.push_back(ev);
|
|
_events.push_back(ev);
|
|
|
|
|
+
|
|
|
|
|
+ LOGDN("ThreadMessages::send msgid=%d pthread_cond_signal.. _waitReplyID=%d", msgid, _waitReplyID);
|
|
|
pthread_cond_signal(&_cond);
|
|
pthread_cond_signal(&_cond);
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (_last._replied)
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::send msgid=%d already replied", msgid);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
while (!_last._replied)
|
|
while (!_last._replied)
|
|
|
- pthread_cond_wait(&_cond, &_mutex);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ LOGDN("ThreadMessages::send msgid=%d waiting reply...", msgid);
|
|
|
|
|
+ mywait(&_cond, &_mutex);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LOGDN("ThreadMessages::send msgid=%d done", msgid);
|
|
|
|
|
|
|
|
_waitReplyID = 0;
|
|
_waitReplyID = 0;
|
|
|
_last._replied = false;
|
|
_last._replied = false;
|
|
@@ -130,10 +184,10 @@ namespace oxygine
|
|
|
ev.arg1 = arg1;
|
|
ev.arg1 = arg1;
|
|
|
ev.arg2 = arg2;
|
|
ev.arg2 = arg2;
|
|
|
ev.cb = cb;
|
|
ev.cb = cb;
|
|
|
- ev.cbData = cbData;
|
|
|
|
|
- ev._id = ++_id;
|
|
|
|
|
|
|
+ ev.cbData = cbData;
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ ev._id = ++_id;
|
|
|
_events.push_back(ev);
|
|
_events.push_back(ev);
|
|
|
pthread_cond_signal(&_cond);
|
|
pthread_cond_signal(&_cond);
|
|
|
}
|
|
}
|
|
@@ -143,10 +197,10 @@ namespace oxygine
|
|
|
message ev;
|
|
message ev;
|
|
|
ev.msgid = msgid;
|
|
ev.msgid = msgid;
|
|
|
ev.arg1 = arg1;
|
|
ev.arg1 = arg1;
|
|
|
- ev.arg2 = arg2;
|
|
|
|
|
- ev._id = ++_id;
|
|
|
|
|
|
|
+ ev.arg2 = arg2;
|
|
|
|
|
|
|
|
MutexPthreadLock lock(_mutex);
|
|
MutexPthreadLock lock(_mutex);
|
|
|
|
|
+ ev._id = ++_id;
|
|
|
_events.push_back(ev);
|
|
_events.push_back(ev);
|
|
|
pthread_cond_signal(&_cond);
|
|
pthread_cond_signal(&_cond);
|
|
|
}
|
|
}
|