Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / general / malloc16.c @ 0a9b999b

History | View | Annotate | Download (961 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 38ea3a57 eb
#include <strings.h>
11 5d69a524 jcorgan
12 5d69a524 jcorgan
void *malloc16Align(int size){
13 5d69a524 jcorgan
  void *p;
14 5d69a524 jcorgan
  void **p1;
15 5d69a524 jcorgan
16 5d69a524 jcorgan
  if((p = malloc(size+31)) == NULL)
17 5d69a524 jcorgan
    return NULL;
18 5d69a524 jcorgan
19 5d69a524 jcorgan
  /* Round up to next 16-byte boundary */
20 5d69a524 jcorgan
  p1 = (void **)(((long)p + 31) & (~15));
21 5d69a524 jcorgan
22 5d69a524 jcorgan
  /* Stash actual start of block just before ptr we return */
23 5d69a524 jcorgan
  p1[-1] = p;
24 5d69a524 jcorgan
25 5d69a524 jcorgan
  /* Return 16-byte aligned address */
26 5d69a524 jcorgan
  return (void *)p1;
27 5d69a524 jcorgan
}
28 5d69a524 jcorgan
29 5d69a524 jcorgan
void *calloc16Align(size_t nmemb,size_t size){
30 5d69a524 jcorgan
  int nbytes;
31 5d69a524 jcorgan
  void *p;
32 5d69a524 jcorgan
33 5d69a524 jcorgan
  nbytes = nmemb*size;
34 5d69a524 jcorgan
  if((p = malloc16Align(nbytes)) == NULL)
35 5d69a524 jcorgan
    return NULL;
36 5d69a524 jcorgan
37 5d69a524 jcorgan
  memset(p,0,nbytes);
38 5d69a524 jcorgan
  return p;
39 5d69a524 jcorgan
}
40 5d69a524 jcorgan
41 5d69a524 jcorgan
void free16Align(void *p){
42 5d69a524 jcorgan
43 5d69a524 jcorgan
  if(p != NULL){
44 5d69a524 jcorgan
    /* Retrieve pointer to actual start of block and free it */
45 5d69a524 jcorgan
    free(((void **)p)[-1]);
46 5d69a524 jcorgan
  }
47 5d69a524 jcorgan
}