00001 #include "cmwfwDoorKeeper.h"
00002
00003
00004 #define FILE "source file:cmwfwDoorKeeper.cc"
00005 #define ID "Contact Steen JENSEN, PS/CO"
00006 #define PROGRAM "Middleware server framework"
00007 #define T(a,b,c,d,e) TRACE(a,"%s(%s): %s %s %s %s\n",myname,FILE,b,c,d,e)
00008 #define E(a,b,c,d) ERROR("%s:%s(%s):ERROR: %s %s %s %s - %s\n",PROGRAM,myname,FILE,a,b,c,d,ID)
00009
00010
00011
00012
00017 cmwfwDoorKeeper::cmwfwDoorKeeper(){
00018 char* myname = "cmwfwDoorKeeper::cmwfwDoorKeeper";
00019 T(CMWFW_TRACE_CALLS,"Entering","","","");
00020
00021 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00022 theLockObject = 0;
00023
00024 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00025 };
00026
00031 cmwfwDoorKeeper::~cmwfwDoorKeeper(){
00032 char* myname = "cmwfwDoorKeeper::~cmwfwDoorKeeper";
00033 T(CMWFW_TRACE_CALLS,"Entering","","","");
00034
00035 if(theLockObject != 0){
00036 #ifdef CMWFW_WINDOWSNT
00037 cout << "!!! Error: DoorKeeper destroyed without unlocking!" << endl;
00038
00039
00040 #endif
00041 releaseLock();
00042 };
00043
00044 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00045 };
00046
00051 void cmwfwDoorKeeper::getLock(){
00052 char* myname = "cmwfwDoorKeeper::getLock";
00053 T(CMWFW_TRACE_CALLS,"Entering","","","");
00054
00055 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00056 theLockObject = new JTCSynchronized(theMonitor);
00057 if(!theLockObject)heaperr(47);
00058
00059 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00060 };
00061
00066 void cmwfwDoorKeeper::releaseLock(){
00067 char* myname = "cmwfwDoorKeeper::releaseLock";
00068 T(CMWFW_TRACE_CALLS,"Entering","","","");
00069
00070 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00071 if (theLockObject == 0) {
00072 #ifdef CMWFW_WINDOWSNT
00073 cout<<"!!! Error: Release attempted when theLockObject == 0!"<<endl;
00074 #else
00075 E("Release attempted when theLockObject == 0!","","","");
00076 #endif
00077 return;
00078 };
00079 JTCSynchronized* copyOfTheLockObject = theLockObject;
00080 theLockObject = 0;
00081 delete copyOfTheLockObject;
00082
00083 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00084 };
00085
00090 void cmwfwDoorKeeper::wait() {
00091 char* myname = "cmwfwDoorKeeper::wait";
00092 T(CMWFW_TRACE_CALLS,"Entering","","","");
00093
00094 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00095 JTCSynchronized* theOldLock = theLockObject;
00096 theLockObject = 0;
00097 theMonitor.wait();
00098 theLockObject = theOldLock;
00099
00100 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00101 };
00102
00107 void cmwfwDoorKeeper::wait(int timeout) {
00108 char* myname = "cmwfwDoorKeeper::wait";
00109 T(CMWFW_TRACE_CALLS,"Entering","","","");
00110
00111 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00112 JTCSynchronized* theOldLock = theLockObject;
00113 theLockObject = 0;
00114 theMonitor.wait(timeout);
00115 theLockObject = theOldLock;
00116
00117 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00118 };
00119
00120
00125 void cmwfwDoorKeeper::notify() {
00126 char* myname = "cmwfwDoorKeeper::notify";
00127 T(CMWFW_TRACE_CALLS,"Entering","","","");
00128
00129 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00130 if (theLockObject == 0)
00131 #ifdef CMWFW_WINDOWSNT
00132 cout << "Argh: notify attempted when theLockObject == 0!" << endl;
00133 #else
00134 E("Argh: notify attempted when theLockObject == 0!","","","");
00135 #endif
00136 JTCSynchronized* theOldLock = theLockObject;
00137 theLockObject = 0;
00138 theMonitor.notify();
00139 theLockObject = theOldLock;
00140
00141 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00142 };
00143
00148 void cmwfwDoorKeeper::notifyAll() {
00149 char* myname = "cmwfwDoorKeeper::notifyAll";
00150 T(CMWFW_TRACE_CALLS,"Entering","","","");
00151
00152 POSSIBLE_JTC_ADOPT_CURRENT_THREAD();
00153 if (theLockObject == 0)
00154 #ifdef CMWFW_WINDOWSNT
00155 cout<<"Argh: notifyAll attempted when theLockObject == 0!"<<endl;
00156 #else
00157 E("Argh: notifyAll attempted when theLockObject == 0!","","","");
00158 #endif
00159 JTCSynchronized* theOldLock = theLockObject;
00160 theLockObject = 0;
00161 theMonitor.notifyAll();
00162 theLockObject = theOldLock;
00163
00164 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00165 };
00166
00167
00168
00169 void cmwfwDoorKeeper::heaperr(int line){
00170 char* myname = "cmwfwDoorKeeper";
00171 T(CMWFW_TRACE_CALLS,"Entering","","","");
00172
00173 char l[30];
00174 itoa(line,l);
00175 E("Out of heap in line ",l,"","");
00176 throw cmwfwInternalError(FILE,line,"Out of heap memory");
00177 T(CMWFW_TRACE_CALLS,"Exiting due to heap allocation error","","","");
00178 exit(-1);
00179 };
00180
00181
00182
00183
00188
00189
00194 cmwfwDoorKeeperLock::cmwfwDoorKeeperLock(cmwfwDoorKeeper& theDoorKeeper){
00195 char* myname = "cmwfwDoorKeeperLock::cmwfwDoorKeeperLock";
00196 T(CMWFW_TRACE_CALLS,"Entering","","","");
00197
00198 mTheDoorKeeper = &theDoorKeeper;
00199 isActivated = false;
00200 };
00201
00206 void cmwfwDoorKeeperLock::activate(){
00207 char* myname = "cmwfwDoorKeeperLock::activate";
00208 T(CMWFW_TRACE_CALLS,"Entering","","","");
00209
00210 mTheDoorKeeper->getLock();
00211 isActivated = true;
00212 };
00213
00218 cmwfwDoorKeeperLock::~cmwfwDoorKeeperLock() {
00219 char* myname = "cmwfwDoorKeeperLock::~cmwfwDoorKeeperLock";
00220 T(CMWFW_TRACE_CALLS,"Entering","","","");
00221
00222 if(isActivated == true){
00223 mTheDoorKeeper->notify();
00224 mTheDoorKeeper->releaseLock();
00225 isActivated = false;
00226 };
00227 };