Mercurial > lbo > hg > ylisp
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; }