memblock: rearrange locking order

This commit is contained in:
Lennart Poettering 2009-07-01 20:20:55 +02:00
parent efdd3d054b
commit 28e4625a52

View file

@ -257,7 +257,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)); slot = (struct mempool_slot*) ((uint8_t*) p->memory.ptr + (p->block_size * (size_t) idx));
if (!slot) { if (!slot) {
pa_log_info("Pool full"); pa_log_debug("Pool full");
pa_atomic_inc(&p->stat.n_pool_full); pa_atomic_inc(&p->stat.n_pool_full);
return NULL; return NULL;
} }
@ -509,13 +509,16 @@ static void memblock_free(pa_memblock *b) {
/* FIXME! This should be implemented lock-free */ /* FIXME! This should be implemented lock-free */
segment = b->per_type.imported.segment; pa_assert_se(segment = b->per_type.imported.segment);
pa_assert(segment); pa_assert_se(import = segment->import);
import = segment->import;
pa_assert(import);
pa_mutex_lock(import->mutex); pa_mutex_lock(import->mutex);
pa_hashmap_remove(import->blocks, PA_UINT32_TO_PTR(b->per_type.imported.id));
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) if (-- segment->n_blocks <= 0)
segment_detach(segment); segment_detach(segment);
@ -525,6 +528,7 @@ static void memblock_free(pa_memblock *b) {
if (pa_flist_push(PA_STATIC_FLIST_GET(unused_memblocks), b) < 0) if (pa_flist_push(PA_STATIC_FLIST_GET(unused_memblocks), b) < 0)
pa_xfree(b); pa_xfree(b);
break; break;
} }
@ -657,7 +661,8 @@ pa_memblock *pa_memblock_will_need(pa_memblock *b) {
/* Self-locked. This function is not multiple-caller safe */ /* Self-locked. This function is not multiple-caller safe */
static void memblock_replace_import(pa_memblock *b) { static void memblock_replace_import(pa_memblock *b) {
pa_memimport_segment *seg; pa_memimport_segment *segment;
pa_memimport *import;
pa_assert(b); pa_assert(b);
pa_assert(b->type == PA_MEMBLOCK_IMPORTED); pa_assert(b->type == PA_MEMBLOCK_IMPORTED);
@ -667,23 +672,22 @@ static void memblock_replace_import(pa_memblock *b) {
pa_atomic_dec(&b->pool->stat.n_imported); pa_atomic_dec(&b->pool->stat.n_imported);
pa_atomic_sub(&b->pool->stat.imported_size, (int) b->length); pa_atomic_sub(&b->pool->stat.imported_size, (int) b->length);
seg = b->per_type.imported.segment; pa_assert_se(segment = b->per_type.imported.segment);
pa_assert(seg); pa_assert_se(import = segment->import);
pa_assert(seg->import);
pa_mutex_lock(seg->import->mutex); pa_mutex_lock(import->mutex);
pa_hashmap_remove( pa_hashmap_remove(
seg->import->blocks, import->blocks,
PA_UINT32_TO_PTR(b->per_type.imported.id)); PA_UINT32_TO_PTR(b->per_type.imported.id));
memblock_make_local(b); memblock_make_local(b);
if (-- seg->n_blocks <= 0) { pa_assert(segment->n_blocks >= 1);
pa_mutex_unlock(seg->import->mutex); if (-- segment->n_blocks <= 0)
segment_detach(seg); segment_detach(segment);
} else
pa_mutex_unlock(seg->import->mutex); pa_mutex_unlock(import->mutex);
} }
pa_mempool* pa_mempool_new(pa_bool_t shared, size_t size) { pa_mempool* pa_mempool_new(pa_bool_t shared, size_t size) {