Pool.c
Click here to get the file
Size
1.6 kB
-
File type
text/plain
File contents
/*ident "@(#)Pool:Pool.c 3.1" */
/******************************************************************************
*
* C++ Standard Components, Release 3.0.
*
* Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc.
* Copyright (c) 1988, 1989, 1990 AT&T. All Rights Reserved.
*
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System
* Laboratories, Inc. The copyright notice above does not evidence
* any actual or intended publication of such source code.
*
******************************************************************************/
#include "Poollib.h"
Block_pool_ATTLC::Block_pool_ATTLC (size_t n) : cnt(0), sz(n), head(0)
{
}
Block_pool_ATTLC::~Block_pool_ATTLC()
{
free();
}
void
Block_pool_ATTLC::free()
{
while (head) {
Block_header_ATTLC* b = head;
head = head->next;
delete (char*) b;
--cnt;
}
assert(cnt == 0);
cnt = 0;
}
char*
Block_pool_ATTLC::expand()
{
Block_header_ATTLC* b = (Block_header_ATTLC*) new char[size()+blockoff];
b->next = head;
head = b;
++cnt;
return ((char*) b) + blockoff;
}
// largest multiple of q that is <= p
static size_t
floor(size_t p, size_t q)
{
return p - p % (q + (q==0));
}
// smallest multiple of q that is >= p
static size_t
ceil(size_t p, size_t q)
{
return floor (p + q - 1, q);
}
Pool::Pool(size_t n): Block_pool_ATTLC(ceil(minblocksz, roundup(n)))
{
elsize = roundup(n);
count = Block_pool_ATTLC::size()/elsize;
head = 0;
}
void
Pool::grow()
{
register char* p = expand();
register int n = count;
while (--n >= 0) {
register Pool_element_header* ph = (Pool_element_header*) p;
ph->next = head;
head = ph;
p += elsize;
}
}