ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvs/xvidcore/src/utils/mem_align.c
Revision: 1.4
Committed: Sun Mar 24 18:18:40 2002 UTC (22 years, 6 months ago) by edgomez
Content type: text/plain
Branch: MAIN
CVS Tags: xvidcore
Changes since 1.3: +39 -8 lines
Log Message:
Fixed a bug when malloc aligns the data itself - Added comments

File Contents

# User Rev Content
1 Isibaar 1.2 #include <stdlib.h>
2     #include <stdio.h>
3     #include "mem_align.h"
4    
5     void *xvid_malloc(size_t size, uint8_t alignment)
6     {
7 edgomez 1.3 uint8_t *mem_ptr;
8 Isibaar 1.2
9 edgomez 1.4 if(!alignment)
10 edgomez 1.3 {
11 edgomez 1.4
12     /* We have not to satisfy any alignment */
13     if((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL)
14     {
15    
16     /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
17 edgomez 1.3 *mem_ptr = 0;
18 edgomez 1.4
19     /* Return the mem_ptr pointer */
20 edgomez 1.3 return (void *) mem_ptr++;
21 edgomez 1.4
22 edgomez 1.3 }
23 edgomez 1.4
24 edgomez 1.3 }
25     else
26     {
27     uint8_t *tmp;
28 Isibaar 1.2
29 edgomez 1.4 /*
30     * Allocate the required size memory + alignment so we
31     * can realign the data if necessary
32     */
33    
34     if((tmp = (uint8_t *) malloc(size + alignment)) != NULL)
35     {
36    
37     /* Align the tmp pointer */
38 edgomez 1.3 mem_ptr = (uint8_t *)((uint32_t)(tmp + alignment - 1)&(~(uint32_t)(alignment - 1)));
39 edgomez 1.4
40     /*
41     * Special case where malloc have already satisfied the alignment
42     * We must add alignment to mem_ptr because we must store
43     * (mem_ptr - tmp) in *(mem_ptr-1)
44     * If we do not add alignment to mem_ptr then *(mem_ptr-1) points
45     * to a forbidden memory space
46     */
47     if(mem_ptr == tmp) mem_ptr += alignment;
48    
49     /*
50     * (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
51     * the real malloc block allocated and free it in xvid_free
52     */
53 edgomez 1.3 *(mem_ptr - 1) = (uint8_t)(mem_ptr - tmp);
54 edgomez 1.4
55     /* Return the aligned pointer */
56 edgomez 1.3 return (void *) mem_ptr;
57 edgomez 1.4
58 edgomez 1.3 }
59     }
60    
61     return NULL;
62 Isibaar 1.2
63     }
64    
65     void xvid_free(void *mem_ptr)
66     {
67    
68 edgomez 1.4 /* *(mem_ptr - 1) give us the offset to the real malloc block */
69     free((uint8_t*)mem_ptr - *((uint8_t*)mem_ptr - 1));
70 Isibaar 1.2
71     }