/*
 * 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;
}
