//Retain (extension) void x_retain(void *in_o) { memory_pvt *r = (memory_pvt*)in_o; #ifdef CELL __sync_fetch_and_add(&r[-1].rc, 1); #else OSAtomicAdd32Barrier(1, &r[-1].rc); #endif }
//------------------------------------------------------------------------ int32 FAtomicAdd (volatile int32& var, int32 d) { #if WINDOWS return InterlockedExchangeAdd (&var, d); #elif MAC return OSAtomicAdd32Barrier (d, NATIVE_ATOMIC_TYPE &var) - d; #else int32 v = var; var += d; return v; #endif }
//Replacment free function void x_free(void *in_o) { memory_pvt *r = (memory_pvt*)in_o; #ifdef CELL int nVal = __sync_fetch_and_add(&r[-1].rc, -1) -1; #else int nVal = OSAtomicAdd32Barrier(-1, &r[-1].rc); #endif if (nVal == 0) { r[-1].kill(in_o); free(r-1); } }
intptr_t cpu_AtomicAdd(volatile intptr_t* location, intptr_t increment) { cassert(sizeof(intptr_t) == sizeof(int32_t)); return OSAtomicAdd32Barrier(increment, (volatile int32_t*)location); }
int32_t __sync_sub_and_fetch_4 (int32_t *ptr, int32_t value, ...) { return OSAtomicAdd32Barrier(-value, ptr); }
int32_t __sync_fetch_and_add_4 (int32_t *ptr, int32_t value, ...) { return OSAtomicAdd32Barrier(value, ptr) - value; }
int32_t OSAtomicDecrement32Barrier(volatile int32_t* target) { OSAtomicAdd32Barrier(-1,target); }
int32_t TS_AtomicSub(TS_Atomic32 * aTo, int32_t aToSub){ return OSAtomicAdd32Barrier(-aToSub, aTo); }
int32_t TS_AtomicAdd(TS_Atomic32 * aTo, int32_t aToAdd){ return OSAtomicAdd32Barrier(aToAdd, aTo); }