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; }
void GPEnabled::ref() { gcsCounter.lock(); count++; gcsCounter.unlock(); }
void GPEnabled::unref() { gcsCounter.lock(); if (! --count) count = -1; gcsCounter.unlock(); if (count < 0) destroy(); }
DjVuDebug& DjVuDebug::lock(int lvl, int noindent) { int threads_num=1; debug_lock.lock(); // Get per-thread debug object long threadid = (long) GThread::current(); DjVuDebug &dbg = debug_map()[threadid]; threads_num=debug_map().size(); // Check level dbg.block = (lvl > debug_level); // Output thread id and indentation if (! noindent) { if (threads_num>1) dbg.format("[T%d] ", dbg.id); int ind = dbg.indent; char buffer[257]; memset(buffer,' ', sizeof(buffer)-1); buffer[sizeof(buffer)-1] = 0; while (ind > (int)sizeof(buffer)-1) { dbg.format("%s", buffer); ind -= sizeof(buffer)-1; } if (ind > 0) { buffer[ind] = 0; dbg.format("%s", buffer); } } // Return return dbg; }
void DjVuDebug::unlock() { debug_lock.unlock(); }