diff options
Diffstat (limited to 'src/pulsecore/memblock.c')
| -rw-r--r-- | src/pulsecore/memblock.c | 66 | 
1 files changed, 48 insertions, 18 deletions
diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c index b43113d6..d9e1bf1c 100644 --- a/src/pulsecore/memblock.c +++ b/src/pulsecore/memblock.c @@ -31,6 +31,10 @@  #include <signal.h>  #include <errno.h> +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include <valgrind/memcheck.h> +#endif +  #include <pulse/xmalloc.h>  #include <pulse/def.h> @@ -158,14 +162,14 @@ static void stat_add(pa_memblock*b) {      pa_assert(b->pool);      pa_atomic_inc(&b->pool->stat.n_allocated); -    pa_atomic_add(&b->pool->stat.allocated_size, b->length); +    pa_atomic_add(&b->pool->stat.allocated_size, (int) b->length);      pa_atomic_inc(&b->pool->stat.n_accumulated); -    pa_atomic_add(&b->pool->stat.accumulated_size, b->length); +    pa_atomic_add(&b->pool->stat.accumulated_size, (int) b->length);      if (b->type == PA_MEMBLOCK_IMPORTED) {          pa_atomic_inc(&b->pool->stat.n_imported); -        pa_atomic_add(&b->pool->stat.imported_size, b->length); +        pa_atomic_add(&b->pool->stat.imported_size, (int) b->length);      }      pa_atomic_inc(&b->pool->stat.n_allocated_by_type[b->type]); @@ -181,14 +185,14 @@ static void stat_remove(pa_memblock *b) {      pa_assert(pa_atomic_load(&b->pool->stat.allocated_size) >= (int) b->length);      pa_atomic_dec(&b->pool->stat.n_allocated); -    pa_atomic_sub(&b->pool->stat.allocated_size,  b->length); +    pa_atomic_sub(&b->pool->stat.allocated_size, (int) b->length);      if (b->type == PA_MEMBLOCK_IMPORTED) {          pa_assert(pa_atomic_load(&b->pool->stat.n_imported) > 0);          pa_assert(pa_atomic_load(&b->pool->stat.imported_size) >= (int) b->length);          pa_atomic_dec(&b->pool->stat.n_imported); -        pa_atomic_sub(&b->pool->stat.imported_size, b->length); +        pa_atomic_sub(&b->pool->stat.imported_size, (int) b->length);      }      pa_atomic_dec(&b->pool->stat.n_allocated_by_type[b->type]); @@ -248,7 +252,7 @@ static struct mempool_slot* mempool_allocate_slot(pa_mempool *p) {          if ((unsigned) (idx = pa_atomic_inc(&p->n_init)) >= p->n_blocks)              pa_atomic_dec(&p->n_init);          else -            slot = (struct mempool_slot*) ((uint8_t*) p->memory.ptr + (p->block_size * idx)); +            slot = (struct mempool_slot*) ((uint8_t*) p->memory.ptr + (p->block_size * (size_t) idx));          if (!slot) {              pa_log_info("Pool full"); @@ -257,6 +261,12 @@ static struct mempool_slot* mempool_allocate_slot(pa_mempool *p) {          }      } +/* #ifdef HAVE_VALGRIND_MEMCHECK_H */ +/*     if (PA_UNLIKELY(pa_in_valgrind())) { */ +/*         VALGRIND_MALLOCLIKE_BLOCK(slot, p->block_size, 0, 0); */ +/*     } */ +/* #endif */ +      return slot;  } @@ -272,7 +282,7 @@ static unsigned mempool_slot_idx(pa_mempool *p, void *ptr) {      pa_assert((uint8_t*) ptr >= (uint8_t*) p->memory.ptr);      pa_assert((uint8_t*) ptr < (uint8_t*) p->memory.ptr + p->memory.size); -    return ((uint8_t*) ptr - (uint8_t*) p->memory.ptr) / p->block_size; +    return (unsigned) ((size_t) ((uint8_t*) ptr - (uint8_t*) p->memory.ptr) / p->block_size);  }  /* No lock necessary */ @@ -519,13 +529,19 @@ static void memblock_free(pa_memblock *b) {          case PA_MEMBLOCK_POOL_EXTERNAL:          case PA_MEMBLOCK_POOL: {              struct mempool_slot *slot; -            int call_free; +            pa_bool_t call_free;              slot = mempool_slot_by_ptr(b->pool, pa_atomic_ptr_load(&b->data));              pa_assert(slot);              call_free = b->type == PA_MEMBLOCK_POOL_EXTERNAL; +/* #ifdef HAVE_VALGRIND_MEMCHECK_H */ +/*             if (PA_UNLIKELY(pa_in_valgrind())) { */ +/*                 VALGRIND_FREELIKE_BLOCK(slot, b->pool->block_size); */ +/*             } */ +/* #endif */ +              /* The free list dimensions should easily allow all slots               * to fit in, hence try harder if pushing this slot into               * the free list fails */ @@ -647,7 +663,7 @@ static void memblock_replace_import(pa_memblock *b) {      pa_assert(pa_atomic_load(&b->pool->stat.n_imported) > 0);      pa_assert(pa_atomic_load(&b->pool->stat.imported_size) >= (int) b->length);      pa_atomic_dec(&b->pool->stat.n_imported); -    pa_atomic_sub(&b->pool->stat.imported_size, b->length); +    pa_atomic_sub(&b->pool->stat.imported_size, (int) b->length);      seg = b->per_type.imported.segment;      pa_assert(seg); @@ -668,8 +684,9 @@ static void memblock_replace_import(pa_memblock *b) {          pa_mutex_unlock(seg->import->mutex);  } -pa_mempool* pa_mempool_new(pa_bool_t shared) { +pa_mempool* pa_mempool_new(pa_bool_t shared, size_t size) {      pa_mempool *p; +    char t1[64], t2[64];      p = pa_xnew(pa_mempool, 1); @@ -680,13 +697,26 @@ pa_mempool* pa_mempool_new(pa_bool_t shared) {      if (p->block_size < PA_PAGE_SIZE)          p->block_size = PA_PAGE_SIZE; -    p->n_blocks = PA_MEMPOOL_SLOTS_MAX; +    if (size <= 0) +        p->n_blocks = PA_MEMPOOL_SLOTS_MAX; +    else { +        p->n_blocks = (unsigned) (size / p->block_size); + +        if (p->n_blocks < 2) +            p->n_blocks = 2; +    }      if (pa_shm_create_rw(&p->memory, p->n_blocks * p->block_size, shared, 0700) < 0) {          pa_xfree(p);          return NULL;      } +    pa_log_debug("Using %s memory pool with %u slots of size %s each, total size is %s", +                 p->memory.shared ? "shared" : "private", +                 p->n_blocks, +                 pa_bytes_snprint(t1, sizeof(t1), (unsigned) p->block_size), +                 pa_bytes_snprint(t2, sizeof(t2), (unsigned) (p->n_blocks * p->block_size))); +      memset(&p->stat, 0, sizeof(p->stat));      pa_atomic_store(&p->n_init, 0); @@ -754,7 +784,7 @@ void pa_mempool_vacuum(pa_mempool *p) {              ;      while ((slot = pa_flist_pop(list))) { -        pa_shm_punch(&p->memory, (uint8_t*) slot - (uint8_t*) p->memory.ptr, p->block_size); +        pa_shm_punch(&p->memory, (size_t) ((uint8_t*) slot - (uint8_t*) p->memory.ptr), p->block_size);          while (pa_flist_push(p->free_slots, slot))              ; @@ -967,7 +997,7 @@ void pa_memexport_free(pa_memexport *e) {      pa_mutex_lock(e->mutex);      while (e->used_slots) -        pa_memexport_process_release(e, e->used_slots - e->slots); +        pa_memexport_process_release(e, (uint32_t) (e->used_slots - e->slots));      pa_mutex_unlock(e->mutex);      pa_mutex_lock(e->pool->mutex); @@ -1006,7 +1036,7 @@ int pa_memexport_process_release(pa_memexport *e, uint32_t id) {      pa_assert(pa_atomic_load(&e->pool->stat.exported_size) >= (int) b->length);      pa_atomic_dec(&e->pool->stat.n_exported); -    pa_atomic_sub(&e->pool->stat.exported_size, b->length); +    pa_atomic_sub(&e->pool->stat.exported_size, (int) b->length);      pa_memblock_unref(b); @@ -1034,7 +1064,7 @@ static void memexport_revoke_blocks(pa_memexport *e, pa_memimport *i) {              slot->block->per_type.imported.segment->import != i)              continue; -        idx = slot - e->slots; +        idx = (uint32_t) (slot - e->slots);          e->revoke_cb(e, idx, e->userdata);          pa_memexport_process_release(e, idx);      } @@ -1095,7 +1125,7 @@ int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32      PA_LLIST_PREPEND(struct memexport_slot, e->used_slots, slot);      slot->block = b; -    *block_id = slot - e->slots; +    *block_id = (uint32_t) (slot - e->slots);      pa_mutex_unlock(e->mutex);  /*     pa_log("Got block id %u", *block_id); */ @@ -1115,13 +1145,13 @@ int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32      pa_assert((uint8_t*) data + b->length <= (uint8_t*) memory->ptr + memory->size);      *shm_id = memory->id; -    *offset = (uint8_t*) data - (uint8_t*) memory->ptr; +    *offset = (size_t) ((uint8_t*) data - (uint8_t*) memory->ptr);      *size = b->length;      pa_memblock_release(b);      pa_atomic_inc(&e->pool->stat.n_exported); -    pa_atomic_add(&e->pool->stat.exported_size, b->length); +    pa_atomic_add(&e->pool->stat.exported_size, (int) b->length);      return 0;  }  | 
