QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2836|回复: 0
打印 上一主题 下一主题

malloc(内存分配)在嵌入式下的一种实现

[复制链接]
字体大小: 正常 放大

937

主题

117

听众

3万

积分

升级  0%

  • TA的每日心情

    2020-10-25 11:55
  • 签到天数: 264 天

    [LV.8]以坛为家I

    自我介绍
    内蒙古大学计算机学院

    社区QQ达人 金点子奖 助人为乐奖 风雨历程奖

    群组2013年数学建模国赛备

    跳转到指定楼层
    1#
    发表于 2013-7-26 10:17 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    想知道malloc是如何实现的吗?这里是一个简单版本,所有的功能都在这个文件实现了。如果你对malloc的原理有兴趣,可以通过这个代码窥视一二。实际上这个实现是著名的嵌入式操作系统vxworks5.5以前的内存分配版本。这里我已经把它实现的更简单易懂了。当然我还有移植到vc++下的版本,更方便调试。有需要请留言
    4 _& [, F$ ], }9 k
    . _) \; r9 `6 V% S# K! b- j4 n9 ~& J6 j6 S9 @

    8 \: B+ q6 W; r1 V& _ *\file7 f1 s- U6 R! \9 C
    *\brief                + O6 n5 Z; S2 [6 V" Q9 p
    *\details       
    - p0 J5 f1 \9 B* `0 b: ~ *
    $ S# D% y: Y5 `# K *\author        Janson; S% a& p+ f% q; q6 E; q
    *\version        : j6 e% W3 G0 B( o
    *\date                04Jan12
    7 K0 K- Q- M+ u1 }9 F( M *
    ( B% A/ Z; o. U6 e3 _  m *\warning        4 P3 E. L- n6 Z# C  m- T  N& j
    *# s* H1 m+ Y! ^) D* P3 G& s
    *\history \arg        30Jan12, Janson, Create the file8 u3 _* p  B- p. ?
    *        modify from VxWorks source
    ; O5 L6 y  w8 z& |' o *  Legal Declaration: it is for studying VxWorks only.: o4 v6 z/ z; j: s( ~2 `* p
    */
    ' y* W# x5 ]  Z7 p#include "includes.h"/ m3 U9 t) {* p, t# d1 r' f8 b

    0 n& x8 L* y# `0 i7 N  m( v/* The memParLib.h file is hear:
    2 L& i; R9 o& H1 r& Xhttps://code.google.com/p/vxwork ... rivate/memPartLib.h, N2 l) @( |; w$ o
    */: x" q+ l) M  ?) C$ q8 Y5 q2 `

    8 h/ L5 K" w/ d2 H/* optional check for bad blocks */4 J0 [- U7 {* \- r: ^* L
    - U9 b8 z2 E6 X! m. R
    #define MEM_BLOCK_CHECK                        0x10/ d* ^, M2 m& \" z* l
    # v# q8 e& O- b  q
    /* response to errors when allocating memory */2 p$ U( H1 Z$ r5 y* ?

    5 y& T/ o" j' t; Y& J#define MEM_ALLOC_ERROR_LOG_FLAG        0x20$ p3 l- t' w( I/ p- f( t; G( c; N
    #define MEM_ALLOC_ERROR_SUSPEND_FLAG        0x40
    ' L1 Y0 f8 `2 v
    , T0 t" L4 l$ h5 _4 v$ `/* response to errors when freeing memory */
    6 Y, C& G5 c+ C/ V" i8 k- T" f: C4 z' d: A8 y2 s" v8 r' V; D5 w. ]
    #define MEM_BLOCK_ERROR_LOG_FLAG        0x80# M. Y' E7 A6 M: D; E3 m3 E
    #define MEM_BLOCK_ERROR_SUSPEND_FLAG        0x100+ r0 `: K6 r7 E

    ( f# M4 g6 e! @: N4 p3 E! T#define NEXT_HDR(pHdr)  ((BLOCK_HDR *) ((char *) (pHdr) + (2 * (pHdr)->nWords)))
    + r; v  a3 m) V! k/ n( T) o#define PREV_HDR(pHdr)        ((pHdr)->prevHdr): t/ j) _2 ~# l% W) H; o
    ! c9 g. [! c8 L7 z; ]
    #define HDR_TO_BLOCK(pHdr)        ((char *) ((int) pHdr + sizeof (BLOCK_HDR))); M  x4 i5 R4 T$ v% D4 s
    #define BLOCK_TO_HDR(pBlock)        ((BLOCK_HDR *) ((int) pBlock - \2 W4 D& d2 o2 L: K$ g
                                                    sizeof(BLOCK_HDR)))
    , M4 [& x* \2 ~
    5 O: f, u' w9 W! c( v0 f" W/ q#define HDR_TO_NODE(pHdr)        (& ((FREE_BLOCK *) pHdr)->node)! V' g/ T. B( |0 O$ S0 c
    #define NODE_TO_HDR(pNode)        ((BLOCK_HDR *) ((int) pNode - \
    7 ]# `+ N1 |% z- U2 o, _                                                OFFSET (FREE_BLOCK, node)))* h: E4 B( s3 F+ J$ H

    - `. ]! J" b; g  `static BOOL memPartLibInstalled = FALSE;2 P) T& T; V* A. }; {* R- \; N8 D
    5 ^* Q; n/ y' u- @. v
    static OBJ_CLASS memPartClass;  c% R* ?  ^  G# T7 l1 T6 ]
    CLASS_ID memPartClassId = &memPartClass;9 V* F+ X" p0 `/ G; X* k' ?& V
    5 X! k! z# R. A- D
    static PARTITION memSysPartition;  b2 O9 J6 I! C7 E# a
    PART_ID memSysPartId = &memSysPartition;& D5 s- B; c4 x. I, y& H
    U32 memDefaultAlign = _ALLOC_ALIGN_SIZE;
    ; e3 [- p' g/ a& K4 \7 O+ {; b4 o! y* w' x2 L, b9 K7 r
    static SEMAPHORE semMemSysPartition;
    " O: P3 @7 Z$ {; z- S0 s
    8 v% t4 B- ?0 K0 F* Dstatic void memPartSemInit(PART_ID partId);$ O! M3 x5 T- j6 ]* V
    ! Q8 l7 k+ B0 U& |
    FUNCTION  memPartSemInitRtn        = (FUNCTION) memPartSemInit;: c5 S& f4 v7 ^) _* }' J* ~

    ' H& L  x  q' S( cunsigned memPartDefaultOption = MEM_BLOCK_ERROR_SUSPEND_FLAG | MEM_BLOCK_CHECK;6 v4 D+ \' Z3 L/ ~/ K; S3 i
    - C/ |  o# E# L# m1 Y( N# d: h
    static BOOL memPartBlockIsValid(PART_ID partId, FAST BLOCK_HDR* pHdr, BOOL isFree);& C! P! X, U9 d1 Y( V
    static BLOCK_HDR* memAlignedBlockSplit(PART_ID partId: f9 u+ D. T9 O
            , FAST BLOCK_HDR* pHdr- c7 q! B; C( z9 {" e/ |
            , FAST unsigned nWords# i5 h  N8 K4 ^- h
            , unsigned minWords
    ! [* M7 j0 G5 K        , unsigned align);% e5 y2 t! V# G( V5 m

    ) s, v6 ~8 R+ G9 D  d+ astatic STATUS memPartAddToPool(PART_ID partId, char* pPool, unsigned poolSize);
    ) t: F- z# y, w
    / G3 c; i' z# ]" xSTATUS memPartLibInit(char* pPool, unsigned poolSize)8 b% x7 }8 l+ g3 B
    {' I; e: w1 b# `6 m# ?2 J- g# h8 [. I
            if((!memPartLibInstalled) &&
    . Q! B& e! m5 y4 G0 q                (OK == classInit(memPartClassId, sizeof(PARTITION), OFFSET(PARTITION, objCore)
    9 q. `" a& m! c$ a                , (FUNCTION)memPartCreate, (FUNCTION)memPartInit, (FUNCTION)memPartDestroy)))
    ; L1 s0 f5 S) n+ q# a        {' {" g  T/ Q. x5 ^1 ^
                    memPartInit(&memSysPartition, pPool, poolSize);2 W! h$ d2 d+ r/ R7 X
                    memPartLibInstalled = TRUE;
    8 |2 ^& |2 w7 ^: j2 z# O        }# `8 C4 V1 K* `$ q& U( Q, x) ~! R
    3 F' i5 R* u  P6 |( }3 C, o
            return ((memPartLibInstalled)? OK : ERROR);2 u5 A6 [9 W5 X; I2 S! d
    }
    ' B( B# _6 `- }1 E; n2 K8 ~  B+ _% }# M" \$ W: S5 N. ~0 S' b
    PART_ID memPartCreate(char* pPool, unsigned poolSize)- t! P0 M0 q+ n# m
    {/ z$ ^7 J3 r6 _1 B' y- H6 E
            PART_ID pPart = (PART_ID)objAlloc(memPartClassId);
    . l( R5 b" e% S1 y7 O+ V9 ]
    2 b9 U' w: G2 T2 C9 \# i        if(NULL != pPart), M6 R0 W9 ^( R+ t
            {
    # f' G4 X. [/ k, g2 @; d4 m( u6 G9 p                memPartInit(pPart, pPool, poolSize);; |: R" `: E9 M! j* j
            }4 y" ~. c6 W, Y' G' `
    # m" F3 G2 F8 F- f* M
            return pPart;* e# {! H* m9 n/ `* V
    }: n% f( O/ v3 n% T. [: E! F

    3 m1 M' W& q; y# y. evoid memPartInit(PART_ID partId, char* pPool, unsigned poolSize)
    ) t2 n1 S3 O' B) \/ l. D3 Y{3 z. W. M! M8 M$ s
            memset((void*)partId, 0, sizeof(*partId));
    8 V! q0 |) P4 ?$ ~: t
    % Y8 c: H" o- @2 W        partId->options = memPartDefaultOption;2 y( B) T5 X% J) O6 W
            partId->minBlockWords = sizeof (FREE_BLOCK) >> 1;        /* word not byte *// F9 i4 x7 `- H& V9 c: L

    : Z2 E0 U7 w, p+ W( N. z8 P, f( R: A        (* memPartSemInitRtn) (partId);+ K0 i6 N" Z, Z% t( `+ c
            9 F- z4 s3 s/ [
            dllInit(&partId->freeList);$ E' Z7 ]% T9 n, G/ I
           
    . P8 i0 M* g" ?0 T        objCoreInit(&partId->objCore, memPartClassId);; i3 r' t* B" }4 i
            9 }' Z" M( m, f7 |: l: V
            memPartAddToPool(partId, pPool, poolSize);: \4 l5 z- {3 r" u9 [; L, U
    }
    4 _; Q3 b% u4 i2 ?5 U. G" [: e( z) L3 C/ u! a- o
    STATUS memPartDestroy(PART_ID partId)) g; Q3 \% b: j) O2 B- `+ |
    {
    6 M' A" J7 _6 w; ~1 J" s: D0 ^        return (ERROR);  y$ |5 k9 u1 {9 ~
    }
    9 q4 L6 j' f; H4 M" L) Y0 B
    1 Z' F* P1 U3 O1 k1 }/ L" L( t9 Jvoid memAddToPool(FAST char *pPool, FAST unsigned poolSize)/ ^0 g/ _9 _" Z- G) {
    {
    2 @3 }( ~+ n: _' W; f: [1 F    (void)memPartAddToPool(&memSysPartition, pPool, poolSize);$ C1 r0 f! y$ S0 N1 e. s
    }3 W- n7 A7 I" I' P8 K2 P3 o
    $ `5 J2 T; `0 Q3 k) L

    $ 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

    % J( L' T$ t# ?( t# Y                pNewHdr = memAlignedBlockSplit(partId, pHdr, nWords, partId->minBlockWords, align);
    " l: x1 j7 w* @2 r" d9 G                if(NULL != pNewHdr)
    ; u6 m0 X) h) Y$ @# ]; M                {% g- F% c9 _+ \: J& W9 V
                            pHdr = pNewHdr;: _1 I$ b8 @: g0 O1 H: s$ M* `  i( `
                            break;
    4 a1 O- X: X, B3 L3 [+ C# f                }: w( j& {. Q% a! ~- e0 \! W

    - x: T3 `7 y6 _( y. H                pNode = DLL_NEXT(pNode);9 u. r# ], B$ M6 p( p# M) }
            }
    # o  u9 R" ^6 e( G" k: K1 k' w. f! H' @4 d* o0 d
            pHdr->free = FALSE;
    2 e  I' Y% G) O3 V  }8 V' o0 i. r( o        partId->allBlocksAlloc++;
    7 R0 [0 k. q) m* |9 U* r/ w        partId->allWordsAlloc += pHdr->nWords;
    + x: }0 [& p: {1 H3 A- Y& }        partId->curBlocksAlloc++;
    - t- K) U( C! T3 _        partId->curWordsAlloc += pHdr->nWords;
    + y- }5 [4 e# y$ b
    1 p8 b7 |3 A( U4 v        /*TODO give the  semaphore hear */
    - M: b$ E3 e* j7 A" p9 Z. G        semGive(partId->semPartId);
    . I9 L0 p- F) f8 H/ `; d* }! v* @% i        return (HDR_TO_BLOCK(pHdr));  P0 m" F4 L' ~8 q
           
    ) O5 J1 [1 E, c: \* ~% |}
    $ _) o+ [7 O3 d3 x! \; P1 K
    . y0 `0 S" @6 p9 b% o& Wvoid* memPartAlloc(FAST PART_ID partId, unsigned bytes)" y/ t0 Y9 ^  a" ^8 o+ ?- i% p
    {/ ?* Q* @/ a8 j# P" ]7 ^
            return memPartAllignedAlloc(partId, bytes, memDefaultAlign);
    % G; g7 d0 w" u; V% ]}
    # p  _4 x9 Z  U" \' B9 n! e, q1 x0 \0 A) S$ t
    STATUS memPartFree(PART_ID partId, char* pBlock)+ _" d2 D  c% @" }5 [3 m
    {5 N+ o% W) ^; d3 @$ c3 t
            FAST BLOCK_HDR *pHdr;# t( N. [2 ?. y3 G! m
        FAST unsigned   nWords;8 |% W' g  _1 @
        FAST BLOCK_HDR *pNextHdr;2 J0 M2 _6 R4 O! h, O
    % k. R5 G& k; C+ K' W
            if(!IS_CLASS(partId, memPartClassId))9 h# K- R) W% a, ]
            {
    7 i& n$ t6 d2 S7 {                return (ERROR);
    2 y( I5 y) u3 q/ d        }: ^7 G9 L5 E9 ~+ ]
    + j9 b- Y$ z: c; Y6 y. y
            if(NULL == pBlock)
    $ L& x5 a" _$ R, l' A        {  [6 X2 t! c4 N, d) R
                    return (OK);
    * L6 x3 P' Y* T+ A        }5 @; ]: i; K5 `' X8 E0 f; S
    . t4 I  ?; [: J, w# y
            pHdr =  BLOCK_TO_HDR(pBlock);
    : d4 H; a7 m) P/ {/ e3 H( e( ^; }: [$ w/ h, B- X8 B
            semTake(partId->semPartId, WAIT_FOREVER);! s$ d7 `$ t! h. q
    / F2 G+ ?; K' q8 r
            if((partId->options & MEM_BLOCK_CHECK)/ h8 i) K, h8 t* l0 k1 e/ _
                    && !memPartBlockIsValid(partId, pHdr, FALSE))
    ! `+ c$ w0 Z& F% Q9 T" d) l; `0 V, k- D        {/ w" P+ ]6 Q1 h/ K% @
                    semGive(partId->semPartId);
    - h( w6 W* r8 m: n                return (ERROR);( ~; J3 p0 b7 x* B8 a  d% b
            }5 G# \; B+ `4 p1 ]

    * w# Q0 S3 @3 s  k& r& x        nWords = pHdr->nWords;7 I3 C0 P2 Z; n6 W
            if(PREV_HDR(pHdr)->free)  i$ _; U- ~+ N# o, U' K; L( Q3 J5 w
            {/* the prev hdr is free and than coalesce with it */+ ^% z: G, ~  n+ S; C% z
                    pHdr->free = FALSE;' m/ l/ @& Q4 w3 ^
                    pHdr = PREV_HDR(pHdr);3 B$ I5 C+ V0 r- s7 q1 w( s
                    pHdr->nWords += nWords;
    & @5 g; L! p! X, P7 o        }
    0 B5 Y! E  |! |4 `' a. _3 k        else& |, @: w; V0 V+ ^/ x( M6 P
            {7 T2 u) F/ \3 @2 J
                    pHdr->free = TRUE;. V7 j# l4 o8 d3 S8 s2 \3 y" e# a
                    dllInsert(&partId->freeList, (DL_NODE*)NULL, HDR_TO_NODE(pHdr));$ [6 v4 x, `" z9 p
            }
    . N( n7 j; t0 t# h6 u& I9 ~) U& K4 V% k% f! R; U6 o! X1 I
            /* check to coalesce with the next */
    % c$ z5 F- V! {7 f% @# R" P$ H        pNextHdr = NEXT_HDR(pHdr);
    8 ^3 `! C! X1 z6 Z: P        if(pNextHdr->free). L3 `2 q+ Q2 E7 ?) F
            {
    8 B7 V; O( V( {! B- `+ V                pHdr->nWords += pNextHdr->nWords;4 m1 o1 w! V) n" ~4 ~! m; P7 V
                    dllRemove(&partId->freeList, HDR_TO_NODE(pNextHdr));" e, d' X, i3 l+ o, y2 k4 M
            }- q1 Y) }7 w9 ~" V
    + N4 I+ d# S" O0 r7 ^
            /* cannot use pNextHdr->prevHdr=pHdr hear */) k! F: D( i+ G0 w+ Q" u6 x$ c* ]
            NEXT_HDR(pHdr)->prevHdr = pHdr;
    6 K: o- G# m! ~+ S2 t6 {
    * F( A9 l" x, @! x, k4 z        partId->curBlocksAlloc--;4 Q# j' U* U2 T3 E& O; S+ O4 B0 o
            partId->curWordsAlloc -= nWords;1 K/ E* z4 _' E: H7 |9 z

    2 I) z- i/ h! z+ V8 _4 g        /* TODO give sem hear */
    1 G8 c$ m- c& q$ Q: a! a0 z        semGive(partId->semPartId);6 |2 n/ T$ ?/ y! H+ c
            6 ?) A: w" l1 n% B) v5 e6 o
            return (OK);
    - d  }/ _" N1 s5 R  ~}9 M  n# G# r8 X+ S6 ?

    ! a$ A6 _& `( J3 d! wstatic BOOL memPartBlockIsValid(PART_ID partId, FAST BLOCK_HDR* pHdr, BOOL isFree)
    ( d1 B  j# w, F+ c{
    / q  r; o; O8 M1 v6 y        BOOL valid;! d4 [" O, h8 Y$ [9 q0 g! S

    ! U3 b2 S3 y4 g- c1 ?, \- X+ j        TASK_LOCK();4 |& }/ q# B6 z/ S  ^" a, {
            semGive(partId->semPartId);
    ( `: Q% E+ ~% `, s6 ]8 C        5 _5 `- G- @! A( h9 ]$ j
            valid = MEM_ALIGNED(pHdr)9 O  h6 K( w- \! c: y
            && MEM_ALIGNED(pHdr->nWords*2)2 {! c+ ^8 w( P6 l0 M8 i
            && (pHdr->nWords < partId->totalWords) ) G' J0 L9 H! P7 C: y! Z, G2 {8 G
            && (pHdr->free == isFree)
      _' m0 K0 x9 [" j6 p" W        && (pHdr == PREV_HDR(NEXT_HDR(pHdr)))9 t" L6 s0 D5 f8 b$ f
            && (pHdr == NEXT_HDR(PREV_HDR(pHdr)));. A. k& c9 O, I' x4 b
            7 Z% x- S* t! M  K9 l8 g
            semTake(partId->semPartId, WAIT_FOREVER);( \) G8 ?! v% C; `8 O- o9 X
            TASK_UNLOCK();* H+ v( @0 v8 D3 u

    ' D$ d6 p* w5 r! Q) P2 a        return valid;
    9 r, S$ ?; H! D; A1 r/ ?( r}+ z2 _  k, d! E

    , W2 ^: O+ o: @1 [static BLOCK_HDR* memAlignedBlockSplit(PART_ID partId
    * \- u. \) X  Q' F1 {' L        , FAST BLOCK_HDR* pHdr/ s0 V5 N7 S# |+ q5 l$ S! A0 s- n
            , FAST unsigned nWords% j4 e% q; ~: y
            , unsigned minWords
    3 u$ d. g# I. Q! b; T$ F        , unsigned align); R& |8 p2 W# \% |% M+ @
    {# D" B/ ?2 v8 g# K
            FAST BLOCK_HDR *pNewHdr;2 S1 f  v% j% N3 F& F
        FAST BLOCK_HDR *pNextHdr;1 `9 B) e2 G* c! X/ `9 y% x  N
        FAST char *endOfBlock;. W. e0 m+ G( ?4 J
        FAST char *pNewBlock;
    , v& R0 _# E7 K/ w7 _    int blockSize;
    4 L4 h" A+ v% W& ~+ m: P% H. L, i2 ^1 y8 v& \: B4 p* z
            endOfBlock = (char*)pHdr + (pHdr->nWords*2);& U- `* u3 l( H0 _
    5 N6 z. u9 O, l' a+ w! M6 W4 Q3 Y
            pNewBlock = (char*)((unsigned)endOfBlock - ((nWords - sizeof(BLOCK_HDR)/2)*2));
    ; [* d* R/ w0 g) S+ n  [1 r; @& v/ k% i
            pNewBlock = (char*)((unsigned)pNewBlock & (~(align-1)));( v) @( r0 N' g# h9 J& Q/ O* G. ]3 Z8 W

    , @0 i- l5 e2 \# S0 v        pNewHdr = BLOCK_TO_HDR(pNewBlock);
    " l, A- \8 }) _2 m/ s2 D% N, N* Y" w
    8 {, r4 q5 }5 r7 ~* ^2 f1 }        blockSize = ((char*)pNewHdr - (char*)pHdr)/2;* z9 j/ d8 |4 x' O; m; U

    . q9 U/ A# K) r$ f7 w: J) Y. u        if(blockSize < minWords)
    8 n, a3 g$ F$ J        {; f4 k4 p1 Q. s! F( P- }0 ~
                    if(pNewHdr == pHdr)
    ) U8 p0 o5 i' I$ N3 a/ B                {
    ( y) w& C5 g, x4 @! x8 m: v, {" k                        dllRemove(&partId->freeList, HDR_TO_NODE(pHdr));- Z% ~  b, P" u0 @
                    }) P% F2 j, R4 f, v
                    else
    4 e/ b3 ^6 ^5 u3 w) f                {" Q# V6 O+ C, Q+ w+ v7 o5 m
                            return NULL;
    5 \! ]4 }- t2 i                }1 r- V' w( t! ?" D* u# t/ Q4 i
            }( o! }  w  d3 p( O& ]! z
            else
    9 K- ], O, R. W. X3 i        {        /* recaculate pHdr */5 C( R+ D, J) y3 o' [, f
                    pNewHdr->prevHdr = pHdr;
    ; ]" J7 z0 R7 m9 M/ k                pHdr->nWords = blockSize;
    + K6 B# J+ t& X        }
    % x: c7 H& ?6 R  F: R" m2 ]' m# V* l7 c
            if(((U32)endOfBlock - (U32)pNewHdr - (nWords*2)) < (minWords*2))! M' o6 w# H6 m; `1 Q
            {+ O9 Y" }) \* D! Z0 L5 F5 F
                    pNewHdr->nWords = (endOfBlock - pNewBlock + sizeof(BLOCK_HDR))/2;
    # o* ~+ f2 [- r0 u* e2 i+ R& b' X                pNewHdr->free = TRUE;" Y( w1 |  u  Z* \3 {( o! f
    ! N3 {# A, V! z0 _! x/ n2 I: X
                    NEXT_HDR(pNewHdr)->prevHdr = pNewHdr;1 ~) y; Z# P# Q& d( [
            }2 I6 m) e; o/ u/ ~. z+ U- }* @
            else# ^0 t4 i# H* @% g$ D9 n. ?) H
            {/* space left is enough to be a fragment on the free list then */* P' U( }! N% F1 z) q
                    pNewHdr->nWords = nWords;
      k5 m6 }8 }+ Y                pNewHdr->free = TRUE;* q1 ~% [! @) }: m4 L' w
    / Q5 N  j8 B/ j  M
                    pNextHdr = NEXT_HDR(pNewHdr);
    & H5 w0 ]7 n6 d5 S+ h: T5 h; o# j4 Q                /* words 包括BlockHdr */
    ! t3 L5 E" r' b$ t                pNextHdr->nWords = ((U32)endOfBlock - (U32)pNextHdr) / 2;
    + @7 A! @! F" ]                pNextHdr->prevHdr = pNewHdr;
    - W0 K2 G: W& `8 Q) u3 N! K                pNextHdr->free = TRUE;
    ' n9 E6 Y1 @" R) p3 i
    3 s: D7 r% n4 g7 c' c- ?0 W                dllAdd(&partId->freeList, HDR_TO_NODE(pNextHdr));" C# W9 j' C) Y
    4 a! ^& Z5 U4 R$ \! ~9 i) L
                    NEXT_HDR(pNextHdr)->prevHdr = pNewHdr;! F( D  t, @3 j$ Q4 {' ]) S  W
            }6 K) v% ~9 }: I6 H% ~
    6 o1 `3 O5 o7 M0 E) I, |9 i* s: v. L
            return (pNewHdr);
    7 `( e: d; b9 ]& x6 q2 N$ s- `}" E1 b/ }# w9 C, ~3 k
    # J# g  O- r: V6 f' T, I
    static void memPartSemInit(PART_ID partId)
    ) s/ X# w  q* s. R  y. I1 x{9 z9 z- c( K# J3 H$ W) Z
            semBInit(&semMemSysPartition, SEM_Q_FIFO, SEM_FULL);
    / f  Q% T: x1 H" F* r/ [8 @( ]/ W# x- u2 X% @' M1 t1 f. t: [
            partId->semPartId = &semMemSysPartition;* Y8 B9 y# o/ G" l' m/ L
    }- e: C6 |# ], x/ o3 ?7 g. L9 Q

    * s  M* w6 T, r0 svoid* malloc(unsigned bytes)
    8 p, K" m' N+ u/ N0 c{
    ' O4 o  ~/ A. v, m- Q        return memPartAlloc(memSysPartId, bytes);
    # U% a/ o  Z. i. P  j8 s}
    , a5 ~( v8 O% |. @  f! M1 I7 G% _3 ]& i% f( R" J$ X) A
    void free(void* p)0 Z1 Q3 d/ E2 D, w( f
    {/ J4 S- Y$ ^+ u$ o. |9 e2 j
            memPartFree(memSysPartId, (char*)p);
    9 |& U# e4 J# }8 q8 P' W# E}
    - J+ z9 D4 W1 L  Y; \3 }* x" K) S1 @
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-16 03:20 , Processed in 0.410258 second(s), 50 queries .

    回顶部