padblock()

padblock()

概要

引数

実装

   85: /*
   86:  *  pad a block to the front (or the back if size is negative)
   87:  */
   88: Block*
   89: padblock(Block *bp, int size)
   90: {
   91:         int n;
   92:         Block *nbp;
   93: 
   94:         QDEBUG checkb(bp, "padblock 1");
   95:         if(size >= 0){
  • sizeが正値の場合
   96:                 if(bp->rp - bp->base >= size){
  • rp - baseがサイズより大きい場合は,rpをサイズ分,前方にずらす.
   97:                         bp->rp -= size;
   98:                         return bp;
   99:                 }
  100: 
  101:                 if(bp->next)
  102:                         panic("padblock 0x%luX", getcallerpc(&bp));
  103:                 n = BLEN(bp);
  104:                 padblockcnt++;
  105:                 nbp = allocb(size+n);
  • 現在よりサイズ分大きなブロックを確保する.
  • 詳細はallocb()を参照
  106:                 nbp->rp += size;
  107:                 nbp->wp = nbp->rp;
  108:                 memmove(nbp->wp, bp->rp, n);
  109:                 nbp->wp += n;
  110:                 freeb(bp);
  111:                 nbp->rp -= size;
  112:         } else {
  • sizeが負値の場合
  113:                 size = -size;
  114: 
  115:                 if(bp->next)
  116:                         panic("padblock 0x%luX", getcallerpc(&bp));
  117: 
  118:                 if(bp->lim - bp->wp >= size)
  119:                         return bp;
  • lim - wpがサイズより大きければ何もしない.
  • そうでなければ,新しいブロックを生成する.
  120: 
  121:                 n = BLEN(bp);
  122:                 padblockcnt++;
  123:                 nbp = allocb(size+n);
  124:                 memmove(nbp->wp, bp->rp, n);
  125:                 nbp->wp += n;
  126:                 freeb(bp);
  127:         }
  128:         QDEBUG checkb(nbp, "padblock 1");
  129:         return nbp;
  130: }