$ G( S5 a& a9 e6 [, Dstatic STATUS memPartAddToPool(PART_ID partId, char* pPool, unsigned poolSize) 0 g/ H$ v6 k c% x5 _$ {, T% z{7 R# ^: d1 K* b7 R$ Y# d `
BLOCK_HDR* pHdrStart; : ?/ d8 q4 G* v BLOCK_HDR* pHdrMid;4 U6 k8 b# x+ L) K1 X4 K5 X, T f
BLOCK_HDR* pHdrEnd; & V% z8 S( s* g/ L. h# Z char* tmp;7 q( m) \9 Z# |' A5 T4 P/ U
int reducePool;. G. g* s( M w6 P1 i( {! {
8 \& a, u. w$ ~( l& e( q if(!(IS_CLASS(partId, memPartClassId))) /* only memPartClass can call this function */ " a' I# K4 j% B, m6 O7 J { 1 k: g6 \8 u/ O7 f: q return (ERROR); " H6 w4 \8 o$ F! ]# \/ L }. w6 N; w3 M! S( P2 q2 K; h3 {# T2 A
- m: h2 F; h, ~, D) D( x tmp = (char*) MEM_ROUND_UP(pPool); ; Z$ m/ v, h: F$ [! z reducePool = tmp - pPool; Z3 r C' \+ Y/ X0 u/ C3 I
. j4 m7 J: i' | c /* adjust the lenght */+ ~! s, i& U5 H5 W+ ?* c
if(poolSize >= reducePool)+ u1 n6 p! |7 k/ q9 L
{ C R K3 i3 X
poolSize -= reducePool;0 q. ?) ^/ o. n1 C6 z9 C$ ?
} / ~- e( Y n' Z else ; I7 k1 x! q- N {$ l; G4 @- K1 E3 b! r+ l
poolSize = 0;# l! x8 K, }! [3 z2 m
}( |: f2 N. c& s2 g% |: K: f1 X9 p+ C
pPool = tmp;7 W4 G' q& D" @( ^+ x
* q5 H) u# c5 O, g8 A7 j
poolSize = MEM_ROUND_DOWN(poolSize); 2 e O8 e, x& k0 Z' W" } - T/ ]7 `' p( w /* at least one valid free block and three header blocks */) I: }6 p1 L1 D1 _6 ~+ C2 [
if((sizeof(BLOCK_HDR)*3 + (partId->minBlockWords*2)) > poolSize)( k; B; ]: K7 B) h% Y
{ 9 m4 z- Y: O+ P+ N return (ERROR);) m: _# y' _9 b0 V) y8 S. g
} n' h) d: g' L2 E7 b
7 t7 K" {% N* x" p. O/ R
/* initialize three blocks */ 3 ~2 s& u( y: R3 K+ g. F$ P2 s pHdrStart = (BLOCK_HDR*)pPool; ) O7 Z( b a H) [+ @ pHdrStart->prevHdr = NULL;4 R; o- r0 K$ p# U7 Y- |, q2 F4 |
pHdrStart->free = FALSE; /* never in use */ 4 |4 O/ \, y1 V7 _4 p pHdrStart->nWords = sizeof(BLOCK_HDR) >> 1;, I7 t5 A5 l# e# f! o$ h
3 m- ~2 D! _/ s) E7 P4 ~5 C pHdrMid = NEXT_HDR(pHdrStart); - _3 o+ l) p j# o Q pHdrMid->prevHdr = pHdrStart;, B, K0 a0 M) b+ A% v( Y& Z
pHdrMid->free = TRUE; /* the main block */ q u( c: q: ?+ \! Q pHdrMid->nWords = (poolSize - 2*sizeof(BLOCK_HDR)) >> 1; ! u7 n% S w& \; }) e6 g0 r" d7 A6 ^* m0 f) {3 T2 F \
pHdrEnd = NEXT_HDR(pHdrMid);/ E; {& o5 i* g T
pHdrEnd->prevHdr = pHdrMid;+ u7 l9 R% E- w% |: A4 O8 r+ K
pHdrEnd->free = FALSE; 0 @, X0 l$ q3 I6 e( j pHdrEnd->nWords = sizeof (BLOCK_HDR) >> 1;1 f! o$ o. n9 C
3 x) g) g0 B! g- O5 C! g8 i /* TODO take sem hear */" E/ \$ B; p2 N& B4 J/ n u
semTake(partId->semPartId, WAIT_FOREVER);1 g7 J4 b$ j' O I; D, L, j" z; a
m* G2 d1 i( B- w4 N* ?! K# Q
dllInsert(&partId->freeList, (DL_NODE*)NULL, HDR_TO_NODE(pHdrMid)); ' Y b4 f# |( U partId->totalWords += (poolSize >> 1);' k' b9 A( |+ p( S
& y0 c; \2 Z p) j. n% A
/* TODO give sem hear */6 [. l, v( m% A: p# a
semGive(partId->semPartId); 2 T0 q9 {! @5 Y7 ] $ I# s6 C7 h' ? b7 z0 I5 c2 I5 | - O6 f" f/ Y! ^: j/ }$ H1 L return (OK);% p4 c6 P" U* o# @
} |7 @4 C$ M5 l8 w% v8 R* G( b $ d8 \8 |+ C5 y( rvoid* memPartAllignedAlloc(FAST PART_ID partId, unsigned nBytes, unsigned align) 7 S5 a8 R& r, y4 s) x9 ~/ h{ ; k) Z' T; }% C/ j k FAST unsigned nWords;9 c- [, N5 J: b. K, ^+ W6 ]
FAST unsigned nWordsExtra;% U6 A' r9 c- E* ]
FAST DL_NODE* pNode; + G( G6 n; G" i0 Y FAST BLOCK_HDR* pHdr; 6 J/ c# o1 D# E8 N; ? BLOCK_HDR* pNewHdr; 1 S5 p2 w8 y9 s8 A7 I- a BLOCK_HDR* origpHdr;2 y$ p. I" x3 G. k3 ]
5 o0 U( f! Y. H6 @/ i/ s% p if(!(IS_CLASS(partId, memPartClassId))) /* only memPartClass can call this function */* }, h, W2 Q2 k. c! ~) \" N$ ^( ?
{ 7 V6 m$ l$ R. P/ S) b return (NULL); : }$ L& i7 y3 V% T1 w5 a }8 I: e' f( `- s v( Y" ~
1 a2 a' m3 {* T2 j: P nWords = (MEM_ROUND_UP(nBytes)+sizeof(BLOCK_HDR)) >>1; * p% L Q4 L! u4 h" p 7 a# Z$ W8 V4 P4 v! W/ M, ] if((nWords<<1) < nBytes)1 u4 H! l% u( n% \. n
{2 s# ~, B: r* M H1 r/ D, a
/* TODO suspend the task */ 4 }# s! H% w+ |6 ]! @7 Y- i return (NULL); / ^1 \$ r4 d3 h2 d; f+ y }" I9 ]4 P+ E& }
7 y ~5 Y, p1 L% _1 `& b9 i
if(nWords < partId->minBlockWords)& b: n5 v" j# P. _& A: W5 }3 U
{* F1 t/ }, p3 A ^* r8 H
nWords = partId->minBlockWords; * T* ]$ B- {3 h# S. }2 T } ( W. H: A6 L; O! R; x- {. H9 @9 J; m4 a3 E
/* TODO task the semaphore hear */ $ c; O4 H, V5 O" P( O& A' R semTake(partId->semPartId, WAIT_FOREVER); ' a {( a, ^9 ~$ ~0 V2 v( O pNode = DLL_FIRST(&partId->freeList); , R; i6 {( B. B; q6 a, _ nWordsExtra = nWords + align/2; /* why? */- M. ]6 W4 I* f& c8 I; J
" Z2 L) J# {8 w' ?. X for(;;)5 Y% ^( l2 I0 @( @2 `8 F# _
{0 t6 d! q) V( M* a, a3 ?% p
while(NULL != pNode) " J% Q9 O& O* A+ p { & i( t5 i% }) y W8 C: } if((NODE_TO_HDR(pNode)->nWords > nWordsExtra) || * M* R: X, _) z% l# |; E8 m$ U ((NODE_TO_HDR(pNode)->nWords == nWords) && ; E0 \) M) _. V! A( N (ALIGNED(HDR_TO_BLOCK(NODE_TO_HDR(pNode)), align)))) : S1 V( m- ^. V s' y { ' S5 K7 Y. g% n& q9 X break; ' T1 P( E0 x% q6 D }( Y1 t9 _) m, O3 n
0 t8 U/ v u& V4 T
pNode = DLL_NEXT(pNode);1 u% q- ~. C3 \8 \/ h; W
} & U) t/ c& W' R9 Y& c3 {$ \2 Z2 D8 T b7 {
if(NULL == pNode), S; C4 e! t( d. Y% m6 n' ^0 G
{ 2 s6 s' P: W+ s0 Q$ P) q: ] /*TODO give the semaphore */ " z9 f u2 \( `, Y& d) X8 d9 B semGive(partId->semPartId); 0 H6 n/ J3 y& L- m# B9 C+ L: h return NULL; ! ^; ?0 ?6 X1 @9 J }5 d% O( M" D# O/ ~
! P( V: } j1 `3 L
pHdr = NODE_TO_HDR(pNode); . Q; W& S% \# n8 D# M0 B origpHdr = pHdr;7 v2 e: }; }$ a