MCPcopy Create free account
hub / github.com/GarageGames/Torque3D / trySetFromTo

Method trySetFromTo

Engine/source/platform/threads/threadSafeRefCount.h:270–310  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

268
269template< class T >
270bool ThreadSafeRef< T >::trySetFromTo( T* oldVal, T* const volatile& newVal, ETag tag )
271{
272 bool setTag = false;
273 bool getTag = false;
274 bool isTagged = isTaggedPtr( oldVal );
275
276 switch( tag )
277 {
278 case TAG_PreserveOld: setTag = isTaggedPtr( oldVal ); break;
279 case TAG_PreserveNew: setTag = isTaggedPtr( newVal ); break;
280 case TAG_Set: setTag = true; break;
281 case TAG_Unset: setTag = false; break;
282 case TAG_SetOrFail: setTag = true; getTag = true; break;
283 case TAG_UnsetOrFail: setTag = false; getTag = true; break;
284 case TAG_FailIfSet: if( isTagged ) return false; break;
285 case TAG_FailIfUnset: if( !isTagged ) return false; break;
286 }
287
288 T* newValPtr = ( setTag
289 ? getTaggedPtr( ThreadSafeRefCount< T >::safeRead( newVal ) )
290 : getUntaggedPtr( ThreadSafeRefCount< T >::safeRead( newVal ) ) );
291
292 if( dCompareAndSwap( mPtr,
293 ( getTag
294 ? ( setTag
295 ? getUntaggedPtr( oldVal )
296 : getTaggedPtr( oldVal ) )
297 : oldVal ),
298 newValPtr ) )
299 {
300 if( getUntaggedPtr( oldVal ) )
301 getUntaggedPtr( oldVal )->release();
302 return true;
303 }
304 else
305 {
306 if( getUntaggedPtr( newValPtr ) )
307 getUntaggedPtr( newValPtr )->release();
308 return false;
309 }
310}
311
312template< class T >
313inline bool ThreadSafeRef< T >::trySetFromTo( T* oldVal, const ThisType& newVal, ETag tag )

Callers 9

insertMethod · 0.80
helpDeleteMethod · 0.80
getHeadMethod · 0.80
getTailMethod · 0.80
pushFrontMethod · 0.80
pushBackMethod · 0.80
tryPopFrontMethod · 0.80
tryPopBackMethod · 0.80
TEST_FIXFunction · 0.80

Calls 2

dCompareAndSwapFunction · 0.50
releaseMethod · 0.45

Tested by 1

TEST_FIXFunction · 0.64