[内部実装]
#include "kclib1.h"
KAutoreleasePool *KAutoreleasePool_top;
static KPtrPool *nodePool;
KAutoreleasePool *KAutoreleasePool_open()
{
KAutoreleasePool *w;
if (KMalloc_work->p == 0)
KMalloc_init();
if (nodePool == 0)
nodePool = KMalloc_work->p + KMalloc_index(sizeof (KAutoreleaseNode));
w = KMalloc_alloc(sizeof (KAutoreleasePool));
w->prv = KAutoreleasePool_top;
KAutoreleasePool_top = w;
w->n = 0;
return w;
}
void KAutoreleasePool_add(KAutoreleasePool *w, int s, void *p)
{
KAutoreleaseNode *n;
if (w == 0) w = KAutoreleasePool_top;
n = KPtrPool_alloc(nodePool);
n->n = w->n;
n->p = p;
n->s = s;
w->n = n;
}
int KAutoreleasePool_remove(KAutoreleasePool *w, void *p)
{
KAutoreleaseNode *n, *m = 0;
if (w == 0) w = KAutoreleasePool_top;
n = w->n;
while (n != 0) {
if (n->p == p) {
int s = n->s;
if (m != 0)
m->n = n->n;
else
w->n = n->n;
KPtrPool_free(nodePool, n);
return s;
}
m = n;
n = n->n;
}
kerrorExit("KAutoreleasePool_remove: not found: p=%08x", p);
return -1; // dummy.
}
void KAutoreleasePool_close(KAutoreleasePool *w)
{
KAutoreleaseNode *n, *nn;
if (w != KAutoreleasePool_top)
kerrorExit("KAutoreleasePool_close: nesting error");
for (n = w->n; n != 0; ) {
nn = n->n;
KMalloc_free(n->s, n->p);
KPtrPool_free(nodePool, n);
n = nn;
}
KAutoreleasePool_top = w->prv;
KMalloc_free(sizeof (KAutoreleasePool), w);
}