source: nrEngine/src/IThread.cpp @ 1

Revision 1, 3.8 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "IThread.h"
18#include "EventManager.h"
19#include "Log.h"
20#include <boost/bind.hpp>
21
22namespace nrEngine{
23
24        //--------------------------------------------------------------------
25        IThread::IThread()// : EventActor(std::string("Thread_") + boost::lexical_cast<std::string>(id))
26        {
27                mThread = NULL;
28                mThreadState = THREAD_STOP;
29        }
30
31        //--------------------------------------------------------------------
32        IThread::~IThread()
33        {
34                // delete the thread object if it is not empty
35                if (mThread){
36                        delete mThread;
37                }
38        }
39
40        //--------------------------------------------------------------------
41        void IThread::threadStart()
42        {
43                // Check if we have already a thread created
44                if (mThread)
45                {
46                        NR_Log(Log::LOG_KERNEL, Log::LL_WARNING, "IThread: the appropriate thread is already running!");
47                        return;
48                }
49                NR_Log(Log::LOG_KERNEL, "IThread: Create thread and start it");
50
51                // now create a thread and let it run
52                mThreadState = THREAD_RUNNING;
53                mThread = new boost::thread(boost::bind(IThread::run, this));
54        }
55
56        //--------------------------------------------------------------------
57        void IThread::threadStop()
58        {
59                changeState(THREAD_STOP);
60                mThread->join();
61        }
62
63        //--------------------------------------------------------------------
64        void IThread::threadSuspend()
65        {
66                changeState(THREAD_NEXT_SUSPEND);
67        }
68
69        //--------------------------------------------------------------------
70        void IThread::threadResume()
71        {
72                changeState(THREAD_NEXT_RESUME);
73        }
74
75        //--------------------------------------------------------------------
76        void IThread::changeState(ThreadState newState)
77        {
78                // first lock the mutex and then change the state
79                try{
80                        boost::mutex::scoped_lock lock(mMutex);
81                        mThreadState = newState;
82                }catch (boost::lock_error err) {}
83        }
84
85        //--------------------------------------------------------------------
86        void IThread::run(IThread* mythread)
87        {
88
89                // now loop the thread until some messages occurs
90                bool run = true;
91                while (run){
92
93                        // kernel requested to suspend the thread
94                        if (mythread->mThreadState == THREAD_NEXT_SUSPEND)
95                        {
96                                // notice about suspending and go into sleep mode
97                                mythread->changeState(THREAD_SLEEPING);
98                                mythread->_noticeSuspend();
99
100                        // kernel requested to resume the execution
101                        }else if (mythread->mThreadState == THREAD_NEXT_RESUME)
102                        {
103                                // notice about resuming the work and start it again
104                                mythread->changeState(THREAD_RUNNING);
105                                mythread->_noticeResume();
106
107                        // kernel does not requested anything, so run the task
108                        }else if (mythread->mThreadState == THREAD_RUNNING)
109                        {
110                                mythread->_noticeUpdate();
111                        }
112
113                        // check for the stop message, then stop the thread
114                        // this is a reading mutex, so do not have to lock it
115                        run = mythread->mThreadState != THREAD_STOP;
116                }
117                // notice to stop the underlying task
118                mythread->_noticeStop();
119        }
120
121}; // end namespace
122
Note: See TracBrowser for help on using the repository browser.