[pulseaudio-discuss] [PATCH RFCv3 09/51] packet: Use flist to save calls to malloc()/free()
Peter Meerwald
pmeerw at pmeerw.net
Tue Nov 4 15:26:04 PST 2014
From: Peter Meerwald <p.meerwald at bct-electronic.com>
a separate free-list is used to recycle memory of fixed-sized packets
with up to MAX_APPENDED_SIZE of data
Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>
---
src/pulsecore/packet.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/pulsecore/packet.c b/src/pulsecore/packet.c
index 0a23aa9..dc0cf9f 100644
--- a/src/pulsecore/packet.c
+++ b/src/pulsecore/packet.c
@@ -28,6 +28,7 @@
#include <pulse/xmalloc.h>
#include <pulsecore/macro.h>
#include <pulsecore/refcnt.h>
+#include <pulsecore/flist.h>
#include "packet.h"
@@ -43,12 +44,15 @@ typedef struct pa_packet {
} per_type;
} pa_packet;
+PA_STATIC_FLIST_DECLARE(packets, 0, pa_xfree);
+
pa_packet* pa_packet_new(size_t length) {
pa_packet *p;
pa_assert(length > 0);
- p = pa_xnew(pa_packet, 1);
+ if (!(p = pa_flist_pop(PA_STATIC_FLIST_GET(packets))))
+ p = pa_xnew(pa_packet, 1);
PA_REFCNT_INIT(p);
p->length = length;
if (length > MAX_APPENDED_SIZE) {
@@ -79,7 +83,8 @@ pa_packet* pa_packet_new_dynamic(void* data, size_t length) {
pa_assert(data);
pa_assert(length > 0);
- p = pa_xnew(pa_packet, 1);
+ if (!(p = pa_flist_pop(PA_STATIC_FLIST_GET(packets))))
+ p = pa_xnew(pa_packet, 1);
PA_REFCNT_INIT(p);
p->length = length;
p->data = data;
@@ -113,6 +118,7 @@ void pa_packet_unref(pa_packet *p) {
if (PA_REFCNT_DEC(p) <= 0) {
if (p->type == PA_PACKET_DYNAMIC)
pa_xfree(p->data);
- pa_xfree(p);
+ if (pa_flist_push(PA_STATIC_FLIST_GET(packets), p) < 0)
+ pa_xfree(p);
}
}
--
1.9.1
More information about the pulseaudio-discuss
mailing list