Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy/src/core/TclThreadManager.h @ 2142

Last change on this file since 2142 was 1792, checked in by rgrieder, 16 years ago

Changed initialisation of TclThreadManager, TclBind and Shell to match the simple singleton concept (runtime assert in the c'tor).
That simplifies things a lot. The instances now 'belong' to GSRoot.

  • Property svn:eol-style set to native
File size: 4.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _TclThreadManager_H__
30#define _TclThreadManager_H__
31
32#include "CorePrereqs.h"
33
34#include <queue>
35#include <map>
36#include <list>
37
38#include <boost/thread/mutex.hpp>
39#include <boost/thread/condition.hpp>
40#include <boost/thread/thread.hpp>
41
42#include "cpptcl/CppTcl.h"
43#include "core/OrxonoxClass.h"
44
45namespace orxonox
46{
47    struct _CoreExport TclInterpreterBundle
48    {
49        unsigned int id_;
50
51        std::list<std::string> queue_;
52        boost::mutex queueMutex_;
53
54        Tcl::interpreter* interpreter_;
55        std::string interpreterName_;
56        boost::try_mutex interpreterMutex_;
57
58        std::list<unsigned int> queriers_;
59        boost::mutex queriersMutex_;
60
61        bool running_;
62        boost::mutex runningMutex_;
63
64        bool finished_;
65        boost::mutex finishedMutex_;
66        boost::condition finishedCondition_;
67    };
68
69    class _CoreExport TclThreadManager : public OrxonoxClass
70    {
71        friend class IRC;
72        friend class TclBind;
73
74        public:
75            TclThreadManager(Tcl::interpreter* interpreter);
76            ~TclThreadManager();
77
78            static TclThreadManager& getInstance() { assert(singletonRef_s); return *singletonRef_s; }
79
80            static unsigned int create();
81            static unsigned int createID(unsigned int threadID);
82            static void destroy(unsigned int threadID);
83            static void execute(unsigned int threadID, const std::string& command);
84            static std::string query(unsigned int threadID, const std::string& command);
85            static void status();
86            static void dump(unsigned int threadID);
87            static void flush(unsigned int threadID);
88
89            void error(const std::string& error);
90            void debug(const std::string& error);
91
92            virtual void tick(float dt);
93
94            std::list<unsigned int> getThreadList() const;
95
96        private:
97            TclThreadManager(const TclThreadManager& other);
98
99            static void tcl_execute(Tcl::object const &args);
100            static std::string tcl_query(int querierID, Tcl::object const &args);
101            static std::string tcl_crossquery(int querierID, int threadID, Tcl::object const &args);
102            static bool tcl_running(int threadID);
103
104            Tcl::interpreter* createNewTclInterpreter(const std::string& threadID);
105            TclInterpreterBundle* getInterpreterBundle(unsigned int threadID);
106            std::string dumpList(const std::list<unsigned int>& list);
107
108            void pushCommandToQueue(const std::string& command);
109            void forceCommandToFrontOfQueue(const std::string& command);
110            std::string popCommandFromQueue();
111            bool queueIsEmpty();
112
113            void pushCommandToQueue(unsigned int threadID, const std::string& command);
114            std::string popCommandFromQueue(unsigned int threadID);
115            bool queueIsEmpty(unsigned int threadID);
116
117            bool updateQueriersList(TclInterpreterBundle* querier, TclInterpreterBundle* target);
118
119            std::string evalQuery(unsigned int querierID, const std::string& command);
120            std::string evalQuery(unsigned int querierID, unsigned int threadID, const std::string& command);
121
122            unsigned int threadCounter_;
123            TclInterpreterBundle orxonoxInterpreterBundle_;
124            std::map<unsigned int, TclInterpreterBundle*> interpreterBundles_;
125            boost::mutex bundlesMutex_;
126            boost::condition fullQueueCondition_;
127            boost::condition orxonoxEvalCondition_;
128#if (BOOST_VERSION >= 103500)
129            boost::thread::id threadID_;
130#else
131            boost::thread threadID_;
132#endif
133
134            static TclThreadManager* singletonRef_s;
135    };
136
137    _CoreExport void tclThread(TclInterpreterBundle* interpreterBundle, std::string command);
138}
139
140#endif /* _TclThreadManager_H__ */
Note: See TracBrowser for help on using the repository browser.