GPBase& GPBase::assign (GPEnabled *nptr) { if (nptr && atomicIncrement(&nptr->count) <= 0) nptr = 0; GPEnabled *optr = (GPEnabled*)atomicExchangePointer((void**)&ptr, (void*)nptr); if (optr) optr->unref(); return *this; }
GPBase& GPBase::assign (GPEnabled *nptr) { if (nptr) nptr->ref(); int volatile *locka = locks+LOCKIDX(this); atomicAcquireOrSpin(locka); GPEnabled *old = ptr; ptr = nptr; atomicRelease(locka); if (old) old->unref(); return *this; }