GPBase& GPBase::assign (const GPBase &sptr) { gcsCounter.lock(); if (sptr.ptr) { sptr.ptr->count++; } if (ptr) { GPEnabled *old = ptr; ptr = sptr.ptr; if (! --old->count) old->count = -1; gcsCounter.unlock(); if (old->count < 0) old->destroy(); } else { ptr = sptr.ptr; gcsCounter.unlock(); } return *this; }
GPBase& GPBase::assign (GPEnabled *nptr) { gcsCounter.lock(); if (nptr) { if (nptr->count >= 0) nptr->count++; else nptr = 0; } if (ptr) { GPEnabled *old = ptr; ptr = nptr; if (! --old->count) old->count = -1; gcsCounter.unlock(); if (old->count < 0) old->destroy(); } else { ptr = nptr; gcsCounter.unlock(); } return *this; }
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; }