/* * PinBuffer -- make buffer unavailable for replacement. * * This should be applied only to shared buffers, never local ones. * Bufmgr lock must be held by caller. */ void PinBuffer(BufferDesc *buf) { int b = BufferDescriptorGetBuffer(buf) - 1; if (buf->refcount == 0) { IsInQueue(buf); /* remove from freelist queue */ /********* BEGIN NEW CODE ************/ if ( buf->buf_id == HeadPosition ) { HeadPosition = buf->freeNext; // remove the head buffer, update position } /********* END NEW CODE ************/ BufferDescriptors[buf->freeNext].freePrev = buf->freePrev; BufferDescriptors[buf->freePrev].freeNext = buf->freeNext; buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR; /* mark buffer as no longer free */ buf->flags &= ~BM_FREE; } else IsNotInQueue(buf); if (PrivateRefCount[b] == 0) buf->refcount++; PrivateRefCount[b]++; Assert(PrivateRefCount[b] > 0); }
void FutexNode::SetAsSingletonList() { DEBUG_ASSERT(!IsInQueue()); queue_prev_ = this; queue_next_ = this; }
FutexNode::~FutexNode() { LTRACE_ENTRY; DEBUG_ASSERT(!IsInQueue()); }