Changeset 3307 for code/trunk/src/core/TclThreadManager.h
- Timestamp:
- Jul 19, 2009, 2:12:50 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/core/TclThreadManager.h
r3304 r3307 33 33 34 34 #include <cassert> 35 #include <list>36 35 #include <map> 37 36 #include <string> 38 #include "core/OrxonoxClass.h" 37 38 #include "OrxonoxClass.h" 39 40 namespace boost 41 { 42 // forward declarations 43 class mutex; 44 class shared_mutex; 45 class condition_variable; 46 } 39 47 40 48 namespace orxonox 41 49 { 42 // Internal struct43 struct TclInterpreterBundle;44 45 50 class _CoreExport TclThreadManager : public OrxonoxClass 46 51 { 47 friend class IRC;48 52 friend class TclBind; 53 friend void tclThread(TclInterpreterBundle* bundle, std::string command); 49 54 50 55 public: 51 56 TclThreadManager(Tcl::interpreter* interpreter); 52 ~TclThreadManager();57 virtual ~TclThreadManager(); 53 58 54 static TclThreadManager& getInstance() { assert( singletonRef_s); return *singletonRef_s; }59 static TclThreadManager& getInstance() { assert(TclThreadManager::singletonPtr_s); return *TclThreadManager::singletonPtr_s; } 55 60 56 static unsigned int create(); 57 static unsigned int createID(unsigned int threadID); 58 static void destroy(unsigned int threadID); 59 static void execute(unsigned int threadID, const std::string& command); 60 static std::string query(unsigned int threadID, const std::string& command); 61 static void status(); 62 static void dump(unsigned int threadID); 63 static void flush(unsigned int threadID); 61 static unsigned int create(); 62 static Tcl::interpreter* createWithId(unsigned int id); 63 static void destroy(unsigned int id); 64 static void execute(unsigned int target_id, const std::string& command); 65 static std::string query(unsigned int target_id, const std::string& command); 64 66 65 67 void error(const std::string& error); … … 71 73 72 74 private: 73 TclThreadManager(const TclThreadManager& other); 75 static void tcl_execute(const Tcl::object& args); 76 static void tcl_crossexecute(int target_id, const Tcl::object& args); 77 static std::string tcl_query(int source_id, const Tcl::object& args); 78 static std::string tcl_crossquery(int source_id, int target_id, const Tcl::object& args); 79 static bool tcl_running(int id); 74 80 75 static void tcl_execute(Tcl::object const &args); 76 static std::string tcl_query(int querierID, Tcl::object const &args); 77 static std::string tcl_crossquery(int querierID, int threadID, Tcl::object const &args); 78 static bool tcl_running(int threadID); 81 void _execute(unsigned int target_id, const std::string& command); 82 std::string _query(unsigned int source_id, unsigned int target_id, const std::string& command, bool bUseCommandExecutor = false); 79 83 80 Tcl::interpreter* createNewTclInterpreter(const std::string& threadID); 81 Tcl::interpreter* getTclInterpreter(unsigned int threadID); 82 TclInterpreterBundle* getInterpreterBundle(unsigned int threadID); 84 TclInterpreterBundle* getInterpreterBundle(unsigned int id); 83 85 std::string dumpList(const std::list<unsigned int>& list); 84 86 85 void pushCommandToQueue(const std::string& command); 86 void forceCommandToFrontOfQueue(const std::string& command); 87 std::string popCommandFromQueue(); 88 bool queueIsEmpty(); 87 std::string eval(TclInterpreterBundle* bundle, const std::string& command); 89 88 90 void pushCommandToQueue(unsigned int threadID, const std::string& command); 91 std::string popCommandFromQueue(unsigned int threadID); 92 bool queueIsEmpty(unsigned int threadID); 89 static TclThreadManager* singletonPtr_s; ///< Singleton pointer 93 90 94 bool updateQueriersList(TclInterpreterBundle* querier, TclInterpreterBundle* target); 95 96 std::string evalQuery(unsigned int querierID, const std::string& command); 97 std::string evalQuery(unsigned int querierID, unsigned int threadID, const std::string& command); 98 99 unsigned int threadCounter_; 100 TclInterpreterBundle* orxonoxInterpreterBundle_; 101 std::map<unsigned int, TclInterpreterBundle*> interpreterBundles_; 102 103 static TclThreadManager* singletonRef_s; 91 unsigned int numInterpreterBundles_; ///< Number of created Tcl-interpreters (only used for auto-numbered interpreters, not affected by @ref createWithId) 92 std::map<unsigned int, TclInterpreterBundle*> interpreterBundles_; ///< A map containing all Tcl-interpreters 93 boost::shared_mutex* interpreterBundlesMutex_; ///< A mutex used to synchronize threads when accessing @ref interpreterBundles_ 94 TclThreadList<std::string>* messageQueue_; ///< A queue to pass messages from Tcl-threads to the main thread 95 boost::mutex* mainInterpreterMutex_; ///< A mutex to synchronize queries to the main interpreter 104 96 }; 105 97 106 _CoreExport void tclThread(TclInterpreterBundle* interpreterBundle, std::string command);98 _CoreExport void tclThread(TclInterpreterBundle* bundle, std::string command); 107 99 } 108 100
Note: See TracChangeset
for help on using the changeset viewer.