#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <pthread.h>
#include "nest/bird.h"
#include "lib/resource.h"
struct pool {
resource r;
list inside;
+ pthread_mutex_t mutex;
const char *name;
};
pool *z = ralloc(p, &pool_class);
z->name = name;
init_list(&z->inside);
+ pthread_mutex_init(&z->mutex, NULL);
return z;
}
pool *p = (pool *) P;
resource *r, *rr;
+ pthread_mutex_lock(&p->mutex);
+
r = HEAD(p->inside);
while (rr = (resource *) r->n.next)
{
xfree(r);
r = rr;
}
+
+ pthread_mutex_unlock(&p->mutex);
}
static void
pool *p = (pool *) P;
resource *r;
+ pthread_mutex_lock(&p->mutex);
+
debug("%s\n", p->name);
indent += 3;
WALK_LIST(r, p->inside)
rdump(r);
indent -= 3;
+ pthread_mutex_unlock(&p->mutex);
}
static size_t
resource *r;
size_t sum = sizeof(pool) + ALLOC_OVERHEAD;
+ pthread_mutex_lock(&p->mutex);
WALK_LIST(r, p->inside)
sum += rmemsize(r);
+ pthread_mutex_unlock(&p->mutex);
return sum;
}
pool *p = (pool *) P;
resource *r, *q;
+ pthread_mutex_lock(&p->mutex);
WALK_LIST(r, p->inside)
if (r->class->lookup && (q = r->class->lookup(r, a)))
return q;
+ pthread_mutex_unlock(&p->mutex);
+
return NULL;
}
if (r)
{
- if (r->n.next)
+ if (r->parent)
+ {
+ pthread_mutex_lock(&r->parent->mutex);
rem_node(&r->n);
+ pthread_mutex_unlock(&r->parent->mutex);
+ }
+
+ pthread_mutex_lock(&p->mutex);
add_tail(&p->inside, &r->n);
+ pthread_mutex_unlock(&p->mutex);
}
}
if (!r)
return;
- if (r->n.next)
+ if (r->parent)
+ {
+ pthread_mutex_lock(&r->parent->mutex);
rem_node(&r->n);
+ pthread_mutex_unlock(&r->parent->mutex);
+ }
+
r->class->free(r);
r->class = NULL;
xfree(r);
bzero(r, c->size);
r->class = c;
+ r->parent = p;
+
if (p)
+ {
+ pthread_mutex_lock(&p->mutex);
add_tail(&p->inside, &r->n);
+ pthread_mutex_unlock(&p->mutex);
+ }
return r;
}
root_pool.r.class = &pool_class;
root_pool.name = "Root";
init_list(&root_pool.inside);
+ pthread_mutex_init(&root_pool.mutex, NULL);
}
/**
struct mblock *b = xmalloc(sizeof(struct mblock) + size);
b->r.class = &mb_class;
+ b->r.parent = p;
b->r.n = (node) {};
+ pthread_mutex_lock(&p->mutex);
add_tail(&p->inside, &b->r.n);
+ pthread_mutex_unlock(&p->mutex);
b->size = size;
return b->data;
}
{
struct mblock *b = SKIP_BACK(struct mblock, data, m);
+ pthread_mutex_lock(&b->r.parent->mutex);
b = xrealloc(b, sizeof(struct mblock) + size);
update_node(&b->r.n);
+ pthread_mutex_unlock(&b->r.parent->mutex);
b->size = size;
return b->data;
}