X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Frespool.c;h=a4978fdf51ad030ff323cd00aa2b3336acd9d951;hb=623185a65b8870abb82cd0dd8547a1aa4fc1f535;hp=6a1687f3d51a96106ca6efe4feed0c1cf5427252;hpb=91a793242b091bb158d9272f415dcb1b81740e33;p=libucw.git diff --git a/ucw/respool.c b/ucw/respool.c index 6a1687f3..a4978fdf 100644 --- a/ucw/respool.c +++ b/ucw/respool.c @@ -1,7 +1,7 @@ /* * The UCW Library -- Resource Pools * - * (c) 2008 Martin Mares + * (c) 2008--2011 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -27,12 +27,15 @@ rp_new(const char *name, struct mempool *mp) rp = xmalloc_zero(sizeof(*rp)); clist_init(&rp->resources); rp->name = name; + rp->default_res_flags = RES_FLAG_TEMP; return rp; } static void rp_free(struct respool *rp) { + if (rp->subpool_of) + res_detach(rp->subpool_of); if (!rp->mpool) xfree(rp); if (rp_current() == rp) @@ -64,11 +67,32 @@ rp_detach(struct respool *rp) } void -rp_dump(struct respool *rp) +rp_commit(struct respool *rp) { - printf("Resource pool %s at %p (%s):\n", (rp->name ? : "(noname)"), rp, (rp->mpool ? "mempool-based" : "freestanding")); + struct resource *r; + while (r = clist_head(&rp->resources)) + { + ASSERT(r->rpool == rp); + if (r->flags & RES_FLAG_TEMP) + res_free(r); + else + res_detach(r); + } + rp_free(rp); +} + +void +rp_dump(struct respool *rp, uns indent) +{ + printf("%*sResource pool %s at %p (%s)%s:\n", + indent, "", + (rp->name ? : "(noname)"), + rp, + (rp->mpool ? "mempool-based" : "freestanding"), + (rp->subpool_of ? " (subpool)" : "") + ); CLIST_FOR_EACH(struct resource *, r, rp->resources) - res_dump(r); + res_dump(r, indent+4); } struct resource * @@ -82,6 +106,7 @@ res_alloc(const struct res_class *rc) struct resource *r = (rp->mpool ? mp_alloc_fast(rp->mpool, size) : xmalloc(size)); r->rpool = rp; clist_add_tail(&rp->resources, &r->n); + r->flags = rp->default_res_flags; return r; } @@ -110,12 +135,13 @@ res_free(struct resource *r) } void -res_dump(struct resource *r) +res_dump(struct resource *r, uns indent) { - printf("\t%p %s", r, r->rclass->name); + printf("%*s%p %s %s", indent, "", r, ((r->flags & RES_FLAG_TEMP) ? "TEMP" : "PERM"), r->rclass->name); if (r->rclass->dump) - r->rclass->dump(r); - putchar('\n'); + r->rclass->dump(r, indent+4); + else + putchar('\n'); } #ifdef TEST @@ -128,7 +154,7 @@ int main(void) struct respool *rp = rp_new("test", NULL); rp_switch(rp); struct fastbuf *f = bfdopen_shared(1, 0); - rp_dump(rp); + rp_dump(rp, 0); bputsn(f, "Hello, all worlds!"); bclose(f); rp_delete(rp);