| version 1.22, 1999/04/04 17:17:31 |
version 1.23, 1999/04/06 23:32:44 |
| Line 73 static struct pool phpool; |
|
| Line 73 static struct pool phpool; |
|
| int pool_inactive_time = 10; |
int pool_inactive_time = 10; |
| |
|
| /* Next candidate for drainage (see pool_drain()) */ |
/* Next candidate for drainage (see pool_drain()) */ |
| static struct pool *drainpp = NULL; |
static struct pool *drainpp; |
| |
|
| |
/* This spin lock protects both pool_head and drainpp. */ |
| |
struct simplelock pool_head_slock = SIMPLELOCK_INITIALIZER; |
| |
|
| struct pool_item_header { |
struct pool_item_header { |
| /* Page headers */ |
/* Page headers */ |
| Line 363 pool_init(pp, size, align, ioff, flags, |
|
| Line 366 pool_init(pp, size, align, ioff, flags, |
|
| /* |
/* |
| * Initialize the pool structure. |
* Initialize the pool structure. |
| */ |
*/ |
| TAILQ_INSERT_TAIL(&pool_head, pp, pr_poollist); |
|
| TAILQ_INIT(&pp->pr_pagelist); |
TAILQ_INIT(&pp->pr_pagelist); |
| pp->pr_curpage = NULL; |
pp->pr_curpage = NULL; |
| pp->pr_npages = 0; |
pp->pr_npages = 0; |
| Line 451 pool_init(pp, size, align, ioff, flags, |
|
| Line 453 pool_init(pp, size, align, ioff, flags, |
|
| |
|
| /* |
/* |
| * Initialize private page header pool if we haven't done so yet. |
* Initialize private page header pool if we haven't done so yet. |
| |
* XXX LOCKING. |
| */ |
*/ |
| if (phpool.pr_size == 0) { |
if (phpool.pr_size == 0) { |
| pool_init(&phpool, sizeof(struct pool_item_header), 0, 0, |
pool_init(&phpool, sizeof(struct pool_item_header), 0, 0, |
| 0, "phpool", 0, 0, 0, 0); |
0, "phpool", 0, 0, 0, 0); |
| } |
} |
| |
|
| return; |
/* Insert into the list of all pools. */ |
| |
simple_lock(&pool_head_slock); |
| |
TAILQ_INSERT_TAIL(&pool_head, pp, pr_poollist); |
| |
simple_unlock(&pool_head_slock); |
| } |
} |
| |
|
| /* |
/* |
| Line 483 pool_destroy(pp) |
|
| Line 489 pool_destroy(pp) |
|
| pr_rmpage(pp, ph); |
pr_rmpage(pp, ph); |
| |
|
| /* Remove from global pool list */ |
/* Remove from global pool list */ |
| |
simple_lock(&pool_head_slock); |
| TAILQ_REMOVE(&pool_head, pp, pr_poollist); |
TAILQ_REMOVE(&pool_head, pp, pr_poollist); |
| |
/* XXX Only clear this if we were drainpp? */ |
| drainpp = NULL; |
drainpp = NULL; |
| |
simple_unlock(&pool_head_slock); |
| |
|
| #ifdef POOL_DIAGNOSTIC |
#ifdef POOL_DIAGNOSTIC |
| if ((pp->pr_roflags & PR_LOGGING) != 0) |
if ((pp->pr_roflags & PR_LOGGING) != 0) |
| Line 1215 pool_drain(arg) |
|
| Line 1224 pool_drain(arg) |
|
| void *arg; |
void *arg; |
| { |
{ |
| struct pool *pp; |
struct pool *pp; |
| int s = splimp(); |
int s; |
| |
|
| /* XXX:lock pool head */ |
s = splimp(); |
| if (drainpp == NULL && (drainpp = TAILQ_FIRST(&pool_head)) == NULL) { |
simple_lock(&pool_head_slock); |
| splx(s); |
|
| return; |
if (drainpp == NULL && (drainpp = TAILQ_FIRST(&pool_head)) == NULL) |
| } |
goto out; |
| |
|
| pp = drainpp; |
pp = drainpp; |
| drainpp = TAILQ_NEXT(pp, pr_poollist); |
drainpp = TAILQ_NEXT(pp, pr_poollist); |
| /* XXX:unlock pool head */ |
|
| |
|
| pool_reclaim(pp); |
pool_reclaim(pp); |
| |
|
| |
out: |
| |
simple_unlock(&pool_head_slock); |
| splx(s); |
splx(s); |
| } |
} |
| |
|