2 * Hyper Operating System Application Framework
4 * @file valmemheap_alloc.c
5 * @brief %jp{可変サイズメモリヒープクラス}%en{variable size memory heap class}
7 * Copyright (C) 2006-2008 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "valmemheap_local.h"
18 void *ValMemHeap_Alloc(void *pMemHeap, MEMSIZE Size)
21 T_VALMEMHEAP_MEMBLK *mblk;
22 T_VALMEMHEAP_MEMBLK *mblk_next;
23 T_VALMEMHEAP_MEMBLK *mblk_next2;
28 self = (C_VALMEMHEAP *)pMemHeap;
31 if ( self->pMemBase == NULL )
36 /* %jp{サイズのアライメントを調整} */
37 Size = ValMemHeap_AlignSize(self, Size);
39 /* %jp{メモリブロックのサイズを調整} */
40 MemBlockSize = ValMemHeap_GetMemBlockSize(self);
43 mblk = self->pMemBase;
44 while ( mblk->Size != 0 )
46 if ( mblk->iFlag == VALMEMHEAP_FREE && mblk->Size >= Size )
49 if ( mblk->Size - Size > MemBlockSize + (self->AlignMask + 1) )
52 mblk_next = (T_VALMEMHEAP_MEMBLK *)((char *)mblk + MemBlockSize + Size);
53 mblk_next2 = (T_VALMEMHEAP_MEMBLK *)((char *)mblk + MemBlockSize + mblk->Size);
54 mblk_next->pPrev = mblk;
55 mblk_next->Size = mblk->Size - Size - MemBlockSize;
56 mblk_next->iFlag = VALMEMHEAP_FREE;
57 mblk_next2->pPrev = mblk_next;
60 mblk->iFlag = VALMEMHEAP_USING;
62 return (void *)((char *)mblk + MemBlockSize);
66 mblk = (T_VALMEMHEAP_MEMBLK *)((char *)mblk + mblk->Size + MemBlockSize);
69 return NULL; /* 空きが無い */