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:
parent
999cd0acee
commit
3bef7d0252
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user