X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/744490a681be7356efba4160bfb29a3e76e85888..6825df8cecb050a42804ad861bf67e8e42f634ea:/src/pulsecore/memblock.c diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c index f38b17c6..acfb481e 100644 --- a/src/pulsecore/memblock.c +++ b/src/pulsecore/memblock.c @@ -42,7 +42,10 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -67,8 +70,8 @@ struct pa_memblock { pa_memblock_type_t type; - pa_bool_t read_only:1; - pa_bool_t is_silence:1; + bool read_only:1; + bool is_silence:1; pa_atomic_ptr_t data; size_t length; @@ -82,7 +85,7 @@ struct pa_memblock { pa_free_cb_t free_cb; } user; - struct { + struct { uint32_t id; pa_memimport_segment *segment; } imported; @@ -226,13 +229,13 @@ static pa_memblock *memblock_new_appended(pa_mempool *p, size_t length) { /* If -1 is passed as length we choose the size for the caller. */ if (length == (size_t) -1) - length = p->block_size - PA_ALIGN(sizeof(pa_memblock)); + length = pa_mempool_block_size_max(p); b = pa_xmalloc(PA_ALIGN(sizeof(pa_memblock)) + length); PA_REFCNT_INIT(b); b->pool = p; b->type = PA_MEMBLOCK_APPENDED; - b->read_only = b->is_silence = FALSE; + b->read_only = b->is_silence = false; pa_atomic_ptr_store(&b->data, (uint8_t*) b + PA_ALIGN(sizeof(pa_memblock))); b->length = length; pa_atomic_store(&b->n_acquired, 0); @@ -258,7 +261,7 @@ static struct mempool_slot* mempool_allocate_slot(pa_mempool *p) { slot = (struct mempool_slot*) ((uint8_t*) p->memory.ptr + (p->block_size * (size_t) idx)); if (!slot) { - if (pa_log_ratelimit()) + if (pa_log_ratelimit(PA_LOG_DEBUG)) pa_log_debug("Pool full"); pa_atomic_inc(&p->stat.n_pool_full); return NULL; @@ -348,7 +351,7 @@ pa_memblock *pa_memblock_new_pool(pa_mempool *p, size_t length) { PA_REFCNT_INIT(b); b->pool = p; - b->read_only = b->is_silence = FALSE; + b->read_only = b->is_silence = false; b->length = length; pa_atomic_store(&b->n_acquired, 0); pa_atomic_store(&b->please_signal, 0); @@ -358,7 +361,7 @@ pa_memblock *pa_memblock_new_pool(pa_mempool *p, size_t length) { } /* No lock necessary */ -pa_memblock *pa_memblock_new_fixed(pa_mempool *p, void *d, size_t length, pa_bool_t read_only) { +pa_memblock *pa_memblock_new_fixed(pa_mempool *p, void *d, size_t length, bool read_only) { pa_memblock *b; pa_assert(p); @@ -373,7 +376,7 @@ pa_memblock *pa_memblock_new_fixed(pa_mempool *p, void *d, size_t length, pa_boo b->pool = p; b->type = PA_MEMBLOCK_FIXED; b->read_only = read_only; - b->is_silence = FALSE; + b->is_silence = false; pa_atomic_ptr_store(&b->data, d); b->length = length; pa_atomic_store(&b->n_acquired, 0); @@ -384,7 +387,7 @@ pa_memblock *pa_memblock_new_fixed(pa_mempool *p, void *d, size_t length, pa_boo } /* No lock necessary */ -pa_memblock *pa_memblock_new_user(pa_mempool *p, void *d, size_t length, pa_free_cb_t free_cb, pa_bool_t read_only) { +pa_memblock *pa_memblock_new_user(pa_mempool *p, void *d, size_t length, pa_free_cb_t free_cb, bool read_only) { pa_memblock *b; pa_assert(p); @@ -400,7 +403,7 @@ pa_memblock *pa_memblock_new_user(pa_mempool *p, void *d, size_t length, pa_free b->pool = p; b->type = PA_MEMBLOCK_USER; b->read_only = read_only; - b->is_silence = FALSE; + b->is_silence = false; pa_atomic_ptr_store(&b->data, d); b->length = length; pa_atomic_store(&b->n_acquired, 0); @@ -413,7 +416,7 @@ pa_memblock *pa_memblock_new_user(pa_mempool *p, void *d, size_t length, pa_free } /* No lock necessary */ -pa_bool_t pa_memblock_is_read_only(pa_memblock *b) { +bool pa_memblock_is_read_only(pa_memblock *b) { pa_assert(b); pa_assert(PA_REFCNT_VALUE(b) > 0); @@ -421,7 +424,7 @@ pa_bool_t pa_memblock_is_read_only(pa_memblock *b) { } /* No lock necessary */ -pa_bool_t pa_memblock_is_silence(pa_memblock *b) { +bool pa_memblock_is_silence(pa_memblock *b) { pa_assert(b); pa_assert(PA_REFCNT_VALUE(b) > 0); @@ -429,7 +432,7 @@ pa_bool_t pa_memblock_is_silence(pa_memblock *b) { } /* No lock necessary */ -void pa_memblock_set_is_silence(pa_memblock *b, pa_bool_t v) { +void pa_memblock_set_is_silence(pa_memblock *b, bool v) { pa_assert(b); pa_assert(PA_REFCNT_VALUE(b) > 0); @@ -437,7 +440,7 @@ void pa_memblock_set_is_silence(pa_memblock *b, pa_bool_t v) { } /* No lock necessary */ -pa_bool_t pa_memblock_ref_is_one(pa_memblock *b) { +bool pa_memblock_ref_is_one(pa_memblock *b) { int r; pa_assert(b); @@ -456,6 +459,13 @@ void* pa_memblock_acquire(pa_memblock *b) { return pa_atomic_ptr_load(&b->data); } +/* No lock necessary */ +void *pa_memblock_acquire_chunk(const pa_memchunk *c) { + pa_assert(c); + + return (uint8_t *) pa_memblock_acquire(c->memblock) + c->index; +} + /* No lock necessary, in corner cases locks by its own */ void pa_memblock_release(pa_memblock *b) { int r; @@ -515,8 +525,8 @@ static void memblock_free(pa_memblock *b) { case PA_MEMBLOCK_APPENDED: - /* We could attached it unused_memblocks, but that would - * probably waste some considerable memory */ + /* We could attach it to unused_memblocks, but that would + * probably waste some considerable amount of memory */ pa_xfree(b); break; @@ -531,9 +541,7 @@ static void memblock_free(pa_memblock *b) { pa_mutex_lock(import->mutex); - pa_assert_se(pa_hashmap_remove( - import->blocks, - PA_UINT32_TO_PTR(b->per_type.imported.id))); + pa_assert_se(pa_hashmap_remove(import->blocks, PA_UINT32_TO_PTR(b->per_type.imported.id))); pa_assert(segment->n_blocks >= 1); if (-- segment->n_blocks <= 0) @@ -552,7 +560,7 @@ static void memblock_free(pa_memblock *b) { case PA_MEMBLOCK_POOL_EXTERNAL: case PA_MEMBLOCK_POOL: { struct mempool_slot *slot; - pa_bool_t call_free; + bool call_free; pa_assert_se(slot = mempool_slot_by_ptr(b->pool, pa_atomic_ptr_load(&b->data))); @@ -630,7 +638,7 @@ static void memblock_make_local(pa_memblock *b) { pa_atomic_ptr_store(&b->data, new_data); b->type = PA_MEMBLOCK_POOL_EXTERNAL; - b->read_only = FALSE; + b->read_only = false; goto finish; } @@ -641,7 +649,7 @@ static void memblock_make_local(pa_memblock *b) { pa_atomic_ptr_store(&b->data, pa_xmemdup(pa_atomic_ptr_load(&b->data), b->length)); b->type = PA_MEMBLOCK_USER; - b->read_only = FALSE; + b->read_only = false; finish: pa_atomic_inc(&b->pool->stat.n_allocated_by_type[b->type]); @@ -693,9 +701,7 @@ static void memblock_replace_import(pa_memblock *b) { pa_mutex_lock(import->mutex); - pa_assert_se(pa_hashmap_remove( - import->blocks, - PA_UINT32_TO_PTR(b->per_type.imported.id))); + pa_assert_se(pa_hashmap_remove(import->blocks, PA_UINT32_TO_PTR(b->per_type.imported.id))); memblock_make_local(b); @@ -706,15 +712,12 @@ static void memblock_replace_import(pa_memblock *b) { pa_mutex_unlock(import->mutex); } -pa_mempool* pa_mempool_new(pa_bool_t shared, size_t size) { +pa_mempool* pa_mempool_new(bool shared, size_t size) { pa_mempool *p; char t1[PA_BYTES_SNPRINT_MAX], t2[PA_BYTES_SNPRINT_MAX]; p = pa_xnew(pa_mempool, 1); - p->mutex = pa_mutex_new(TRUE, TRUE); - p->semaphore = pa_semaphore_new(0); - p->block_size = PA_PAGE_ALIGN(PA_MEMPOOL_SLOT_SIZE); if (p->block_size < PA_PAGE_SIZE) p->block_size = PA_PAGE_SIZE; @@ -746,6 +749,9 @@ pa_mempool* pa_mempool_new(pa_bool_t shared, size_t size) { PA_LLIST_HEAD_INIT(pa_memimport, p->imports); PA_LLIST_HEAD_INIT(pa_memexport, p->exports); + p->mutex = pa_mutex_new(true, true); + p->semaphore = pa_semaphore_new(0); + p->free_slots = pa_flist_new(p->n_blocks); return p; @@ -868,13 +874,13 @@ int pa_mempool_get_shm_id(pa_mempool *p, uint32_t *id) { } /* No lock necessary */ -pa_bool_t pa_mempool_is_shared(pa_mempool *p) { +bool pa_mempool_is_shared(pa_mempool *p) { pa_assert(p); return !!p->memory.shared; } -/* For recieving blocks from other nodes */ +/* For receiving blocks from other nodes */ pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata) { pa_memimport *i; @@ -882,7 +888,7 @@ pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void pa_assert(cb); i = pa_xnew(pa_memimport, 1); - i->mutex = pa_mutex_new(TRUE, TRUE); + i->mutex = pa_mutex_new(true, true); i->pool = p; i->segments = pa_hashmap_new(NULL, NULL); i->blocks = pa_hashmap_new(NULL, NULL); @@ -958,8 +964,8 @@ void pa_memimport_free(pa_memimport *i) { pa_mutex_unlock(i->pool->mutex); - pa_hashmap_free(i->blocks, NULL, NULL); - pa_hashmap_free(i->segments, NULL, NULL); + pa_hashmap_free(i->blocks); + pa_hashmap_free(i->segments); pa_mutex_free(i->mutex); @@ -996,8 +1002,8 @@ pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_i PA_REFCNT_INIT(b); b->pool = i->pool; b->type = PA_MEMBLOCK_IMPORTED; - b->read_only = TRUE; - b->is_silence = FALSE; + b->read_only = true; + b->is_silence = false; pa_atomic_ptr_store(&b->data, (uint8_t*) seg->memory.ptr + offset); b->length = size; pa_atomic_store(&b->n_acquired, 0); @@ -1048,7 +1054,7 @@ pa_memexport* pa_memexport_new(pa_mempool *p, pa_memexport_revoke_cb_t cb, void return NULL; e = pa_xnew(pa_memexport, 1); - e->mutex = pa_mutex_new(TRUE, TRUE); + e->mutex = pa_mutex_new(true, true); e->pool = p; PA_LLIST_HEAD_INIT(struct memexport_slot, e->free_slots); PA_LLIST_HEAD_INIT(struct memexport_slot, e->used_slots);