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)
+ rp_switch(NULL);
+}
+
void
rp_delete(struct respool *rp)
{
ASSERT(r->rpool == rp);
res_free(r);
}
- if (!rp->mpool)
- xfree(rp);
- if (rp_current() == rp)
- rp_switch(NULL);
+ rp_free(rp);
+}
+
+void
+rp_detach(struct respool *rp)
+{
+ struct resource *r;
+ while (r = clist_head(&rp->resources))
+ {
+ ASSERT(r->rpool == rp);
+ res_detach(r);
+ }
+ rp_free(rp);
}
void
-rp_dump(struct respool *rp)
+rp_dump(struct respool *rp, uns indent)
{
- printf("Resource pool %s at %p (%s):\n", (rp->name ? : "(noname)"), rp, (rp->mpool ? "mempool-based" : "freestanding"));
+ 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 *
}
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", indent, "", r, r->rclass->name);
if (r->rclass->dump)
- r->rclass->dump(r);
- putchar('\n');
+ r->rclass->dump(r, indent+4);
+ else
+ putchar('\n');
}
#ifdef TEST
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);