00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OSGTHREADMANAGER_H_
00040 #define _OSGTHREADMANAGER_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045 #include <OSGBase.h>
00046 #include <OSGBaseTypes.h>
00047 #include <OSGBaseFunctions.h>
00048 #include <OSGIDStringLink.h>
00049
00050 #if defined(OSG_USE_SPROC)
00051 #include <ulocks.h>
00052 #endif
00053
00054 #include <map>
00055
00056 #include <OSGBaseThread.h>
00057 #include <OSGBarrier.h>
00058 #include <OSGLock.h>
00059 #include <OSGLog.h>
00060
00061 OSG_BEGIN_NAMESPACE
00062
00063
00064
00065
00066
00071 template <class MPFieldT>
00072 class MPFieldStore
00073 {
00074
00075
00076 public:
00077
00078 typedef typename MPFieldT::Type MPFieldType;
00079
00080
00084 MPFieldStore(void);
00085
00087
00091 virtual ~MPFieldStore(void);
00092
00094
00098 MPFieldT *getMPField (const Char8 *szName,
00099 const Char8 *szTypeName);
00100
00101 MPFieldT *findMPField (const Char8 *szName);
00102
00103 void removeMPField( MPFieldT *pField);
00104
00106
00110 void clear(void);
00111
00113
00117 MPFieldType *findMPFieldType(const Char8 *szName) const;
00118
00120
00121
00122 protected:
00123
00124
00128 typedef std::map<IDStringLink, MPFieldType *> MPFieldTypeMap;
00129 typedef typename MPFieldTypeMap::iterator MPFieldTypeMapIt;
00130
00131 typedef typename MPFieldTypeMap::const_iterator MPFieldTypeMapCIt;
00132
00133 typedef std::map<IDStringLink, MPFieldT *> MPFieldMap;
00134 typedef typename MPFieldMap::iterator MPFieldMapIt;
00135
00137
00138
00139 MPFieldTypeMap _mFieldTypeMap;
00140 MPFieldMap _mFieldMap;
00141
00142 UInt32 registerMPType(MPFieldType *pType);
00143
00144
00145
00146 private:
00147
00148 friend class ThreadManager;
00149
00151 MPFieldStore (const MPFieldStore &source);
00153 void operator =(const MPFieldStore &source);
00154 };
00155
00156
00157
00158
00159
00160
00161
00162
00166 class OSG_BASE_DLLMAPPING ThreadManager
00167 {
00168
00169
00170 public:
00171
00172
00176 typedef MPFieldStore<BaseThread> ThreadStore;
00177 typedef MPFieldStore<Barrier > BarrierStore;
00178 typedef MPFieldStore<Lock > LockStore;
00179 typedef MPFieldStore<LockPool > LockPoolStore;
00180
00182
00186 static void setAppThreadType(const Char8 *szAppThreadType);
00187
00188 static ThreadManager *the ( void );
00189
00190 static BaseThread *getAppThread ( void );
00191
00192 static void setNumAspects ( UInt32 uiNumApects );
00193 static UInt32 getNumAspects ( void );
00194
00196
00200 BaseThread *getThread (const Char8 *szName,
00201 const Char8 *szTypeName = "OSGThread");
00202 Barrier *getBarrier (const Char8 *szName,
00203 const Char8 *szTypeName = "OSGBarrier");
00204 Lock *getLock (const Char8 *szName,
00205 const Char8 *szTypeName = "OSGLock");
00206 LockPool *getLockPool (const Char8 *szName,
00207 const Char8 *szTypeName = "OSGLockPool");
00208
00209 BaseThread *findThread (const Char8 *szName);
00210 Barrier *findBarrier (const Char8 *szName);
00211 Lock *findLock (const Char8 *szName);
00212 LockPool *findLockPool(const Char8 *szName);
00213
00214 #if defined(OSG_USE_SPROC)
00215
00216
00220 usptr_t *getArena(void);
00221 #endif
00222
00224
00225
00226 protected:
00227
00228 static bool initialize (void );
00229 static bool terminate (void );
00230
00231 void removeThread (BaseThread *pThread );
00232 void removeBarrier (Barrier *pBarrier );
00233 void removeLock (Lock *pLock );
00234 void removeLockPool (LockPool *pLockPool);
00235
00236 UInt32 registerThreadType (MPThreadType *pType );
00237 UInt32 registerBarrierType (MPBarrierType *pType );
00238 UInt32 registerLockType (MPLockType *pType );
00239 UInt32 registerLockPoolType(MPLockPoolType *pType );
00240
00241 bool init (void );
00242 bool shutdown (void );
00243
00244
00248 ThreadManager(void);
00249
00251
00255 virtual ~ThreadManager(void);
00256
00258
00259
00260 private:
00261
00262
00266 friend class MPThreadType;
00267 friend class MPBarrierType;
00268 friend class MPLockType;
00269 friend class MPLockPoolType;
00270
00271 friend class BaseThread;
00272 friend class Barrier;
00273 friend class Lock;
00274 friend class LockPool;
00275
00276 OSG_BASE_DLLMAPPING
00277 friend bool osgInit(Int32 argc, Char8 **argv,
00278 UInt16 major, UInt16 minor, UInt16 release,
00279 bool debug, bool dll, bool mt);
00280
00281 OSG_BASE_DLLMAPPING
00282 friend bool osgExit(void );
00283
00285
00289 static ThreadManager *_pThreadManager;
00290 static BaseThread *_pAppThread;
00291
00292 static bool _bShutdownInProgress;
00293
00294 static UInt32 _uiNumAspects;
00295
00296 #ifdef OSG_RUNTIME_NUM_ASPECTS
00297 static bool _bNumAspectSet;
00298 #endif
00299
00301
00305 ThreadStore _sThreadStore;
00306 BarrierStore _sBarrierStore;
00307 LockStore _sLockStore;
00308 LockPoolStore _sLockPoolStore;
00309
00310 Lock *_storePLock;
00311
00312 static Char8 *_szAppThreadType;
00313
00314 #if defined(OSG_USE_SPROC)
00315 usptr_t *_pArena;
00316 #endif
00317
00319
00320
00322 ThreadManager (const ThreadManager &source);
00324 void operator =(const ThreadManager &source);
00325 };
00326
00327 OSG_END_NAMESPACE
00328
00329 #include <OSGThreadManager.inl>
00330
00331 #define OSGTHREADMANAGER_HEADER_CVSID "@(#)$Id: $"
00332
00333 #endif
00334
00335