mem_align.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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