bc11f9b58f
Signed-off-by: Chloe M. <chloe@mensia.org>
70 lines
1.2 KiB
C
70 lines
1.2 KiB
C
/*
|
|
* Copyright (c) 2026, Chloe M.
|
|
* Provided under the BSD-3 clause.
|
|
*
|
|
* Description: Object manager cache
|
|
* Author: Chloe M.
|
|
*/
|
|
|
|
#include <ob/cache.h>
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|