private static PgHdr pcache1Alloc(int nByte) { PgHdr p = null; Debug.Assert(MutexEx.NotHeld(pcache1.grp.mutex)); StatusEx.sqlite3StatusSet(StatusEx.STATUS.PAGECACHE_SIZE, nByte); if (nByte <= pcache1.szSlot) { MutexEx.Enter(pcache1.mutex); p = pcache1.pFree._PgHdr; if (p != null) { pcache1.pFree = pcache1.pFree.pNext; pcache1.nFreeSlot--; pcache1.bUnderPressure = pcache1.nFreeSlot < pcache1.nReserve; Debug.Assert(pcache1.nFreeSlot >= 0); StatusEx.sqlite3StatusAdd(StatusEx.STATUS.PAGECACHE_USED, 1); } MutexEx.Leave(pcache1.mutex); } if (p == null) { // Memory is not available in the SQLITE_CONFIG_PAGECACHE pool. Get it from sqlite3Malloc instead. p = new PgHdr(); { var sz = nByte; MutexEx.Enter(pcache1.mutex); StatusEx.sqlite3StatusAdd(StatusEx.STATUS.PAGECACHE_OVERFLOW, sz); MutexEx.Leave(pcache1.mutex); } SysEx.sqlite3MemdebugSetType(p, SysEx.MEMTYPE.PCACHE); } return(p); }
internal bool removeFromSharingList() { #if !SQLITE_OMIT_SHARED_CACHE MutexEx pMaster; BtShared list; bool removed = false; Debug.Assert(MutexEx.NotHeld(Mutex)); pMaster = MutexEx.Alloc(MUTEX.STATIC_MASTER); MutexEx.Enter(pMaster); nRef--; if (nRef <= 0) { if (SysEx.getGLOBAL <BtShared>(Btree.s_sqlite3SharedCacheList) == this) { SysEx.setGLOBAL <BtShared>(Btree.s_sqlite3SharedCacheList, Next); } else { list = SysEx.getGLOBAL <BtShared>(Btree.s_sqlite3SharedCacheList); while (Check.ALWAYS(list) != null && list.Next != this) { list = list.Next; } if (Check.ALWAYS(list) != null) { list.Next = Next; } } if (MutexEx.SQLITE_THREADSAFE) { MutexEx.Free(Mutex); } removed = true; } MutexEx.Leave(pMaster); return(removed); #else return(true); #endif }