?? mem_align.c
字號:
/*****************************************************************************
*
* XVID MPEG-4 VIDEO CODEC
* - Aligned memory allocator -
*
* This program is an implementation of a part of one or more MPEG-4
* Video tools as specified in ISO/IEC 14496-2 standard. Those intending
* to use this software module in hardware or software products are
* advised that its use may infringe existing patents or copyrights, and
* any such use would be at such party's own risk. The original
* developer of this software module and his/her company, and subsequent
* editors and their companies, will have no liability for use of this
* software or modifications or derivatives thereof.
*
* This program is free software ; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
****************************************************************************/
/*****************************************************************************
*
* History
*
* - Thu Jun 13 23:50:07 2002 Added legal header
*
* $Id: mem_align.c,v 1.8 2002/06/14 13:27:28 Isibaar Exp $
*
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include "mem_align.h"
/* 12.9 fyh add a global variable to counter memory useage */
int mem_useage;
/*****************************************************************************
* xvid_malloc
*
* This function allocates 'size' bytes (usable by the user) on the heap and
* takes care of the requested 'alignment'.
* In order to align the allocated memory block, the xvid_malloc allocates
* 'size' bytes + 'alignment' bytes. So try to keep alignment very small
* when allocating small pieces of memory.
*
* NB : a block allocated by xvid_malloc _must_ be freed with xvid_free
* (the libc free will return an error)
*
* Returned value : - NULL on error
* - Pointer to the allocated aligned block
*
****************************************************************************/
void *
xvid_malloc(size_t size,
uint8_t alignment)
{
uint8_t *mem_ptr;
mem_useage+=size+alignment;
if (!alignment) {
/* We have not to satisfy any alignment */
if ((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {
/* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
*mem_ptr = 0;
/* Return the mem_ptr pointer */
return (void *) mem_ptr++;
}
} else {
uint8_t *tmp;
/*
* Allocate the required size memory + alignment so we
* can realign the data if necessary
*/
if ((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {
/* Align the tmp pointer */
mem_ptr =
(uint8_t *) ((ptr_t) (tmp + alignment - 1) &
(~(ptr_t) (alignment - 1)));
/*
* Special case where malloc have already satisfied the alignment
* We must add alignment to mem_ptr because we must store
* (mem_ptr - tmp) in *(mem_ptr-1)
* If we do not add alignment to mem_ptr then *(mem_ptr-1) points
* to a forbidden memory space
*/
if (mem_ptr == tmp)
mem_ptr += alignment;
/*
* (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
* the real malloc block allocated and free it in xvid_free
*/
*(mem_ptr - 1) = (uint8_t) (mem_ptr - tmp);
/* Return the aligned pointer */
return (void *) mem_ptr;
}
}
return NULL;
}
/*****************************************************************************
* xvid_free
*
* Free a previously 'xvid_malloc' allocated block. Does not free NULL
* references.
*
* Returned value : None.
*
****************************************************************************/
void
xvid_free(void *mem_ptr)
{
/* *(mem_ptr - 1) give us the offset to the real malloc block */
if (mem_ptr)
free((uint8_t *) mem_ptr - *((uint8_t *) mem_ptr - 1));
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -