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:
@@ -26,6 +26,10 @@ void *memalign(size_t alignment, size_t size);
|
|||||||
|
|
||||||
void deferred_free(void* block);
|
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(addr_t heapBase, size_t heapSize);
|
||||||
status_t heap_init_post_sem();
|
status_t heap_init_post_sem();
|
||||||
status_t heap_init_post_thread();
|
status_t heap_init_post_thread();
|
||||||
|
|||||||
@@ -1273,3 +1273,40 @@ deferred_free(void* block)
|
|||||||
InterruptsSpinLocker _(sDeferredFreeListLock);
|
InterruptsSpinLocker _(sDeferredFreeListLock);
|
||||||
sDeferredFreeList.Add(entry);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user