view src/base/ptr.c @ 185:db386ec98dc3

base/ptr: Add yptr_rc_t implementation
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 29 Sep 2019 14:42:18 +0200
parents
children
line wrap: on
line source

#include "ptr.h"

#include <assert.h>
#include <stdint.h>

struct yptr_rc_counter {
    yptr_delete_handler_t dh;
    int32_t typesize;
    int32_t count;
};

yptr_rc_t yptr_rc_new(void* ptr, size_t size,
                      yptr_delete_handler_t deletehandler) {
    yptr_rc_t rcp;
    rcp.ptr = ptr;
    rcp.count = malloc(sizeof(struct yptr_rc_counter));
    rcp.count->dh = deletehandler;
    rcp.count->typesize = size;
    rcp.count->count = 1;
    return rcp;
}

void* yptr_rc_deref(yptr_rc_t rcp) { return rcp.ptr; }

yptr_rc_t yptr_rc_clone(yptr_rc_t rcp) {
    rcp.count->count++;
    return rcp;
}

void yptr_rc_delete(yptr_rc_t rcp) {
    rcp.count->count--;
    assert(rcp.count->count >= 0);
    if (rcp.count->count == 0) {
        if (rcp.count->dh)
            (rcp.count->dh)(rcp.ptr);
        free(rcp.ptr);
        free(rcp.count);
    }
}

size_t yptr_rc_refs(yptr_rc_t rcp) {
    return rcp.count->count;
}