MessageReceiver.ccGo to the documentation of this file.00001 #ifndef PLATFORM_APERIOS
00002
00003 #include "MessageReceiver.h"
00004
00005
00006
00007
00008 MessageReceiver::MessageReceiver(MessageQueueBase& mq, bool (*callback) (RCRegion*), bool startThread)
00009 : Thread(), queue(mq), nextMessage(0), lastProcessedMessage(-1U), process(callback), sleeptime(1000), curit((index_t)-1)
00010 {
00011 queue.addReceiver();
00012 if(startThread)
00013 start();
00014 }
00015
00016 MessageReceiver::~MessageReceiver() {
00017 if(isRunning())
00018 queue.removeReceiver();
00019 }
00020
00021 RCRegion * MessageReceiver::peekNextMessage() {
00022 MessageQueueBase::AutoLock autolock(queue.getLock());
00023 if(queue.isEnd(curit)) {
00024 index_t it=queue.newest();
00025 while(!queue.isEnd(it) && queue.getMessageSN(it)>=nextMessage)
00026 it=queue.older(it);
00027 curit=it=queue.newer(it);
00028 }
00029 if(queue.isEnd(curit))
00030 return NULL;
00031 return queue.peekMessage(curit);
00032 }
00033
00034 RCRegion * MessageReceiver::getNextMessage() {
00035 MessageQueueBase::AutoLock autolock(queue.getLock());
00036 index_t it;
00037 if(queue.isEnd(curit)) {
00038 it=queue.newest();
00039 while(!queue.isEnd(it) && queue.getMessageSN(it)>=nextMessage)
00040 it=queue.older(it);
00041 curit=it=queue.newer(it);
00042 } else {
00043 it=curit;
00044 while(!queue.isEnd(it) && queue.getMessageSN(it)<nextMessage)
00045 it=queue.newer(it);
00046 curit=it;
00047 }
00048 if(queue.isEnd(it))
00049 return NULL;
00050 nextMessage=queue.getMessageSN(it)+1;
00051 curit=queue.newer(it);
00052 return queue.readMessage(it);
00053 }
00054
00055 void MessageReceiver::markRead() {
00056 if(queue.isEnd(curit))
00057 return;
00058 nextMessage=queue.getMessageSN(curit)+1;
00059 queue.markRead(curit);
00060 curit=queue.newer(curit);
00061 }
00062
00063 void MessageReceiver::waitNextMessage() {
00064 for(;;) {
00065 RCRegion * ans=peekNextMessage();
00066 if(ans!=NULL)
00067 return;
00068 usleep(sleeptime);
00069 }
00070 }
00071
00072 unsigned int MessageReceiver::runloop() {
00073 RCRegion * msg;
00074
00075 while((msg=peekNextMessage())!=NULL) {
00076
00077 bool used=false;
00078 if(lastProcessedMessage!=queue.getMessageSN(curit)) {
00079
00080 lastProcessedMessage=queue.getMessageSN(curit);
00081 used=process(msg);
00082 if(used)
00083 markRead();
00084
00085
00086
00087
00088 }
00089 msg->RemoveReference();
00090 if(!used)
00091 break;
00092 }
00093 return sleeptime;
00094 }
00095
00096 void MessageReceiver::finish() {
00097 if(!isRunning())
00098 return;
00099 stop();
00100 join();
00101 RCRegion * msg;
00102
00103 while((msg=peekNextMessage())!=NULL) {
00104
00105 bool used=false;
00106 if(lastProcessedMessage!=queue.getMessageSN(curit)) {
00107
00108 lastProcessedMessage=queue.getMessageSN(curit);
00109 used=process(msg);
00110 if(used)
00111 markRead();
00112
00113
00114
00115
00116 }
00117 msg->RemoveReference();
00118 if(!used)
00119 break;
00120 }
00121 queue.removeReceiver();
00122 }
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 #endif //PLATFORM_APERIOS check (aperios doesn't support pthreads...)
|