Skip to content

Commit 7ae8311

Browse files
committed
aubuf: use new mem_pool to avoid malloc/free
1 parent ace5937 commit 7ae8311

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

rem/aubuf/aubuf.c

+21-10
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
#define AUBUF_DEBUG 0
2020

21+
enum { POOL_FRAMES = 25 };
2122

2223
/** Locked audio-buffer with almost zero-copy */
2324
struct aubuf {
2425
struct list afl;
26+
struct mem_pool *pool;
2527
struct pl *id; /**< Audio buffer Identifier */
2628
mtx_t *lock;
2729
size_t wish_sz;
@@ -49,13 +51,13 @@ struct frame {
4951
struct le le;
5052
struct mbuf *mb;
5153
struct auframe af;
54+
struct mem_pool_entry *e;
5255
};
5356

5457

55-
static void frame_destructor(void *arg)
58+
static void frame_destructor(void *data)
5659
{
57-
struct frame *f = arg;
58-
60+
struct frame *f = data;
5961
list_unlink(&f->le);
6062
mem_deref(f->mb);
6163
}
@@ -65,10 +67,10 @@ static void aubuf_destructor(void *arg)
6567
{
6668
struct aubuf *ab = arg;
6769

68-
list_flush(&ab->afl);
6970
mem_deref(ab->lock);
7071
mem_deref(ab->ajb);
7172
mem_deref(ab->id);
73+
mem_deref(ab->pool);
7274
}
7375

7476

@@ -100,7 +102,7 @@ static void read_auframe(struct aubuf *ab, struct auframe *af)
100102
}
101103

102104
if (!mbuf_get_left(f->mb)) {
103-
mem_deref(f);
105+
mem_pool_release(ab->pool, f->e);
104106
}
105107
else if (af->srate && af->ch && sample_size) {
106108

@@ -139,6 +141,11 @@ int aubuf_alloc(struct aubuf **abp, size_t min_sz, size_t max_sz)
139141
if (!ab)
140142
return ENOMEM;
141143

144+
err = mem_pool_alloc(&ab->pool, POOL_FRAMES, sizeof(struct frame),
145+
frame_destructor);
146+
if (err)
147+
goto out;
148+
142149
err = mutex_alloc(&ab->lock);
143150
if (err)
144151
goto out;
@@ -269,10 +276,13 @@ int aubuf_append_auframe(struct aubuf *ab, struct mbuf *mb,
269276
if (!ab || !mb)
270277
return EINVAL;
271278

272-
f = mem_zalloc(sizeof(*f), frame_destructor);
273-
if (!f)
279+
struct mem_pool_entry *e = mem_pool_borrow_extend(ab->pool);
280+
if (!e)
274281
return ENOMEM;
275282

283+
f = mem_pool_member(e);
284+
f->e = e;
285+
276286
f->mb = mem_ref(mb);
277287
if (af)
278288
f->af = *af;
@@ -299,7 +309,7 @@ int aubuf_append_auframe(struct aubuf *ab, struct mbuf *mb,
299309
f = list_ledata(ab->afl.head);
300310
if (f) {
301311
ab->cur_sz -= mbuf_get_left(f->mb);
302-
mem_deref(f);
312+
mem_pool_release(ab->pool, f->e);
303313
}
304314
}
305315

@@ -415,7 +425,7 @@ void aubuf_read_auframe(struct aubuf *ab, struct auframe *af)
415425
struct frame *f = list_ledata(ab->afl.head);
416426
if (f) {
417427
ab->cur_sz -= mbuf_get_left(f->mb);
418-
mem_deref(f);
428+
mem_pool_release(ab->pool, f->e);
419429
}
420430
}
421431

@@ -499,7 +509,8 @@ void aubuf_flush(struct aubuf *ab)
499509

500510
mtx_lock(ab->lock);
501511

502-
list_flush(&ab->afl);
512+
list_clear(&ab->afl);
513+
mem_pool_flush(ab->pool);
503514
ab->fill_sz = ab->wish_sz;
504515
ab->cur_sz = 0;
505516
ab->wr_sz = 0;

0 commit comments

Comments
 (0)