Added functions malloc_referenced[_{acquire,release}]() that implement

reference counted memory allocations. Can be used for sharing immutable
structures.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24666 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2008-03-29 23:55:34 +00:00
parent 999cd0acee
commit 3bef7d0252
2 changed files with 41 additions and 0 deletions

View File

@ -26,6 +26,10 @@ void *memalign(size_t alignment, size_t size);
void deferred_free(void* block);
void* malloc_referenced(size_t size);
void* malloc_referenced_acquire(void* data);
void malloc_referenced_release(void* data);
status_t heap_init(addr_t heapBase, size_t heapSize);
status_t heap_init_post_sem();
status_t heap_init_post_thread();

View File

@ -1273,3 +1273,40 @@ deferred_free(void* block)
InterruptsSpinLocker _(sDeferredFreeListLock);
sDeferredFreeList.Add(entry);
}
void*
malloc_referenced(size_t size)
{
int32* referencedData = (int32*)malloc(size + 4);
if (referencedData == NULL)
return NULL;
*referencedData = 1;
return referencedData + 1;
}
void*
malloc_referenced_acquire(void* data)
{
if (data != NULL) {
int32* referencedData = (int32*)data - 1;
atomic_add(referencedData, 1);
}
return data;
}
void
malloc_referenced_release(void* data)
{
if (data == NULL)
return;
int32* referencedData = (int32*)data - 1;
if (atomic_add(referencedData, -1) < 1)
free(referencedData);
}