summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/malloc16.c
diff options
context:
space:
mode:
authorJohnathan Corgan <johnathan@corganlabs.com>2013-03-27 20:41:40 -0700
committerJohnathan Corgan <johnathan@corganlabs.com>2013-03-27 20:41:40 -0700
commit2caaabf8e1dd771174fd42e51c8c8090864638e6 (patch)
treee58fe2bc53120acfd11aa6687fe5fa0aaa58ca71 /gnuradio-runtime/lib/malloc16.c
parent40ab0030dbe821c9ed475a0b73898040f4af581c (diff)
parentd7cde125dc3661a62e1013a4a017f0f1efa46e6e (diff)
Merge branch 'runtime-3.7' into next
Diffstat (limited to 'gnuradio-runtime/lib/malloc16.c')
-rw-r--r--gnuradio-runtime/lib/malloc16.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gnuradio-runtime/lib/malloc16.c b/gnuradio-runtime/lib/malloc16.c
new file mode 100644
index 0000000000..2cc6135e77
--- /dev/null
+++ b/gnuradio-runtime/lib/malloc16.c
@@ -0,0 +1,46 @@
+/* Wrapper functions for malloc/free that force 16-byte alignment
+ * See http://perso.club-internet.fr/matmac/sourcesc.htm
+
+ * Copyright 2001 Phil Karn, KA9Q
+ * May be used under the terms of the GNU Public License (GPL)
+ */
+
+#include "malloc16.h"
+#include <string.h>
+
+void *malloc16Align(int size){
+ void *p;
+ void **p1;
+
+ if((p = malloc(size+31)) == NULL)
+ return NULL;
+
+ /* Round up to next 16-byte boundary */
+ p1 = (void **)(((long)p + 31) & (~15));
+
+ /* Stash actual start of block just before ptr we return */
+ p1[-1] = p;
+
+ /* Return 16-byte aligned address */
+ return (void *)p1;
+}
+
+void *calloc16Align(size_t nmemb,size_t size){
+ int nbytes;
+ void *p;
+
+ nbytes = nmemb*size;
+ if((p = malloc16Align(nbytes)) == NULL)
+ return NULL;
+
+ memset(p,0,nbytes);
+ return p;
+}
+
+void free16Align(void *p){
+
+ if(p != NULL){
+ /* Retrieve pointer to actual start of block and free it */
+ free(((void **)p)[-1]);
+ }
+}