From: Carsten N. <car...@gm...> - 2010-02-23 16:25:05
|
Hello Georg, Georg Stevenson wrote: > One of them is following code snippet which occurs in some of the > multithreading relevant classes: > > TransformationPipeMT.h: > ... > OSG::Lock* pipeLock; > ... > > TransformationPipeMT.cpp: > ... > #ifdef OPENSG_18 > pipeLock = dynamic_cast<OSG::Lock*> > (OSG::ThreadManager::the()->getLock(lockName.c_str())); > #else > #ifdef OPENSG_20 > //TODO > #endif > .. > > First: i can't find a way to use the given LockTransitPtr (from getLock > ) as Lock*. the threading/synchronization objects are now correctly ref counted as well, so you need to hold them with e.g. OSG::LockRefPtr. The *TransitPtr types exist solely to prevent you from getting a raw C ptr because then the TransitPtr d'tor would decrement the objects ref count and your raw C ptr would point to a deleted object. The above needs to become: TransformationPipeMT.h: OSG::LockRefPtr pipeLock; TransformationPipeMT.cpp: pipeLock = OSG::dynamic_pointer_cast<OSG::Lock>( OSG::ThreadManager::the()->getLock(lockname.c_str(), false)); > Second: getLock takes Argument bGlobal (true||false) which i can't find > documentation for. It indicates whether the object is held in a global variable (one that is only destroyed after osgExit has already run), because for those the ThreadManager behaves slightly differently when it shuts down. Cheers, Carsten |