holdblk
#define HGROUND (struct holdblk *)0 /* ground for the holding block queue */
(sizeof (struct holdblk) - sizeof (struct lblk *) + blksz*numlblks)
struct holdblk *holder;
struct holdblk *nexthblk; /* next holding block */
struct holdblk *prevhblk; /* previous holding block */
inf.hblkhd = (inf.smblks / numlblks) * sizeof (struct holdblk);
freespace(struct holdblk *holdblk)
lblk = CLRSMAL(holdblk->lfreeq);
size = holdblk->blksz + sizeof (struct lblk) - sizeof (int);
unused = CLRSMAL(holdblk->unused);
space += ((char *)holdblk + HOLDSZ(size)) - (char *)unused;
static struct holdblk **holdhead; /* pointer to array of head pointers */
struct holdblk *holdblk; /* head of right sized queue */
struct holdblk *newhold;
holdhead = (struct holdblk **)
malloc_unlocked(sizeof (struct holdblk *) *
holdblk = holdhead[nb / grain];
if ((holdblk != HGROUND) && (holdblk->lfreeq != LGROUND)) {
lblk = holdblk->lfreeq;
if (lblk < holdblk->unused) {
if ((holdblk->lfreeq =
holdblk->nexthblk;
} else if (((char *)holdblk->unused + nb) <
((char *)holdblk + HOLDSZ(nb))) {
holdblk->unused = (struct lblk *)
((char *)holdblk->unused+nb);
holdblk->lfreeq = holdblk->unused;
holdblk->unused = (struct lblk *)
((char *)holdblk->unused+nb);
holdblk->lfreeq = LGROUND;
holdblk->nexthblk;
lblk->header.holder = (struct holdblk *)SETALL(holdblk);
newhold = (struct holdblk *)
if (holdblk != HGROUND) {
newhold->nexthblk = holdblk;
newhold->prevhblk = holdblk->prevhblk;
holdblk->prevhblk = newhold;
lblk->header.holder = (struct holdblk *)SETALL(newhold);
assert(((struct holdblk *)CLRALL(lblk->header.holder))->blksz >=
static ssize_t freespace(struct holdblk *);
struct holdblk *holdblk; /* block holding blk */
struct holdblk *oldhead; /* former head of the hold block */
holdblk = lblk->header.holder;
if (!TESTBUSY(holdblk))
holdblk = (struct holdblk *)CLRALL(holdblk);
lblk->header.nextfree = SETSMAL(holdblk->lfreeq);
holdblk->lfreeq = lblk;
offset = holdblk->blksz / grain;
if (oldhead != holdblk) {
holdhead[offset] = holdblk;
holdblk->nexthblk->prevhblk = holdblk->prevhblk;
holdblk->prevhblk->nexthblk = holdblk->nexthblk;
holdblk->nexthblk = oldhead;
holdblk->prevhblk = oldhead->prevhblk;
oldhead->prevhblk = holdblk;
holdblk->prevhblk->nexthblk = holdblk;
cpysize = ((struct holdblk *)
struct holdblk *hblk; /* ptr to holding blocks */