Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsnReferenceObjectHandle.cxx

Go to the documentation of this file.
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 

logo OpenMask

Documentation generated on Mon Nov 25 15:25:01 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001