From: Anders R. <ma...@us...> - 2003-04-19 18:15:48
|
Update of /cvsroot/planeshift/planeshift/src/common/util In directory sc8-pr-cvs1:/tmp/cvs-serv15853/src/common/util Modified Files: eventmanager.cpp eventmanager.h genqueue.cpp genqueue.h Log Message: - Merged the EventHandler and the MsgHandler thread into one thread. Than both messages and events hare handled in the same thread and no thread synchronization is needed :) - Updated the adjuststat command to show current stat after update. Index: eventmanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/util/eventmanager.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** eventmanager.cpp 19 Apr 2003 04:49:08 -0000 1.2 --- eventmanager.cpp 19 Apr 2003 18:15:12 -0000 1.3 *************** *** 34,48 **** EventManager::EventManager() { - thread = csThread::Create(this); mutex = csMutex::Create(CS_MUTEX_RECURSIVE); - if (!thread->Start()) - { - Error1("Faild to start thread"); - } } EventManager::~EventManager() { - thread->Stop(); } --- 34,42 ---- *************** *** 94,108 **** if (count == 100) { ! printf("Went through event loop 100 times in one timeslice. This means we either have duplicate events, bugs in event generation or bugs in deleting events from the event tree.\n"); } } } void EventManager::Run () { ! while (true) { ! ProcessEventQueue(); ! psSleep(250); } } --- 88,132 ---- if (count == 100) { ! printf("Went through event loop 100 times in one timeslice. This means we either have duplicate events, " ! "bugs in event generation or bugs in deleting events from the event tree.\n"); } } } + // Process events at least every 250 tick + #define PROCESS_EVENT 250 + + + // This is the MAIN GAME thread. Every message and event are handled from + // this thread. This eliminate need for synchronization of access to + // game data. void EventManager::Run () { ! MsgEntry *msg = 0; ! ! csTicks nextEvent = csGetTicks() + PROCESS_EVENT; ! ! while(true) { ! csTicks now = csGetTicks(); ! int timeout = nextEvent - now; ! ! if (timeout > 0) ! msg = queue->GetWait(timeout); ! ! if (msg) ! { ! // printf("Handle msg: %d , %08X\n",now,msg->data->type); ! Publish(msg); ! // don't forget to release the packet ! msg->DecRef(); ! msg = NULL; ! } ! else if (now >= nextEvent) ! { ! // printf("Handle event: %d\n",now); ! nextEvent = csGetTicks() + PROCESS_EVENT; ! ProcessEventQueue(); ! } } } Index: eventmanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/util/eventmanager.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** eventmanager.h 18 Mar 2003 20:35:12 -0000 1.1 --- eventmanager.h 19 Apr 2003 18:15:12 -0000 1.2 *************** *** 24,27 **** --- 24,28 ---- #include "cssys/thread.h" #include "util/gameevent.h" + #include "net/msghandler.h" /** *************** *** 32,40 **** * current ticks time. */ ! class EventManager : public csRunnable { protected: csRef<csMutex> mutex; - csRef<csThread> thread; BinaryTree<psGameEvent> eventqueue; --- 33,40 ---- * current ticks time. */ ! class EventManager : public MsgHandler { protected: csRef<csMutex> mutex; BinaryTree<psGameEvent> eventqueue; *************** *** 42,51 **** void Run (); ! /* stupid stuff from csRunnable :-/ */ ! void IncRef () ! {} ! void DecRef () ! {} ! public: EventManager(); --- 42,46 ---- void Run (); ! public: EventManager(); Index: genqueue.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/util/genqueue.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** genqueue.cpp 12 Feb 2003 17:34:39 -0000 1.16 --- genqueue.cpp 19 Apr 2003 18:15:12 -0000 1.17 *************** *** 119,123 **** template <class queuetyp> ! queuetyp* GenericQueue<queuetyp>::GetWait() { // is there's a message in the queue left just return it --- 119,123 ---- template <class queuetyp> ! queuetyp* GenericQueue<queuetyp>::GetWait(csTicks timeout) { // is there's a message in the queue left just return it *************** *** 127,131 **** csScopedMutexLock lock(mutex); ! datacondition->Wait (mutex); // check if queue is empty --- 127,131 ---- csScopedMutexLock lock(mutex); ! datacondition->Wait (mutex, timeout); // check if queue is empty Index: genqueue.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/util/genqueue.h,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** genqueue.h 23 Feb 2003 11:49:48 -0000 1.13 --- genqueue.h 19 Apr 2003 18:15:12 -0000 1.14 *************** *** 65,70 **** /** like above, but waits for the next message, if the queue is empty */ ! queuetyp* GetWait(); /** Note: marked as deprecated * return true if queue is empty. Attention: Don't assume this function --- 65,71 ---- /** like above, but waits for the next message, if the queue is empty */ ! queuetyp* GetWait(csTicks timeout = 0); + protected: /** Note: marked as deprecated * return true if queue is empty. Attention: Don't assume this function |