Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / general / malloc16.c @ 47c39028

History | View | Annotate | Download (940 Bytes)

1 5d69a524 jcorgan
/* Wrapper functions for malloc/free that force 16-byte alignment
2 5d69a524 jcorgan
 * See http://perso.club-internet.fr/matmac/sourcesc.htm
3 5d69a524 jcorgan
4 5d69a524 jcorgan
 * Copyright 2001 Phil Karn, KA9Q
5 5d69a524 jcorgan
 * May be used under the terms of the GNU Public License (GPL)
6 5d69a524 jcorgan
 */
7 5d69a524 jcorgan
8 5d69a524 jcorgan
#include "malloc16.h"
9 5d69a524 jcorgan
#include <string.h>
10 5d69a524 jcorgan
11 5d69a524 jcorgan
void *malloc16Align(int size){
12 5d69a524 jcorgan
  void *p;
13 5d69a524 jcorgan
  void **p1;
14 5d69a524 jcorgan
15 5d69a524 jcorgan
  if((p = malloc(size+31)) == NULL)
16 5d69a524 jcorgan
    return NULL;
17 5d69a524 jcorgan
18 5d69a524 jcorgan
  /* Round up to next 16-byte boundary */
19 5d69a524 jcorgan
  p1 = (void **)(((long)p + 31) & (~15));
20 5d69a524 jcorgan
21 5d69a524 jcorgan
  /* Stash actual start of block just before ptr we return */
22 5d69a524 jcorgan
  p1[-1] = p;
23 5d69a524 jcorgan
24 5d69a524 jcorgan
  /* Return 16-byte aligned address */
25 5d69a524 jcorgan
  return (void *)p1;
26 5d69a524 jcorgan
}
27 5d69a524 jcorgan
28 5d69a524 jcorgan
void *calloc16Align(size_t nmemb,size_t size){
29 5d69a524 jcorgan
  int nbytes;
30 5d69a524 jcorgan
  void *p;
31 5d69a524 jcorgan
32 5d69a524 jcorgan
  nbytes = nmemb*size;
33 5d69a524 jcorgan
  if((p = malloc16Align(nbytes)) == NULL)
34 5d69a524 jcorgan
    return NULL;
35 5d69a524 jcorgan
36 5d69a524 jcorgan
  memset(p,0,nbytes);
37 5d69a524 jcorgan
  return p;
38 5d69a524 jcorgan
}
39 5d69a524 jcorgan
40 5d69a524 jcorgan
void free16Align(void *p){
41 5d69a524 jcorgan
42 5d69a524 jcorgan
  if(p != NULL){
43 5d69a524 jcorgan
    /* Retrieve pointer to actual start of block and free it */
44 5d69a524 jcorgan
    free(((void **)p)[-1]);
45 5d69a524 jcorgan
  }
46 5d69a524 jcorgan
}