Files
2024-05-18 23:53:26 +08:00

79 lines
2.0 KiB
C++

/**
* @file kUserAlloc.cpp
*
* @internal
* Copyright (C) 2005-2021 by LMI Technologies Inc.
* Licensed under the MIT License.
* Redistributed files must retain the above copyright notice.
*/
#define K_PLATFORM
#include <kApi/Utils/kUserAlloc.h>
#include <kApi/kApiLib.h>
kBeginClassEx(k, kUserAlloc)
kAddPrivateVMethod(kUserAlloc, kObject, VRelease)
kAddPrivateVMethod(kUserAlloc, kAlloc, VGet)
kAddPrivateVMethod(kUserAlloc, kAlloc, VFree)
kEndClassEx()
kFx(kStatus) kUserAlloc_Construct(kUserAlloc* object, kApiMemAllocFx allocFx, kApiMemFreeFx freeFx, kPointer provider, kAlloc allocator)
{
kUserAlloc output = kNULL;
kType type = kTypeOf(kUserAlloc);
kStatus status;
if (kIsNull(allocator))
{
//this type can be used before the type system is fully initialized
kCheck(xkSysMemAlloc(sizeof(kUserAllocClass), &output));
}
else
{
kCheck(kAlloc_GetObject(allocator, kTypeOf(kUserAlloc), &output));
}
if (!kSuccess(status = xkUserAlloc_Init(output, type, allocFx, freeFx, provider, allocator)))
{
xkSysMemFree(output);
return status;
}
*object = output;
return kOK;
}
kFx(kStatus) xkUserAlloc_Init(kUserAlloc object, kType type, kApiMemAllocFx allocFx, kApiMemFreeFx freeFx, kPointer provider, kAlloc alloc)
{
kObjR(kUserAlloc, object);
kCheck(kAlloc_Init(object, type, alloc));
obj->allocFx = allocFx;
obj->freeFx = freeFx;
obj->provider = provider;
return kOK;
}
kFx(kStatus) xkUserAlloc_VRelease(kUserAlloc object)
{
kCheck(kAlloc_VRelease(object));
return kOK;
}
kFx(kStatus) xkUserAlloc_VGet(kUserAlloc object, kSize size, void* mem, kMemoryAlignment alignment)
{
kObj(kUserAlloc, object);
return obj->allocFx(obj->provider, size, mem, alignment);
}
kFx(kStatus) xkUserAlloc_VFree(kUserAlloc object, void* mem)
{
kObj(kUserAlloc, object);
return obj->freeFx(obj->provider, mem);
}