Files
SystemPaw3/paw/stos/ob/ob.c
T
Chloe M. bc11f9b58f stos: ob: Add object cache groundwork
Signed-off-by: Chloe M. <chloe@mensia.org>
2026-06-25 17:50:43 +00:00

102 lines
1.9 KiB
C

/*
* Copyright (c) 2026, Chloe M.
* Provided under the BSD-3 clause.
*
* Description: Object manager
* Author: Chloe M.
*/
#include <ob/object.h>
#include <ex/pool.h>
#include <ob/cache.h>
#include <string.h>
ST_STATUS
ObCreateDirectory(const CHAR *Name, ST_OBJECT **Result)
{
ST_STATUS Status;
ST_OBJECT *DirecObj;
OBJECT_DIRECTORY *Direc;
if (Name == NULL || Result == NULL) {
return STATUS_INVALID_PARAM;
}
Status = ObCreateObject(
Name,
OBJECT_TYPE_DIRECTORY,
NULL,
&DirecObj
);
if (Status != STATUS_SUCCESS) {
return Status;
}
Direc = ExAllocatePoolWithTag(
POOL_NON_PAGED,
sizeof(*Direc),
OBJECT_POOL_TAG
);
/* FIXME: Free DirecObj */
if (Direc == NULL) {
return STATUS_NO_MEMORY;
}
RtlMemSet(Direc, 0, sizeof(*Direc));
DirecObj->Data = Direc;
*Result = DirecObj;
return STATUS_SUCCESS;
}
ST_STATUS
ObCreateObject(const CHAR *Name, OBJECT_TYPE Type, VOID *Data, ST_OBJECT **Result)
{
ST_OBJECT *Object;
USIZE NameLen;
if (Name == NULL || Result == NULL) {
return STATUS_INVALID_PARAM;
}
NameLen = RtlStrLen(Name);
if (NameLen >= OBJECT_NAMESZ - 1) {
return STATUS_NAME_TOO_LONG;
}
Object = ExAllocatePoolWithTag(
POOL_NON_PAGED,
sizeof(*Object),
OBJECT_POOL_TAG
);
if (Object == NULL) {
return STATUS_NO_MEMORY;
}
RtlMemSet(Object, 0, sizeof(*Object));
RtlMemCpy(Object->Name, Name, NameLen);
Object->Name[NameLen] = '\0';
Object->RefCount = 1;
Object->Type = Type;
Object->Data = Data;
*Result = Object;
return STATUS_SUCCESS;
}
VOID
ObReclaimObject(ST_OBJECT *Object)
{
if (Object == NULL) {
return;
}
/* TODO: Decrement this atomically */
Object->RefCount -= 1;
if (Object->RefCount == 0) {
ObReclaimToCache(&gObCache, Object);
}
}