( b; q# }' f5 P4 E# ~ partId->options = memPartDefaultOption; : `. R2 t/ I# z: y* a partId->minBlockWords = sizeof (FREE_BLOCK) >> 1; /* word not byte */ - n0 _/ ~$ L( U , Q& o/ K1 ~( Q' d* n- P0 D* g (* memPartSemInitRtn) (partId); 7 e, g5 c! W, A. _" A9 d* M 0 G. k! c& F% u- D) d' w3 c dllInit(&partId->freeList);- ~' Q7 H8 @) p" {9 b( A! `, O9 e* G
7 _9 I9 j/ b- s objCoreInit(&partId->objCore, memPartClassId);6 d+ O d' `7 X. o2 I- Z
, ?0 i( ^$ |3 u6 o5 N) y memPartAddToPool(partId, pPool, poolSize); 0 x2 c; a; w& t% q Y2 [} v+ b4 A5 i# l O. z T6 _# t
1 z. W& x$ @& Z e' P
STATUS memPartDestroy(PART_ID partId) 3 p8 I0 f( P: E6 L" Q c" X{ - {* U. K0 S& ^: ?, u+ y2 v: R return (ERROR);$ c8 d# p' x0 W' a; i {
}9 H, M4 p1 Z0 }/ ^/ Z" J" G
; a$ q1 r6 A5 O' f& x3 }% ~void memAddToPool(FAST char *pPool, FAST unsigned poolSize) , h" y j& `- r5 P y' s{* Y* R! D3 |! p( [. f% V
(void)memPartAddToPool(&memSysPartition, pPool, poolSize);5 s8 ^ U8 R5 t+ A# x8 m
} 1 F7 ^5 o/ k; w- R, c: M* Q& C* C! r- V! t: ^* n
5 V Y$ f1 \1 `* S( I3 k0 I0 U3 Dstatic STATUS memPartAddToPool(PART_ID partId, char* pPool, unsigned poolSize)6 O3 M4 I8 v! |& ~/ [- _
{ N: Z' Y8 [* x- v BLOCK_HDR* pHdrStart;3 e+ H; O, Y5 {8 ` E8 o# V2 X
BLOCK_HDR* pHdrMid;, m- q/ E0 {* N: y4 _
BLOCK_HDR* pHdrEnd;7 b0 H# I4 \) b9 c$ X5 j
char* tmp;3 a1 b0 S3 K8 o, M
int reducePool;% A& I7 p9 F4 \; b) z- Z
5 u6 \) g7 Z4 f# d* u1 e5 [ if(!(IS_CLASS(partId, memPartClassId))) /* only memPartClass can call this function */ ( B& v, b8 c4 b: d" c/ E2 ] {# S5 E+ K G2 e% X" R r0 N
return (ERROR);$ [7 o- ?# P( p( x0 {
}1 o" ~+ y. u' `+ s
: U: Q# u/ z: E! v
tmp = (char*) MEM_ROUND_UP(pPool);* x1 |' t/ u1 p4 E! _: M+ y
reducePool = tmp - pPool; ( J3 j/ Y+ |! n8 `8 F ' Q. h, C/ O# n5 b/ L /* adjust the lenght */8 k8 R0 B# \3 @, U! g
if(poolSize >= reducePool)/ Q/ d% y$ m- H% f7 F! e
{# d% l( @ L9 |& R2 G
poolSize -= reducePool;# g6 j7 I# w7 V3 B4 z: [4 e! V1 y
}* a: l1 g! t h+ x
else6 d& Q2 G! Y5 H' ?- w: `. N+ C
{ 7 v# c( _0 f! @- F- K4 T6 h M poolSize = 0;- N% x/ J T; F1 W+ S" q+ z
}1 ]6 `# D' e8 [: e$ H! l1 i2 H
pPool = tmp;& ]5 M; Y) O0 L6 V0 h
4 G( a6 }1 X+ @' v
poolSize = MEM_ROUND_DOWN(poolSize); ) [ P6 }: }1 ^3 N l 5 R. Q, \1 F& u! z$ C7 |
/* at least one valid free block and three header blocks */ ( F, F7 A$ c, _( U- g+ d5 c" U if((sizeof(BLOCK_HDR)*3 + (partId->minBlockWords*2)) > poolSize)7 R3 l7 E# c8 l$ V# K' A; y# e& O4 T
{5 b) P9 J7 C6 q4 Y% s
return (ERROR);0 ^/ T9 v8 E* ~$ j; z6 |
} 6 M9 u5 S" w/ X2 M/ ` X7 |/ P# p3 |; x* n% o! D/ E3 t6 f' ^# M
/* initialize three blocks */4 j6 |7 _$ H9 Y- ~# N$ q
pHdrStart = (BLOCK_HDR*)pPool; . B$ D3 e" G8 n A; R pHdrStart->prevHdr = NULL;3 r' m9 B" z9 p0 h. t6 R
pHdrStart->free = FALSE; /* never in use */ 1 h- s; ^/ M8 w0 h/ ^: R pHdrStart->nWords = sizeof(BLOCK_HDR) >> 1;9 |7 |) C, u! _& d1 K) _4 u6 O* V
) f5 `+ t; v3 s, o0 c. [9 d2 D
pHdrMid = NEXT_HDR(pHdrStart);) Z9 H0 X$ M+ {+ T7 L
pHdrMid->prevHdr = pHdrStart;. T; q/ C3 ?" T8 {+ r2 K( i3 L/ V
pHdrMid->free = TRUE; /* the main block */& a2 _5 {6 E/ Y* L! g" y) D. a+ |
pHdrMid->nWords = (poolSize - 2*sizeof(BLOCK_HDR)) >> 1; ; F' @) B0 x( m1 y! i) {6 Z Q7 a8 b$ g
pHdrEnd = NEXT_HDR(pHdrMid); 3 t# B" E: }$ z% v pHdrEnd->prevHdr = pHdrMid;& f# v) v8 A4 l' h$ }4 |; G
pHdrEnd->free = FALSE; 0 l& e1 K! V, A8 S9 W* F pHdrEnd->nWords = sizeof (BLOCK_HDR) >> 1;& T; [4 x$ U& ~- r4 v
$ c6 D) d0 L! | /* TODO take sem hear */9 W& d7 d! s' A, R% b
semTake(partId->semPartId, WAIT_FOREVER); . b# ]) R7 c# ]2 w! A ' S! }. U$ w2 ]0 W Q dllInsert(&partId->freeList, (DL_NODE*)NULL, HDR_TO_NODE(pHdrMid));; h/ V! |: N: B! |$ p4 Q+ ?
partId->totalWords += (poolSize >> 1); ; ^3 N( g& O/ p, i' @# v: G) Y0 J2 W: h; y6 H+ i
/* TODO give sem hear */ 4 R+ r3 y) B: ?* \* g/ { semGive(partId->semPartId); # A1 f) ^, X# l& c6 O 2 W/ s2 J3 `! K8 D6 l$ N0 ?8 B4 A4 ]& I+ H4 H
return (OK); 2 w8 _9 M/ S4 t1 m( a0 r}% L6 `: h$ x+ X- ^3 e# `6 O
0 D8 L; f& w8 b5 {, E
void* memPartAllignedAlloc(FAST PART_ID partId, unsigned nBytes, unsigned align) & Q6 M, q; G# m* r$ B: ?1 p3 H6 k{ 0 D1 l# n( e# ?' ^% j6 N FAST unsigned nWords; , [" x m3 O2 C+ w' J FAST unsigned nWordsExtra; + s3 \2 S; N. p4 v s9 V; u FAST DL_NODE* pNode;( j' z; m$ ] \4 v. }
FAST BLOCK_HDR* pHdr;$ w6 i& ^0 q8 f) d3 D9 d
BLOCK_HDR* pNewHdr; ' T% v) t# R( b* {# y& s! M. t BLOCK_HDR* origpHdr;2 [$ c5 B4 a7 t1 O6 d0 q2 N: e" D7 i
' K, i9 l# _( R8 o
if(!(IS_CLASS(partId, memPartClassId))) /* only memPartClass can call this function */ # W0 g$ L% U6 D/ S { # k# w$ F8 X. p" y; v4 ? s return (NULL); 0 s& I; G8 A8 w3 K% b; c# Y0 r }& D0 M2 t9 _$ C4 R4 Z
0 j4 @% f2 e: ^0 Q E1 _ nWords = (MEM_ROUND_UP(nBytes)+sizeof(BLOCK_HDR)) >>1; 2 m5 K% B7 t9 u9 ?" \ 2 W5 u j/ X% c if((nWords<<1) < nBytes) 8 O& B0 q0 F8 y$ S/ v {1 i4 j' a1 Q6 b, |4 C
/* TODO suspend the task */: O; Q; k, \( `0 q4 O" ]5 ~ l
return (NULL); 9 w K( A- _ Q: q1 o, K+ k }2 D* f+ O( S. i8 F( g. l" c
" `& p/ }8 |; r& Q/ ?( k: x if(nWords < partId->minBlockWords)+ w6 C7 y! K/ {3 W3 S M
{ : c; [& B& B) C3 _) y nWords = partId->minBlockWords;+ n. q, L4 x. ?. I5 d
} % e" }/ P. e% j6 I- x6 X6 G; S0 C4 n/ G3 P y/ e; }3 Z. R
/* TODO task the semaphore hear */ $ E& T- P, k% d9 ^ semTake(partId->semPartId, WAIT_FOREVER);/ e; i: z2 N1 L0 l# C
pNode = DLL_FIRST(&partId->freeList); + B- k4 H" p) g! r& s: k: y5 s5 R& b- v nWordsExtra = nWords + align/2; /* why? */* d2 J% F: L0 E& }" k
2 l3 g2 Q% D1 R# y1 l C
for(;;) ' V) b- L [$ }8 { {: n- ^2 M: Y% g& P# O& v2 l5 t
while(NULL != pNode) 5 y* t* c- F* ^6 R1 W, W9 I {1 l' S" m. t4 O" n' h
if((NODE_TO_HDR(pNode)->nWords > nWordsExtra) || - y' H( `8 _0 ^& u6 C ((NODE_TO_HDR(pNode)->nWords == nWords) && 5 _' W' U [# ?( ?9 ^! y" w (ALIGNED(HDR_TO_BLOCK(NODE_TO_HDR(pNode)), align)))). W$ H( O5 u7 [7 D
{: R3 V5 u5 _+ o
break; ) @" M* a8 {1 _8 K( h O } ) d( L2 [5 W! t) U- \7 ^( J: g- m* P" T2 R8 ]# w4 U( ^
pNode = DLL_NEXT(pNode); % N4 `: o7 U2 ?- k8 I- s } ' E1 W! n6 [; L* P& {/ o$ o ! Q9 |& a0 _9 D+ ~6 Y) Q if(NULL == pNode) ( H6 P; ?$ V6 k1 k { ! k5 Q( Q) X; p' n; V /*TODO give the semaphore *// g9 ~4 d8 n- U7 ]
semGive(partId->semPartId); ( D% P/ t2 J" E6 H* y; T return NULL;. I5 U" E- F+ w1 s+ l! {3 k: N
} I( C6 O! }2 w4 N4 e& m& B2 e* `% D
1 B7 u1 n: A6 V0 @ pHdr = NODE_TO_HDR(pNode);8 h1 B! Z& g# t5 c S( e* P
origpHdr = pHdr; 6 [2 `6 M+ ]. C5 |+ L+ j! o2 `1 t; B
pNewHdr = memAlignedBlockSplit(partId, pHdr, nWords, partId->minBlockWords, align); . ^+ y" u1 [0 N& k, c3 H9 ^ if(NULL != pNewHdr): `' r- Y8 Z# c! C8 f7 d
{ % J% @6 B" h {# F& f* x$ E pHdr = pNewHdr;& D9 \6 H. Q4 n8 ]* T* s3 @
break;; t/ d. d4 ~4 X6 T# Z6 E9 o# X
} * H3 u% { D& o, d s; W0 p7 ]3 a0 Z& D
pNode = DLL_NEXT(pNode);' C. F) O8 _4 h- p2 O
}* d7 O6 c7 V( j7 }' f: V
, l* e1 ]# z# [% `9 I H8 [ pHdr->free = FALSE;* Y2 E4 ]$ E6 P. w0 n
partId->allBlocksAlloc++; ; J% ]9 U9 \' z3 y/ d" Z. Y partId->allWordsAlloc += pHdr->nWords; . X3 M1 S2 T# M8 k& `0 K partId->curBlocksAlloc++;# ]' E d" L( V3 O8 Q% m
partId->curWordsAlloc += pHdr->nWords;( T2 T1 V* C3 k% U
* E" m3 c- Z+ U /*TODO give the semaphore hear */ ' J; B7 j; \3 L. m1 Z semGive(partId->semPartId);; d$ k. I& n ?. l2 Q
return (HDR_TO_BLOCK(pHdr));/ \# w7 z( ?: |
2 k4 J, }, y4 F" t/ L) c} ' s- |/ r7 K" I/ R; j3 I 8 a7 o) }/ o- j6 K4 _1 Kvoid* memPartAlloc(FAST PART_ID partId, unsigned bytes)+ U1 u# S/ a4 o3 I4 K
{ . u5 y8 E3 @! s' i) s! d5 O return memPartAllignedAlloc(partId, bytes, memDefaultAlign); 9 i# q& t) b4 Q}$ J0 y$ j7 Y }* c0 p" z, F( K0 ~" T; Q
- f* m6 ^* L1 A. A" K1 u9 H
STATUS memPartFree(PART_ID partId, char* pBlock) - _8 D0 t# {3 x9 Y e+ m( `{* ?4 d, d2 n, Z/ D- B6 I( l. J; t1 P
FAST BLOCK_HDR *pHdr;! W E7 T, U) a$ ]8 J: Q1 K2 S8 i6 D+ v* G
FAST unsigned nWords;7 P; D8 W9 O Z: J
FAST BLOCK_HDR *pNextHdr;! F- ]# w$ o$ u- Z, S8 J1 l4 r* q
# b9 U9 o% V; d1 A$ A
if(!IS_CLASS(partId, memPartClassId))( A) h$ }* [- R& I2 R9 G
{ ; Y7 J' Q- V; Y; d# w; l7 y return (ERROR);* r. B7 s+ D) [5 T
}; `8 @, P6 ~1 G7 `7 ^& U
" Y7 G& L6 T& E: ?
if(NULL == pBlock) ) Y( ]) P) h8 G {, s a) {- c" V5 I5 l8 a
return (OK); ; I4 E& ]# p) ^& y }" G! W, y7 }3 Q
3 }2 b; x8 y) H8 y0 K4 R0 c
pHdr = BLOCK_TO_HDR(pBlock);! w% X9 k& ^. D' D! P& x