[svn] / branches / dev-api-4 / xvidcore / src / utils / mem_align.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/utils/mem_align.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1054 - (view) (download)

1 : edgomez 204 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 : edgomez 1054 * - Aligned Memory Allocator -
5 : edgomez 204 *
6 : edgomez 1054 * Copyright(C) 2002-2003 Edouard Gomez <ed.gomez@free.fr>
7 : edgomez 424 *
8 : edgomez 851 * This program is free software ; you can redistribute it and/or modify
9 :     * it under the terms of the GNU General Public License as published by
10 :     * the Free Software Foundation ; either version 2 of the License, or
11 : edgomez 204 * (at your option) any later version.
12 :     *
13 :     * This program is distributed in the hope that it will be useful,
14 : edgomez 851 * but WITHOUT ANY WARRANTY ; without even the implied warranty of
15 : edgomez 204 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     * GNU General Public License for more details.
17 :     *
18 :     * You should have received a copy of the GNU General Public License
19 : edgomez 851 * along with this program ; if not, write to the Free Software
20 : edgomez 204 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 :     *
22 : edgomez 1054 * $Id: mem_align.c,v 1.15.2.2 2003-06-09 13:55:38 edgomez Exp $
23 : edgomez 204 *
24 :     ****************************************************************************/
25 :    
26 : Isibaar 41 #include <stdlib.h>
27 :     #include <stdio.h>
28 :     #include "mem_align.h"
29 :    
30 : edgomez 204 /*****************************************************************************
31 :     * xvid_malloc
32 :     *
33 :     * This function allocates 'size' bytes (usable by the user) on the heap and
34 :     * takes care of the requested 'alignment'.
35 :     * In order to align the allocated memory block, the xvid_malloc allocates
36 :     * 'size' bytes + 'alignment' bytes. So try to keep alignment very small
37 :     * when allocating small pieces of memory.
38 :     *
39 :     * NB : a block allocated by xvid_malloc _must_ be freed with xvid_free
40 :     * (the libc free will return an error)
41 :     *
42 :     * Returned value : - NULL on error
43 :     * - Pointer to the allocated aligned block
44 :     *
45 :     ****************************************************************************/
46 :    
47 : edgomez 195 void *
48 :     xvid_malloc(size_t size,
49 :     uint8_t alignment)
50 : Isibaar 41 {
51 : edgomez 43 uint8_t *mem_ptr;
52 : edgomez 65
53 : edgomez 195 if (!alignment) {
54 :    
55 : edgomez 65 /* We have not to satisfy any alignment */
56 : edgomez 195 if ((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {
57 : edgomez 65
58 :     /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
59 : edgomez 722 *mem_ptr = 1;
60 : edgomez 65
61 :     /* Return the mem_ptr pointer */
62 : edgomez 998 return (void *)(mem_ptr+1);
63 : edgomez 65
64 : edgomez 43 }
65 : edgomez 65
66 : edgomez 195 } else {
67 : edgomez 43 uint8_t *tmp;
68 : edgomez 195
69 : edgomez 65 /*
70 :     * Allocate the required size memory + alignment so we
71 :     * can realign the data if necessary
72 :     */
73 :    
74 : edgomez 195 if ((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {
75 : edgomez 65
76 :     /* Align the tmp pointer */
77 : edgomez 195 mem_ptr =
78 : Isibaar 209 (uint8_t *) ((ptr_t) (tmp + alignment - 1) &
79 :     (~(ptr_t) (alignment - 1)));
80 : edgomez 65
81 :     /*
82 :     * Special case where malloc have already satisfied the alignment
83 :     * We must add alignment to mem_ptr because we must store
84 :     * (mem_ptr - tmp) in *(mem_ptr-1)
85 :     * If we do not add alignment to mem_ptr then *(mem_ptr-1) points
86 :     * to a forbidden memory space
87 :     */
88 : edgomez 195 if (mem_ptr == tmp)
89 :     mem_ptr += alignment;
90 : edgomez 65
91 :     /*
92 :     * (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
93 :     * the real malloc block allocated and free it in xvid_free
94 :     */
95 : edgomez 195 *(mem_ptr - 1) = (uint8_t) (mem_ptr - tmp);
96 : edgomez 65
97 :     /* Return the aligned pointer */
98 : edgomez 43 return (void *) mem_ptr;
99 : edgomez 65
100 : edgomez 43 }
101 :     }
102 : Isibaar 41
103 : edgomez 43 return NULL;
104 :    
105 : Isibaar 41 }
106 :    
107 : edgomez 204 /*****************************************************************************
108 :     * xvid_free
109 :     *
110 :     * Free a previously 'xvid_malloc' allocated block. Does not free NULL
111 :     * references.
112 :     *
113 :     * Returned value : None.
114 :     *
115 :     ****************************************************************************/
116 :    
117 : edgomez 195 void
118 :     xvid_free(void *mem_ptr)
119 : Isibaar 41 {
120 :    
121 : edgomez 65 /* *(mem_ptr - 1) give us the offset to the real malloc block */
122 : edgomez 195 if (mem_ptr)
123 :     free((uint8_t *) mem_ptr - *((uint8_t *) mem_ptr - 1));
124 : Isibaar 41
125 :     }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4