Ignore:
Timestamp:
Jun 25, 2009, 11:06:52 AM (15 years ago)
Author:
Christoph Mayer
Message:

-StartupWrapper bisschen umgeschrieben, erste Schritte für sauberes runterfahren

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/utility/system/SystemQueue.cpp

    r3690 r4483  
    130130
    131131        // cause the thread to exit
    132         running = false;
    133         itemsAvailable.notify_all();
     132        {
     133                boost::mutex::scoped_lock lock(queueMutex);
     134                running = false;
     135
     136                while( eventsQueue.size() > 0 ){
     137                        eventsQueue.erase( eventsQueue.begin() );
     138                }
     139
     140                itemsAvailable.notify_all();
     141        }
    134142
    135143        // wait that the thread has exited
     
    139147        delete queueThread;
    140148        queueThread = NULL;
    141 
    142         while( eventsQueue.size() > 0 ){
    143                 eventsQueue.erase( eventsQueue.begin() );
    144         }
    145149}
    146150
     
    151155
    152156void SystemQueue::QueueThread::insert( const SystemEvent& event, uint32_t delay ){
    153         {
    154                 boost::mutex::scoped_lock lock( queueMutex );
    155 
    156                 eventsQueue.push_back( event );
    157                 eventsQueue.back().scheduledTime = boost::posix_time::microsec_clock::local_time();
    158                 eventsQueue.back().delayTime = delay;
    159                 eventsQueue.back().remainingDelay = delay;
    160 
    161                 onItemInserted( event );
    162                 itemsAvailable.notify_all();
    163         }
     157
     158        // if this is called from a module that is currently handling
     159        // a thread (called from SystemQueue::onNextQueueItem), the
     160        // thread is the same anyway and the mutex will be already
     161        // aquired, otherwise we aquire it now
     162
     163        boost::mutex::scoped_lock lock( queueMutex );
     164
     165        eventsQueue.push_back( event );
     166        eventsQueue.back().scheduledTime = boost::posix_time::microsec_clock::local_time();
     167        eventsQueue.back().delayTime = delay;
     168        eventsQueue.back().remainingDelay = delay;
     169
     170        onItemInserted( event );
     171        itemsAvailable.notify_all();
    164172}
    165173
     
    177185                while ( obj->eventsQueue.empty() && obj->running ){
    178186
    179                         const boost::system_time duration =
    180                                         boost::get_system_time() +
    181                                         boost::posix_time::milliseconds(40);
     187//                      const boost::system_time duration =
     188//                                      boost::get_system_time() +
     189//                                      boost::posix_time::milliseconds(100);
    182190
    183191                        obj->itemsAvailable.wait( lock );
     
    185193                }
    186194
     195                //
    187196                // work all the items that are currently in the queue
    188 
    189                 while( !obj->eventsQueue.empty() ) {
    190 
    191                         // fetch the first item in the queue and deliver it to the
    192                         // queue handler
     197                //
     198
     199                while( !obj->eventsQueue.empty() && obj->running ) {
     200
     201                        // fetch the first item in the queue
     202                        // and deliver it to the queue handler
    193203                        SystemEvent ev = obj->eventsQueue.front();
    194204                        obj->eventsQueue.erase( obj->eventsQueue.begin() );
    195205
    196                         {
    197                                 // unlock the queue to that an event handler
    198                                 // can insert new items into the queue
    199 //                              obj->queueMutex.unlock();
    200                                 obj->onNextQueueItem( ev );
    201 //                              obj->queueMutex.lock();
    202                         }
     206                        // call the queue and this will
     207                        // call the actual event handler
     208                        obj->onNextQueueItem( ev );
    203209
    204210                } // !obj->eventsQueue.empty() )
    205211        } // while (obj->running)
     212
     213        logging_debug("system queue exited");
    206214}
    207215
Note: See TracChangeset for help on using the changeset viewer.