Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}