| version 1.47, 2000/12/10 17:03:34 |
version 1.48, 2000/12/11 05:22:56 |
| Line 1455 pool_print1(struct pool *pp, const char |
|
| Line 1455 pool_print1(struct pool *pp, const char |
|
| pc = TAILQ_NEXT(pc, pc_poollist)) { |
pc = TAILQ_NEXT(pc, pc_poollist)) { |
| (*pr)("\tcache %p: allocfrom %p freeto %p\n", pc, |
(*pr)("\tcache %p: allocfrom %p freeto %p\n", pc, |
| pc->pc_allocfrom, pc->pc_freeto); |
pc->pc_allocfrom, pc->pc_freeto); |
| |
(*pr)("\t hits %lu misses %lu ngroups %lu nitems %lu\n", |
| |
pc->pc_hits, pc->pc_misses, pc->pc_ngroups, pc->pc_nitems); |
| for (pcg = TAILQ_FIRST(&pc->pc_grouplist); pcg != NULL; |
for (pcg = TAILQ_FIRST(&pc->pc_grouplist); pcg != NULL; |
| pcg = TAILQ_NEXT(pcg, pcg_list)) { |
pcg = TAILQ_NEXT(pcg, pcg_list)) { |
| (*pr)("\t\tgroup %p: avail %d\n", pcg, pcg->pcg_avail); |
(*pr)("\t\tgroup %p: avail %d\n", pcg, pcg->pcg_avail); |
| Line 1557 pool_cache_init(struct pool_cache *pc, s |
|
| Line 1559 pool_cache_init(struct pool_cache *pc, s |
|
| pc->pc_dtor = dtor; |
pc->pc_dtor = dtor; |
| pc->pc_arg = arg; |
pc->pc_arg = arg; |
| |
|
| |
pc->pc_hits = 0; |
| |
pc->pc_misses = 0; |
| |
|
| |
pc->pc_ngroups = 0; |
| |
|
| |
pc->pc_nitems = 0; |
| |
|
| simple_lock(&pp->pr_slock); |
simple_lock(&pp->pr_slock); |
| TAILQ_INSERT_TAIL(&pp->pr_cachelist, pc, pc_poollist); |
TAILQ_INSERT_TAIL(&pp->pr_cachelist, pc, pc_poollist); |
| simple_unlock(&pp->pr_slock); |
simple_unlock(&pp->pr_slock); |
| Line 1638 pool_cache_get(struct pool_cache *pc, in |
|
| Line 1647 pool_cache_get(struct pool_cache *pc, in |
|
| * the caller. We will allocate a group, if necessary, |
* the caller. We will allocate a group, if necessary, |
| * when the object is freed back to the cache. |
* when the object is freed back to the cache. |
| */ |
*/ |
| |
pc->pc_misses++; |
| simple_unlock(&pc->pc_slock); |
simple_unlock(&pc->pc_slock); |
| object = pool_get(pc->pc_pool, flags); |
object = pool_get(pc->pc_pool, flags); |
| if (object != NULL && pc->pc_ctor != NULL) { |
if (object != NULL && pc->pc_ctor != NULL) { |
| Line 1650 pool_cache_get(struct pool_cache *pc, in |
|
| Line 1660 pool_cache_get(struct pool_cache *pc, in |
|
| } |
} |
| |
|
| have_group: |
have_group: |
| |
pc->pc_hits++; |
| |
pc->pc_nitems--; |
| object = pcg_get(pcg); |
object = pcg_get(pcg); |
| |
|
| if (pcg->pcg_avail == 0) |
if (pcg->pcg_avail == 0) |
| Line 1690 pool_cache_put(struct pool_cache *pc, vo |
|
| Line 1702 pool_cache_put(struct pool_cache *pc, vo |
|
| if (pcg != NULL) { |
if (pcg != NULL) { |
| memset(pcg, 0, sizeof(*pcg)); |
memset(pcg, 0, sizeof(*pcg)); |
| simple_lock(&pc->pc_slock); |
simple_lock(&pc->pc_slock); |
| |
pc->pc_ngroups++; |
| TAILQ_INSERT_TAIL(&pc->pc_grouplist, pcg, pcg_list); |
TAILQ_INSERT_TAIL(&pc->pc_grouplist, pcg, pcg_list); |
| if (pc->pc_freeto == NULL) |
if (pc->pc_freeto == NULL) |
| pc->pc_freeto = pcg; |
pc->pc_freeto = pcg; |
| Line 1707 pool_cache_put(struct pool_cache *pc, vo |
|
| Line 1720 pool_cache_put(struct pool_cache *pc, vo |
|
| } |
} |
| |
|
| have_group: |
have_group: |
| |
pc->pc_nitems++; |
| pcg_put(pcg, object); |
pcg_put(pcg, object); |
| |
|
| if (pcg->pcg_avail == PCG_NOBJECTS) |
if (pcg->pcg_avail == PCG_NOBJECTS) |
| Line 1732 pool_cache_do_invalidate(struct pool_cac |
|
| Line 1746 pool_cache_do_invalidate(struct pool_cac |
|
| pcg = npcg) { |
pcg = npcg) { |
| npcg = TAILQ_NEXT(pcg, pcg_list); |
npcg = TAILQ_NEXT(pcg, pcg_list); |
| while (pcg->pcg_avail != 0) { |
while (pcg->pcg_avail != 0) { |
| |
pc->pc_nitems--; |
| object = pcg_get(pcg); |
object = pcg_get(pcg); |
| if (pcg->pcg_avail == 0 && pc->pc_allocfrom == pcg) |
if (pcg->pcg_avail == 0 && pc->pc_allocfrom == pcg) |
| pc->pc_allocfrom = NULL; |
pc->pc_allocfrom = NULL; |
| Line 1740 pool_cache_do_invalidate(struct pool_cac |
|
| Line 1755 pool_cache_do_invalidate(struct pool_cac |
|
| (*putit)(pc->pc_pool, object, __FILE__, __LINE__); |
(*putit)(pc->pc_pool, object, __FILE__, __LINE__); |
| } |
} |
| if (free_groups) { |
if (free_groups) { |
| |
pc->pc_ngroups--; |
| TAILQ_REMOVE(&pc->pc_grouplist, pcg, pcg_list); |
TAILQ_REMOVE(&pc->pc_grouplist, pcg, pcg_list); |
| if (pc->pc_freeto == pcg) |
if (pc->pc_freeto == pcg) |
| pc->pc_freeto = NULL; |
pc->pc_freeto = NULL; |