/* * Copyright (c) 2026, Chloe M. * Provided under the BSD-3 clause. * * Description: Object manager cache * Author: Chloe M. */ #include #include VOID ObReclaimToCache(OBJECT_CACHE *Cache, ST_OBJECT *Object) { ST_OBJECT *Last; if (Cache == NULL || Object == NULL) { return; } /* Can only reclaim when refcount hits zero */ if (Object->RefCount != 0) { return; } /* Insert the object */ Object->CacheNext = NULL; if (Cache->First == NULL || Cache->Last == NULL) { Cache->First = Object; Cache->Last = Object; } else { Last = Cache->Last; Last->CacheNext = Object; Cache->Last = Object; } ++Cache->EntryCount; } VOID ObInitCache(OBJECT_CACHE *Cache) { if (Cache == NULL) { return; } Cache->EntryCount = 0; Cache->First = NULL; Cache->Last = NULL; } ST_OBJECT * ObPopFromCache(OBJECT_CACHE *Cache) { ST_OBJECT *First; if (Cache == NULL) { return NULL; } First = Cache->First; if (First == NULL) { return NULL; } Cache->First = First->CacheNext; RtlMemSet(First, 0, sizeof(*First)); return First; }