| version 1.1, 1997/12/15 11:14:57 |
version 1.2, 1998/02/19 23:52:14 |
| Line 55 struct pool_item { |
|
| Line 55 struct pool_item { |
|
| |
|
| |
|
| struct pool * |
struct pool * |
| pool_create(size, nitems, wchan, mtype) |
pool_create(size, nitems, wchan, mtype, storage) |
| size_t size; |
size_t size; |
| int nitems; |
int nitems; |
| char *wchan; |
char *wchan; |
| int mtype; |
int mtype; |
| |
caddr_t storage; |
| { |
{ |
| struct pool *pp; |
struct pool *pp; |
| |
caddr_t cp; |
| |
|
| if (size < sizeof(struct pool_item)) { |
if (size < sizeof(struct pool_item)) { |
| printf("pool_create: size %lu too small\n", (u_long)size); |
printf("pool_create: size %lu too small\n", (u_long)size); |
| return (NULL); |
return (NULL); |
| } |
} |
| |
|
| pp = (struct pool *)malloc(sizeof(*pp), mtype, M_NOWAIT); |
if (storage) { |
| if (pp == NULL) |
pp = (struct pool *)storage; |
| return (NULL); |
cp = (caddr_t)ALIGN(pp + 1); |
| |
} else { |
| |
pp = (struct pool *)malloc(sizeof(*pp), mtype, M_NOWAIT); |
| |
if (pp == NULL) |
| |
return (NULL); |
| |
cp = NULL; |
| |
} |
| |
|
| pp->pr_freelist = NULL; |
pp->pr_freelist = NULL; |
| pp->pr_freecount = 0; |
pp->pr_freecount = 0; |
| pp->pr_hiwat = 0; |
pp->pr_hiwat = 0; |
| pp->pr_flags = 0; |
pp->pr_flags = (storage ? PR_STATIC : 0); |
| pp->pr_size = size; |
pp->pr_size = size; |
| pp->pr_wchan = wchan; |
pp->pr_wchan = wchan; |
| pp->pr_mtype = mtype; |
pp->pr_mtype = mtype; |
| simple_lock_init(&pp->pr_lock); |
simple_lock_init(&pp->pr_lock); |
| |
|
| if (nitems != 0) { |
if (nitems != 0) { |
| if (pool_prime(pp, nitems) != 0) |
if (pool_prime(pp, nitems, cp) != 0) { |
| pool_destroy(pp); |
pool_destroy(pp); |
| return (NULL); |
return (NULL); |
| |
} |
| } |
} |
| |
|
| return (pp); |
return (pp); |
|
| Line 108 pool_destroy(pp) |
|
| { |
{ |
| struct pool_item *pi; |
struct pool_item *pi; |
| |
|
| |
if (pp->pr_flags & PR_STATIC) |
| |
return; |
| |
|
| while ((pi = pp->pr_freelist) != NULL) { |
while ((pi = pp->pr_freelist) != NULL) { |
| pp->pr_freelist = pi->pi_next; |
pp->pr_freelist = pi->pi_next; |
| free(pi, pp->pr_mtype); |
free(pi, pp->pr_mtype); |
| Line 118 pool_get(pp, flags) |
|
| Line 130 pool_get(pp, flags) |
|
| void *v; |
void *v; |
| struct pool_item *pi; |
struct pool_item *pi; |
| |
|
| |
#ifdef DIAGNOSTIC |
| |
if ((pp->pr_flags & PR_STATIC) && (flags & PR_MALLOCOK)) |
| |
panic("pool_get: static"); |
| |
#endif |
| |
|
| again: |
again: |
| simple_lock(&pp->pr_lock); |
simple_lock(&pp->pr_lock); |
| if ((v = pp->pr_freelist) == NULL) { |
if ((v = pp->pr_freelist) == NULL) { |
|
|
| wakeup((caddr_t)pp); |
wakeup((caddr_t)pp); |
| } |
} |
| } else { |
} else { |
| |
#ifdef DIAGNOSTIC |
| |
if (pp->pr_flags & PR_STATIC) { |
| |
/* can't happen because hiwat > freecount */ |
| |
panic("pool_put: static"); |
| |
} |
| |
#endif |
| /* Return to system */ |
/* Return to system */ |
| free(v, M_DEVBUF); |
free(v, M_DEVBUF); |
| |
|
|
|
| * Add N items to the pool |
* Add N items to the pool |
| */ |
*/ |
| int |
int |
| pool_prime(pp, n) |
pool_prime(pp, n, storage) |
| struct pool *pp; |
struct pool *pp; |
| int n; |
int n; |
| |
caddr_t storage; |
| { |
{ |
| struct pool_item *pi; |
struct pool_item *pi; |
| |
caddr_t cp = storage; |
| |
|
| |
#ifdef DIAGNOSTIC |
| |
if (storage && !(pp->pr_flags & PR_STATIC)) |
| |
panic("pool_prime: static"); |
| |
/* !storage && static caught below */ |
| |
#endif |
| |
|
| simple_lock(&pp->pr_lock); |
simple_lock(&pp->pr_lock); |
| pp->pr_hiwat += n; |
pp->pr_hiwat += n; |
| while (n--) { |
while (n--) { |
| pi = malloc(pp->pr_size, pp->pr_mtype, M_NOWAIT); |
if (pp->pr_flags & PR_STATIC) { |
| |
pi = (struct pool_item *)cp; |
| |
cp = (caddr_t)ALIGN(cp + pp->pr_size); |
| |
} else |
| |
pi = malloc(pp->pr_size, pp->pr_mtype, M_NOWAIT); |
| |
|
| if (pi == NULL) { |
if (pi == NULL) { |
| simple_unlock(&pp->pr_lock); |
simple_unlock(&pp->pr_lock); |
| return (ENOMEM); |
return (ENOMEM); |