File SharedPtr.c

File List > core > SharedPtr.c

Go to the documentation of this file

#include "SharedPtr.h"
#include <stdlib.h>
#include "IntTypes.h"
#include "PlatformDefs.h"

struct SharedPtrHeader
{
#if GAME_PTR_SIZE == 8
    SharedPtrDestuctorFn pDtor;
    i64 reference;
#elif GAME_PTR_SIZE == 4
    SharedPtrDestuctorFn pDtor;
    i64 reference;
    i32 padding;
#endif 

};

void* Sptr_New(size_t size, SharedPtrDestuctorFn dtor)
{
    struct SharedPtrHeader* ptr = malloc(size + sizeof(struct SharedPtrHeader));
    ptr->reference = 1;
    ptr->pDtor = dtor;
    return ptr + 1;;
}

void Sptr_AddRef(void* pointer)
{
    struct SharedPtrHeader* ptr = (struct SharedPtrHeader*)pointer - 1;
    ptr->reference++;
}

i64 Sptr_GetRefCount(void* pointer)
{
    struct SharedPtrHeader* ptr = (struct SharedPtrHeader*)pointer - 1;
    return ptr->reference;
}

void Sptr_RemoveRef(void* pointer)
{

    struct SharedPtrHeader* ptr = (struct SharedPtrHeader*)pointer - 1;
    ptr->reference--;
    if (ptr->reference <= 0)
    {
        if (ptr->pDtor)
        {
            ptr->pDtor(ptr + 1);
        }
        free(ptr);
    }
}