00001 /* 00002 * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software 00003 * 00004 * The software has been developed within the Siames Project. 00005 * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights 00006 * 00007 * The Software has been registered with the Agence pour la Protection des 00008 * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200 00009 * 00010 * This file may be distributed under the terms of the Q Public License 00011 * version 1.0 as defined by Trolltech AS of Norway and appearing in the file 00012 * LICENSE.QPL included in the packaging of this file. 00013 * 00014 * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 00015 * for the software may use this file in accordance with that specific license 00016 * 00017 */ 00018 #include <PsnReferenceObjectHandle.h> 00019 #include <PsSimulatedObject.h> 00020 #include <PsObjectDescriptor.h> 00021 #include <PsController.h> 00022 #include <typeinfo> 00023 #include "PsEventListener.h" 00024 00025 #include "PsnCurrentActiveObject.h" 00026 //----------------------------------------------------------------------------- 00027 00028 PsnReferenceObjectHandle::PsnReferenceObjectHandle (PsSimulatedObject & objet, PsController & ctrl) 00029 : PsnObjectHandle (objet), 00030 _controller (ctrl), 00031 _signalDispatcher ( new PsnSignalDispatcher (ctrl) ) 00032 { 00033 for(int i=0 ; i<2 ; i++) 00034 { 00035 _isInObjectNeedingActivationList[i]= false ; 00036 } 00037 _computingState = initial ; 00038 _dateOfLastEventManagement = PsController::initialSimulationDate - 1 ; 00039 _dateOfLastActivation = PsController::initialSimulationDate - 1 ; 00040 00041 _eventList = new list <PsEvent *> * [ 2 ] ; 00042 _eventList [ 0 ] = new list <PsEvent *>() ; 00043 _eventList [ 1 ] = new list <PsEvent *>() ; 00044 _currentWritableEventList = 0 ; 00045 00046 const list <PsEventListener *> & listOfEventListeners = _myObject.getEventListeners () ; 00047 list <PsEventListener *>::const_iterator eventListenersIterator = listOfEventListeners.begin() ; 00048 while ( eventListenersIterator != listOfEventListeners.end() ) 00049 { 00050 (*eventListenersIterator)->registerEvents() ; 00051 ++eventListenersIterator ; 00052 } 00053 } 00054 00055 PsnReferenceObjectHandle::PsnReferenceObjectHandle (PsSimulatedObject & objet, 00056 PsController & ctrl, 00057 PsnSignalDispatcher * signalDispatcher ) 00058 : PsnObjectHandle ( objet ), 00059 _controller ( ctrl ), 00060 _signalDispatcher ( signalDispatcher ) 00061 { 00062 assert ( _signalDispatcher != NULL ) ; 00063 for(int i=0;i<2;i++) 00064 { 00065 _isInObjectNeedingActivationList[i]= false ; 00066 } 00067 _computingState = initial ; 00068 _dateOfLastEventManagement = PsController::initialSimulationDate - 1 ; 00069 _dateOfLastActivation = PsController::initialSimulationDate - 1 ; 00070 00071 /* cast for compilation with MIPS-Pro compiler 7.3 */ 00072 _eventList = (list <PsEvent *> **) new list <PsEvent *> * [ 2 ] ; 00073 _eventList [ 0 ] = new list <PsEvent *>() ; 00074 _eventList [ 1 ] = new list <PsEvent *>() ; 00075 _currentWritableEventList = 0 ; 00076 00077 const list <PsEventListener *> & listOfEventListeners = _myObject.getEventListeners () ; 00078 list <PsEventListener *>::const_iterator eventListenersIterator = listOfEventListeners.begin() ; 00079 while ( eventListenersIterator != listOfEventListeners.end() ) 00080 { 00081 (*eventListenersIterator)->registerEvents() ; 00082 ++eventListenersIterator ; 00083 } 00084 } 00085 00086 //----------------------------------------------------------------------------- 00087 00088 PsnReferenceObjectHandle::~PsnReferenceObjectHandle () 00089 { 00090 //cerr<<"PsnReferenceObjectHandle:"<<this<<":~PsnReferenceObjectHandle () "<<endl; 00091 00092 delete _eventList[0] ; 00093 delete _eventList[1] ; 00094 delete [] _eventList ; 00095 for (virtualEventTableType::iterator i = _virtualEventTable.begin(); 00096 i != _virtualEventTable.end(); 00097 ++i ) 00098 { 00099 delete (*i).second ; 00100 } 00101 assert (_signalDispatcher != NULL) ; 00102 delete _signalDispatcher ; 00103 } 00104 00105 void PsnReferenceObjectHandle::init() 00106 { 00107 PsnCurrentActiveObject changeContext ( &_myObject ) ; 00108 #ifdef _DEBUGEXEC 00109 cerr<<"init for object "<<_myObject.getName()<<endl; 00110 #endif 00111 _myObject.init () ; 00112 #ifdef _DEBUGEXEC 00113 cerr<<"init for "<<_myObject.getName()<<" done"<<endl; 00114 #endif 00115 // do not treat init as an activation to enable init and compute in the same simulation step 00116 } 00117 00118 00119 00120 void PsnReferenceObjectHandle::compute() 00121 { 00122 #ifdef _DEBUGEXEC 00123 cerr<<"PsnReferenceObjectHandle::compute() last activated at "<<_dateOfLastActivation<<", now is " 00124 <<_controller.getSimulatedDate()<<endl; 00125 #endif 00126 if ( _controller.getSimulatedDate() > _dateOfLastActivation ) 00127 { 00128 00129 _dateOfLastActivation = _controller.getSimulatedDate() ; 00130 00131 PsnCurrentActiveObject changeContext ( &_myObject ) ; 00132 #ifdef _DEBUGEXEC 00133 cerr<<"PsnReferenceObjectHandle::compute : processing events of "<<_myObject.getName()<<endl; 00134 #endif 00135 processEvents () ; 00136 #ifdef _DEBUGEXEC 00137 cerr<<"PsnReferenceObjectHandle::compute : events processed, computing"<<endl; 00138 #endif 00139 _myObject.compute () ; 00140 #ifdef _DEBUGEXEC 00141 cerr<<"PsnReferenceObjectHandle::compute : computation finished for "<<_myObject.getName()<<endl; 00142 #endif 00143 } 00144 #ifdef _DEBUGEXEC 00145 else 00146 { 00147 cerr<<"PsnReferenceObjectHandle::compute : controller allready activated at "<<_controller.getSimulatedDate()<<endl; 00148 } 00149 #endif 00150 } 00151 00152 void PsnReferenceObjectHandle::processEvents () 00153 { 00154 bool eventsProcessed = false ; 00155 #if defined (_DEBUGEXEC) 00156 cerr<<"PsnReferenceObjectHandle::processEvents () of "<<getSimulatedObject().getName()<<" last activated at "<<_dateOfLastEventManagement<<", now is " 00157 <<_controller.getSimulatedDate()<<endl; 00158 #endif 00159 if (_controller.getSimulatedDate() > _dateOfLastEventManagement ) 00160 { 00161 switchEventList() ; 00162 list< PsEvent * > & myEventList = getCurrentEventList() ; 00163 eventsProcessed = ! myEventList.empty() ; 00164 list< PsEvent * >::iterator i = myEventList.begin() ; 00165 list< PsEvent * >::iterator toErase ; 00166 if ( eventsProcessed ) _myObject.prepareEventProcessing ( myEventList ) ; 00167 while ( i != myEventList.end() ) 00168 { 00169 #ifdef _DEBUGEVT 00170 cout << "PsnReferenceObjectHandle::processEvents (): processing" << *(*i) << endl ; 00171 #endif 00172 virtualEventTableType::iterator listeners = _virtualEventTable.find ( (*i)->eventId ) ; 00173 bool finished = false ; 00174 if ( listeners != _virtualEventTable.end() ) 00175 { 00176 list <PsEventListener * >::iterator aListener = listeners->second->begin() ; 00177 while ( aListener != listeners->second->end() && ! finished ) 00178 { 00179 (*aListener)->prepareEventProcessing ( myEventList , i ) ; 00180 finished = (*aListener)->processEvent ( *i ) ; 00181 ++aListener ; 00182 } 00183 } 00184 if ( ! finished ) 00185 { 00186 if ( _myObject.processEvent ( *i ) ) { 00187 delete (*i) ; 00188 } 00189 } 00190 else 00191 { 00192 delete (*i) ; 00193 } 00194 toErase = i ; 00195 i++ ; 00196 myEventList.erase ( toErase ) ; 00197 } 00198 if ( eventsProcessed ) _myObject.eventsProcessed ( myEventList ) ; 00199 _dateOfLastEventManagement = _controller.getSimulatedDate() ; 00200 } 00201 else 00202 { 00203 //processEvents has already been called, and is called again 00204 #ifdef _DEBUGEVT 00205 cerr <<"PsnReferenceObjectHandle::processEvents event processing postponed for "<<getSimulatedObject().getName()<<endl; 00206 #endif 00207 _controller.postponeEventProcessing ( this ) ; 00208 } 00209 } 00210 00211 00212 00213 bool operator < (const PsnReferenceObjectHandle & un, 00214 const PsnReferenceObjectHandle & deux) 00215 { 00216 return un._myObject. getObjectDescriptor ().getName()<deux._myObject. getObjectDescriptor ().getName(); 00217 } 00218 00219 bool operator <= (const PsnReferenceObjectHandle & un, 00220 const PsnReferenceObjectHandle & deux) 00221 { 00222 return un._myObject.getObjectDescriptor ().getName()<=deux._myObject.getObjectDescriptor ().getName(); 00223 } 00224 00225 bool operator > (const PsnReferenceObjectHandle & un, 00226 const PsnReferenceObjectHandle & deux) 00227 { 00228 return !(un<=deux); 00229 } 00230 00231 bool operator >= (const PsnReferenceObjectHandle & un, 00232 const PsnReferenceObjectHandle & deux) 00233 { 00234 return !(un<deux); 00235 } 00236 00237 //----------------------------------------------------------------------------- 00238 00239 void PsnReferenceObjectHandle::insertInStream (ostream & out) const { 00240 PsController::error ("insertInStream of PsnReferenceObjectHandle used"); 00241 } 00242 00243 void PsnReferenceObjectHandle::extract (istream & in) 00244 { 00245 00246 } 00247 00248 00249 00250 //----------------------------------------------------------------------------- 00251 00252 00253 void PsnReferenceObjectHandle::receiveEvent (const PsEvent & event) 00254 { 00255 #ifdef _DEBUGEVT 00256 cerr<<"PsnReferenceObjectHandle::receiveEvent (const PsEvent &"<<event<<")"<<endl; 00257 #endif 00258 receiveEvent ( event.clone() ) ; 00259 } 00260 00261 void PsnReferenceObjectHandle::receiveEvent (PsEvent * event) { 00262 #ifdef _DEBUGEVT 00263 cerr<<"PsnReferenceObjectHandle::receiveEvent(PsEvent *)"<<endl; 00264 cerr<<" "<<event->receiver<<" received event "<<event->eventId<<" at "<<event->date<<endl; 00265 #endif 00266 //DM : a copy is sent only at reception , because only at reception is the correct controller known 00267 if ( (event->isSystem ()) && (event->receiver == _myObject.getName()) ) 00268 { 00269 _controller.actOnSystemEvent (event) ; 00270 } 00271 // if the receiving object is suspended, or has fast event processing activated 00272 // signal the reception to the controller 00273 if ( _computingState == suspended || _myObject.processEventsASAP () ) 00274 { 00275 _controller.hasEventsToProcess (this) ; 00276 } 00277 if ( _computingState != stopped || event->isSystem () ) { 00278 //*event is owned by the object who has the responsibility to free it 00279 _mutexForListEvt.protect() ; 00280 PsEvent::insertInList (_eventList[_currentWritableEventList], event) ; 00281 _mutexForListEvt.unprotect() ; 00282 } 00283 else { 00284 delete event ; 00285 } 00286 } 00287 00288 void PsnReferenceObjectHandle::registerEventListenerForEvent ( PsEventListener & eventListener, 00289 const PsEventIdentifier & eventId ) { 00290 virtualEventTableType::iterator i = _virtualEventTable.find (eventId) ; 00291 if (i != _virtualEventTable.end() ) { 00292 (*i).second->push_back( &eventListener ) ; 00293 } 00294 else { 00295 _virtualEventTable.insert ( virtualEventTableType::value_type(eventId, 00296 new list< PsEventListener *> ( 1 , &eventListener) ) ); 00297 } 00298 } 00299 00300 list <PsEvent *> & PsnReferenceObjectHandle::getCurrentEventList() { 00301 return *(_eventList[ 1 - _currentWritableEventList ] ) ; 00302 } 00303 00304 void PsnReferenceObjectHandle::switchEventList () { 00305 _mutexForListEvt.protect() ; 00306 _currentWritableEventList = 1 - _currentWritableEventList ; 00307 _mutexForListEvt.unprotect() ; 00308 } 00309 00310 const PsnReferenceObjectHandle::SimulatedObjectComputingState & PsnReferenceObjectHandle::getComputingState() const 00311 { 00312 return _computingState ; 00313 } 00314 00315 00316 void PsnReferenceObjectHandle::sendEventsForSignal( PsEvent & event , const PsEventIdentifier & sigId ) 00317 { 00318 //cerr<<"PsnReferenceObjectHandle::sendEventsForSignal "<<sigId<<endl; 00319 _signalDispatcher->sendEventsForSignal ( event, sigId ) ; 00320 _controller.broadcastEventsForSignal ( event , sigId ) ; 00321 } 00322 00323 bool PsnReferenceObjectHandle::receiveRegistrationForSignal ( const PsEventIdentifier & sigId, 00324 const PsName & registrant, 00325 const PsEventIdentifier & eventId ) 00326 { 00327 return _signalDispatcher->registerForSignal( sigId, registrant, eventId ) ; 00328 } 00329 00330 00331 00332 bool PsnReferenceObjectHandle::cancelRegistrationForSignal ( const PsEventIdentifier & sigId, 00333 const PsName & registrant ) 00334 { 00335 return _signalDispatcher->cancelRegistrationForSignal ( sigId, registrant ) ; 00336 } 00337
| Documentation generated on Mon Nov 25 15:25:01 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |