[pulseaudio-discuss] [PATCH RFCv3 07/51] packet: Make pa_packet_new() create fixed-size packets

Peter Meerwald pmeerw at pmeerw.net
Tue Nov 4 15:26:02 PST 2014


From: Peter Meerwald <p.meerwald at bct-electronic.com>

if length exceeds maximum appended size, create a packet of
type dynamic instead of type appended

this is a preparation to use a separate free-list for packets

document semantics of pa_packet_new_*() functions

Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>
---
 src/pulsecore/packet.c | 16 +++++++++++++---
 src/pulsecore/packet.h |  5 +++++
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/pulsecore/packet.c b/src/pulsecore/packet.c
index 450c5c5..091cfb3 100644
--- a/src/pulsecore/packet.c
+++ b/src/pulsecore/packet.c
@@ -31,11 +31,16 @@
 
 #include "packet.h"
 
+#define MAX_APPENDED_SIZE 128
+
 typedef struct pa_packet {
     PA_REFCNT_DECLARE;
     enum { PA_PACKET_APPENDED, PA_PACKET_DYNAMIC } type;
     size_t length;
     uint8_t *data;
+    union {
+        uint8_t appended[MAX_APPENDED_SIZE];
+    } per_type;
 } pa_packet;
 
 pa_packet* pa_packet_new(size_t length) {
@@ -43,11 +48,16 @@ pa_packet* pa_packet_new(size_t length) {
 
     pa_assert(length > 0);
 
-    p = pa_xmalloc(PA_ALIGN(sizeof(pa_packet)) + length);
+    p = pa_xnew(pa_packet, 1);
     PA_REFCNT_INIT(p);
     p->length = length;
-    p->data = (uint8_t*) p + PA_ALIGN(sizeof(pa_packet));
-    p->type = PA_PACKET_APPENDED;
+    if (length > MAX_APPENDED_SIZE) {
+        p->data = pa_xmalloc(length);
+        p->type = PA_PACKET_DYNAMIC;
+    } else {
+        p->data = p->per_type.appended;
+        p->type = PA_PACKET_APPENDED;
+    }
 
     return p;
 }
diff --git a/src/pulsecore/packet.h b/src/pulsecore/packet.h
index a6d12c7..33c66f2 100644
--- a/src/pulsecore/packet.h
+++ b/src/pulsecore/packet.h
@@ -27,7 +27,12 @@
 
 typedef struct pa_packet pa_packet;
 
+/* create empty packet (either of type appended or dynamic depending
+ * on length) */
 pa_packet* pa_packet_new(size_t length);
+
+/* data must have been malloc()ed; the packet takes ownership of the memory,
+ * i.e. memory is free()d with the packet */
 pa_packet* pa_packet_new_dynamic(void* data, size_t length);
 
 const void* pa_packet_data(pa_packet *p, size_t *l);
-- 
1.9.1



More information about the pulseaudio-discuss mailing list