00001
00002
00003
00004
00005 #include "ProcessFramework.h"
00006 #include "IPEndpoint.h"
00007
00008 #ifdef __GNUC__
00009 #include <apsys.h>
00010
00011
00012
00013
00014
00015
00016 static void (*link[ENTRY_TABLE_MAX])(void*);
00017
00018
00019
00020
00021 #define LINK(id) \
00022 extern "C" void link##id(void* msg) \
00023 { \
00024 link[id](msg); \
00025 } \
00026 GEN_ENTRY(link##id##Entry,link##id)
00027
00028 #define LROW(n) \
00029 LINK(n##0); LINK(n##1); LINK(n##2); LINK(n##3); LINK(n##4); LINK(n##5); LINK(n##6); LINK(n##7); LINK(n##8); LINK(n##9)
00030
00031 LROW(); LROW(1); LROW(2); LROW(3); LROW(4); LROW(5); LROW(6); LROW(7); LROW(8); LROW(9);
00032
00033
00034
00035
00036 #define ENTRY(id) link##id##Entry
00037
00038 #define EROW(n) \
00039 ENTRY(n##0), ENTRY(n##1), ENTRY(n##2), ENTRY(n##3), ENTRY(n##4), \
00040 ENTRY(n##5), ENTRY(n##6), ENTRY(n##7), ENTRY(n##8), ENTRY(n##9)
00041
00042 static void (*entry[ENTRY_TABLE_MAX])() =
00043 {
00044 EROW(), EROW(1), EROW(2), EROW(3), EROW(4), EROW(5), EROW(6), EROW(7), EROW(8), EROW(9)
00045 };
00046
00047 GEN_ENTRY(PrologueEntry,Prologue);
00048
00049 #endif // __GNUC__
00050
00051 int ProcessBase::blockMask = 0,
00052 ProcessBase::eventMask = 0;
00053 ProcessBase* ProcessBase::theInstance = 0;
00054
00055 ObjectEntry ObjectEntryTable[ENTRY_TABLE_MAX + 1];
00056
00057 void ProcessBase::aperiosInit(OReasonMessage* reasonMsg)
00058 {
00059 theInstance->Init(OSystemEvent(reasonMsg->reason,reasonMsg->param,reasonMsg->paramSize));
00060 Return();
00061 }
00062
00063 void ProcessBase::aperiosStart(OReasonMessage* reasonMsg)
00064 {
00065 theInstance->Start(OSystemEvent(reasonMsg->reason,reasonMsg->param,reasonMsg->paramSize));
00066 Return();
00067 }
00068
00069 void ProcessBase::aperiosStop(OReasonMessage* reasonMsg)
00070 {
00071 theInstance->Stop(OSystemEvent(reasonMsg->reason,reasonMsg->param,reasonMsg->paramSize));
00072 Return();
00073 }
00074
00075 void ProcessBase::aperiosDestroy(OReasonMessage* reasonMsg)
00076 {
00077 theInstance->Destroy(OSystemEvent(reasonMsg->reason,reasonMsg->param,reasonMsg->paramSize));
00078 Return();
00079 }
00080
00081 void ProcessBase::awakeOnTimer(OReasonMessage* reasonMsg)
00082 {
00083 setEventId(31);
00084 Exit();
00085 }
00086
00087
00088 void ProcessBase::antListenCont(antEnvMsg* msg)
00089 {
00090
00091
00092
00093
00094 (static_cast<IPEndpoint*>(msg->continuation))->listenCont(msg);
00095
00096 Return();
00097 }
00098
00099 void ProcessBase::antConnectCont(antEnvMsg* msg)
00100 {
00101
00102 (static_cast<IPEndpoint*>(msg->continuation))->connectCont(msg);
00103
00104 Return();
00105 }
00106
00107 void ProcessBase::antReceiveCont(antEnvMsg* msg)
00108 {
00109
00110 (static_cast<IPEndpoint*>(msg->continuation))->receiveCont(msg);
00111
00112 Return();
00113 }
00114
00115 void ProcessBase::antSendCont(antEnvMsg* msg)
00116 {
00117
00118 (static_cast<IPEndpoint*>(msg->continuation))->sendCont(msg);
00119
00120 Return();
00121 }
00122
00123 void ProcessBase::antCloseCont(antEnvMsg* msg)
00124 {
00125
00126 (static_cast<IPEndpoint*>(msg->continuation))->closeCont(msg);
00127
00128 Return();
00129 }
00130
00131 void ProcessBase::getAntInformation(int*& listenContSelector, int*& sendContSelector,
00132 int*& receiveContSelector, int*& closeContSelector,
00133 int*& connectContSelector)
00134 {
00135 listenContSelector = &antListenContSelector;
00136 sendContSelector = &antSendContSelector;
00137 receiveContSelector = &antReceiveContSelector;
00138 closeContSelector = &antCloseContSelector;
00139 connectContSelector = &antConnectContSelector;
00140 }
00141
00142 void ProcessBase::init()
00143 {
00144 unsigned int id = 0;
00145 ObjectEntryTable[id].selector = id;
00146 ObjectEntryTable[id++].entry = (Entry) aperiosInit;
00147 ObjectEntryTable[id].selector = id;
00148 ObjectEntryTable[id++].entry = (Entry) aperiosStart;
00149 ObjectEntryTable[id].selector = id;
00150 ObjectEntryTable[id++].entry = (Entry) aperiosStop;
00151 ObjectEntryTable[id].selector = id;
00152 ObjectEntryTable[id++].entry = (Entry) aperiosDestroy;
00153 ObjectEntryTable[id].selector = id;
00154 ObjectEntryTable[id++].entry = (Entry) awakeOnTimer;
00155
00156 for(ReceiverList* p = getProcess()->getFirstReceiver(); p; p = p->getNext())
00157 id = p->fillEntryTable(ObjectEntryTable,id);
00158 for(SenderList* q = getProcess()->getFirstSender(); q; q = q->getNext())
00159 id = q->fillEntryTable(ObjectEntryTable,id);
00160 ASSERT(id <= ENTRY_TABLE_MAX);
00161
00162
00163
00164 ObjectEntryTable[id].selector = id;
00165 antListenContSelector = id;
00166 ObjectEntryTable[id++].entry = (Entry) antListenCont;
00167
00168 ObjectEntryTable[id].selector = id;
00169 antReceiveContSelector = id;
00170 ObjectEntryTable[id++].entry = (Entry) antReceiveCont;
00171
00172 ObjectEntryTable[id].selector = id;
00173 antSendContSelector = id;
00174 ObjectEntryTable[id++].entry = (Entry) antSendCont;
00175
00176 ObjectEntryTable[id].selector = id;
00177 antCloseContSelector = id;
00178 ObjectEntryTable[id++].entry = (Entry) antCloseCont;
00179
00180 ObjectEntryTable[id].selector = id;
00181 antConnectContSelector = id;
00182 ObjectEntryTable[id++].entry = (Entry) antConnectCont;
00183
00184 ASSERT(id <= ENTRY_TABLE_MAX);
00185
00186 #ifdef __GNUC__
00187
00188 for(unsigned int i = 0; i < id; ++i)
00189 {
00190 link[i] = (void (*)(void*)) ObjectEntryTable[i].entry;
00191 ObjectEntryTable[i].entry = (Entry) entry[i];
00192 }
00193 #endif // __GNUC__
00194
00195 ObjectEntryTable[id].selector = UNDEF;
00196 ObjectEntryTable[id].entry = ENTRY_UNDEF;
00197 }
00198
00199 void ProcessBase::nextFrame()
00200 {
00201 if(theInstance->isRunning())
00202 theInstance->processNextFrame();
00203 }
00204
00205 void ProcessBase::setBlockingId(int id,bool block)
00206 {
00207 if(block)
00208 blockMask |= 1 << id;
00209 else
00210 blockMask &= ~(1 << id);
00211 }
00212
00213 void ProcessBase::setEventId(int id)
00214 {
00215 eventMask |= 1 << id;
00216 if(blockMask && (eventMask & blockMask) == blockMask)
00217 {
00218 blockMask = 0;
00219 nextFrame();
00220 }
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282