* Cleanup the array of endpoint pointers if it is allocated.
*/
if (d->endpoints) {
- ks_pool_free(d->pool, d->endpoints);
+ ks_pool_free(d->pool, &d->endpoints);
d->endpoints = NULL;
}
* Cleanup the array of endpoint polling data if it is allocated.
*/
if (d->endpoints_poll) {
- ks_pool_free(d->pool, d->endpoints_poll);
+ ks_pool_free(d->pool, &d->endpoints_poll);
d->endpoints_poll = NULL;
}
/**
* Free the dht instance from the pool, after this the dht instance memory is invalid.
*/
- ks_pool_free(d->pool, d);
+ ks_pool_free(d->pool, &d);
/**
* At this point dht instance is invalidated so NULL the pointer.
ks_pool_t *pool = (*table)->pool;
- ks_pool_free(pool, *table);
+ ks_pool_free(pool, &(*table));
return;
}
if (( ks_addr_set(&tnode->addr, ip, port, tnode->family) != KS_STATUS_SUCCESS) ||
( ks_rwl_create(&tnode->reflock, table->pool) != KS_STATUS_SUCCESS)) {
- ks_pool_free(table->pool, tnode);
+ ks_pool_free(table->pool, &tnode);
ks_rwl_read_unlock(internal->lock);
return KS_STATUS_FAIL;
}
if (ks_rwl_try_write_lock(node->reflock) == KS_STATUS_SUCCESS) { /* grab exclusive lock on node */
ks_rwl_destroy(&(node->reflock));
- ks_pool_free(table->pool, node);
+ ks_pool_free(table->pool, &node);
}
else {
ks_dhtrt_queue_node_fordelete(table, node);
while (tofree) {
ks_dhtrt_sortedxors_t *x = tofree->next;
- ks_pool_free(table->pool, tofree);
+ ks_pool_free(table->pool, &tofree);
tofree = x;
}
if (ks_rwl_try_write_lock(node->reflock) == KS_STATUS_SUCCESS) {
ks_rwl_destroy(&(node->reflock));
- ks_pool_free(table->pool, node);
+ ks_pool_free(table->pool, &node);
temp = deleted;
deleted = deleted->next;
- ks_pool_free(table->pool, temp);
+ ks_pool_free(table->pool, &temp);
--internal->deleted_count;
if (prev != NULL) {
prev->next = deleted;
dg = *datagram;
- ks_pool_free(dg->pool, dg);
+ ks_pool_free(dg->pool, &dg);
*datagram = NULL;
}
ep = *endpoint;
if (ep->sock != KS_SOCK_INVALID) ks_socket_close(&ep->sock);
- ks_pool_free(ep->pool, ep);
+ ks_pool_free(ep->pool, &ep);
*endpoint = NULL;
}
ben_free(m->data);
m->data = NULL;
}
- ks_pool_free(m->pool, *message);
+ ks_pool_free(m->pool, &(*message));
*message = NULL;
}
ks_hash_destroy(&s->pending);
}
if (s->callbacks) {
- ks_pool_free(s->pool, s->callbacks);
+ ks_pool_free(s->pool, &s->callbacks);
s->callbacks = NULL;
}
if (s->mutex) ks_mutex_destroy(&s->mutex);
- ks_pool_free(s->pool, s);
+ ks_pool_free(s->pool, &s);
*search = NULL;
}
p = *pending;
- ks_pool_free(p->pool, p);
+ ks_pool_free(p->pool, &p);
*pending = NULL;
}
ben_free(si->v);
si->v = NULL;
}
- ks_pool_free(si->pool, si);
+ ks_pool_free(si->pool, &si);
*item = NULL;
}
t = *transaction;
- ks_pool_free(t->pool, t);
+ ks_pool_free(t->pool, &t);
*transaction = NULL;
}
*
*/
-KS_DECLARE(ks_status_t) ks_pool_free(ks_pool_t *mp_p, void *addr);
+KS_DECLARE(ks_status_t) ks_pool_free_ex(ks_pool_t *mp_p, void **addrP);
/*
* void *ks_pool_resize
KS_DECLARE(ks_status_t) ks_pool_set_cleanup(ks_pool_t *mp_p, void *ptr, void *arg, int type, ks_pool_cleanup_fn_t fn);
-#define ks_pool_safe_free(_p, _a) ks_pool_free(_p, _a); (_a) = NULL
+#define ks_pool_free(_p, _x) ks_pool_free_ex(_p, (void **)_x)
/*<<<<<<<<<< This is end of the auto-generated output from fillproto. */
b->nodes = n->next;
b->count--;
changed = 1;
- ks_pool_free(h->pool, n);
+ ks_pool_free(h->pool, &n);
}
p = b->nodes;
p->next = n->next;
b->count--;
changed = 1;
- ks_pool_free(h->pool, n);
+ ks_pool_free(h->pool, &n);
}
p = p->next;
}
} else {
h->searches = next;
}
- ks_pool_free(h->pool, sr);
+ ks_pool_free(h->pool, &sr);
h->numsearches--;
} else {
previous = sr;
free(st->peers);
if (previous) {
previous->next = st->next;
- ks_pool_free(h->pool, st);
+ ks_pool_free(h->pool, &st);
st = previous->next;
} else {
h->storage = st->next;
- ks_pool_free(h->pool, st);
+ ks_pool_free(h->pool, &st);
st = h->storage;
}
entry->body = NULL;
}
- ks_pool_free(pool, entry);
+ ks_pool_free(pool, &entry);
return;
}
ks_hash_destroy(&store->hash);
- ks_pool_free(pool, store);
+ ks_pool_free(pool, &store);
return;
}
ipt = (ks_ip_t *) val;
ks_socket_close(&ipt->sock);
- ks_pool_free(h->pool, ipt);
+ ks_pool_free(h->pool, &ipt);
if (ipt->addr.family == AF_INET) {
h->ip4s--;
if ((ipt->sock = socket(family, SOCK_DGRAM, IPPROTO_UDP)) == KS_SOCK_INVALID) {
ks_log(KS_LOG_ERROR, "Socket Error\n");
- ks_pool_free(h->pool, ipt);
+ ks_pool_free(h->pool, &ipt);
return NULL;
}
if (ks_addr_bind(ipt->sock, &ipt->addr) != KS_STATUS_SUCCESS) {
ks_log(KS_LOG_ERROR, "Error Adding bind ip: %s port: %d sock: %d (%s)\n", ip, port, ipt->sock, strerror(errno));
ks_socket_close(&ipt->sock);
- ks_pool_free(h->pool, ipt);
+ ks_pool_free(h->pool, &ipt);
return NULL;
}
return KS_STATUS_SUCCESS;
fail:
- ks_pool_free(h->pool, h->buckets);
+ ks_pool_free(h->pool, &h->buckets);
h->buckets = NULL;
- ks_pool_free(h->pool, h->buckets6);
+ ks_pool_free(h->pool, &h->buckets6);
h->buckets6 = NULL;
return KS_STATUS_FAIL;
}
while (b->nodes) {
struct node *n = b->nodes;
b->nodes = n->next;
- ks_pool_free(h->pool, n);
+ ks_pool_free(h->pool, &n);
}
- ks_pool_free(h->pool, b);
+ ks_pool_free(h->pool, &b);
}
while (h->buckets6) {
while (b->nodes) {
struct node *n = b->nodes;
b->nodes = n->next;
- ks_pool_free(h->pool, n);
+ ks_pool_free(h->pool, &n);
}
- ks_pool_free(h->pool, b);
+ ks_pool_free(h->pool, &b);
}
while (h->storage) {
struct storage *st = h->storage;
h->storage = h->storage->next;
- ks_pool_free(h->pool, st->peers);
- ks_pool_free(h->pool, st);
+ ks_pool_free(h->pool, &st->peers);
+ ks_pool_free(h->pool, &st);
}
while (h->searches) {
struct search *sr = h->searches;
h->searches = h->searches->next;
- ks_pool_free(h->pool, sr);
+ ks_pool_free(h->pool, &sr);
}
ks_dht_store_destroy(&h->store);
pool = h->pool;
h->pool = NULL;
- ks_pool_free(pool, h);
+ ks_pool_free(pool, &h);
ks_pool_close(&pool);
return 1;
newtable[index] = e;
}
}
- ks_pool_safe_free(h->pool, h->table);
+ ks_pool_free(h->pool, &h->table);
h->table = newtable;
}
/* Plan B: realloc instead */
h->entrycount--;
v = e->v;
if (e->flags & KS_HASH_FLAG_FREE_KEY) {
- ks_pool_free(h->pool, e->k);
+ ks_pool_free(h->pool, &e->k);
}
if (e->flags & KS_HASH_FLAG_FREE_VALUE) {
- ks_pool_safe_free(h->pool, e->v);
+ ks_pool_free(h->pool, &e->v);
v = NULL;
} else if (e->destructor) {
e->destructor(e->v);
h->destructor(e->v);
v = e->v = NULL;
}
- ks_pool_safe_free(h->pool, e);
+ ks_pool_free(h->pool, &e);
return v;
}
pE = &(e->next);
f = e; e = e->next;
if (f->flags & KS_HASH_FLAG_FREE_KEY) {
- ks_pool_free((*h)->pool, f->k);
+ ks_pool_free((*h)->pool, &f->k);
}
if (f->flags & KS_HASH_FLAG_FREE_VALUE) {
- ks_pool_safe_free((*h)->pool, f->v);
+ ks_pool_free((*h)->pool, &f->v);
} else if (f->destructor) {
f->destructor(f->v);
f->v = NULL;
(*h)->destructor(f->v);
f->v = NULL;
}
- ks_pool_safe_free((*h)->pool, f);
+ ks_pool_free((*h)->pool, &f);
}
}
pool = (*h)->pool;
- ks_pool_safe_free(pool, (*h)->table);
+ ks_pool_free(pool, &(*h)->table);
ks_hash_write_unlock(*h);
- if ((*h)->rwl) ks_pool_free(pool, (*h)->rwl);
+ if ((*h)->rwl) ks_pool_free(pool, &(*h)->rwl);
if ((*h)->mutex) {
- ks_pool_free(pool, (*h)->mutex);
+ ks_pool_free(pool, &(*h)->mutex);
}
- ks_pool_free(pool, *h);
+ ks_pool_free(pool, &(*h));
pool = NULL;
*h = NULL;
ks_rwl_read_unlock(i->h->rwl);
}
- ks_pool_free(i->h->pool, i);
+ ks_pool_free(i->h->pool, &i);
*iP = NULL;
}
#endif
free(mutex);
} else {
- ks_pool_free(mutex->pool, (void *)mutex);
+ ks_pool_free(mutex->pool, &mutex);
}
return KS_STATUS_SUCCESS;
*cond = NULL;
- return ks_pool_free(condp->pool, condp);
+ return ks_pool_free(condp->pool, &condp);
}
*rwlock = NULL;
- return ks_pool_free(rwlockp->pool, rwlockp);
+ return ks_pool_free(rwlockp->pool, &rwlockp);
}
* mp_p <-> Pointer to the memory pool.
*
*
- * addr <-> Address to free.
+ * addr <-> pointer to pointer of Address to free.
*
*/
-KS_DECLARE(ks_status_t) ks_pool_free(ks_pool_t *mp_p, void *addr)
+KS_DECLARE(ks_status_t) ks_pool_free_ex(ks_pool_t *mp_p, void **addrP)
{
ks_status_t r;
+ void *addr;
+
+ ks_assert(addrP);
+ addr = *addrP;
+
ks_assert(mp_p);
ks_assert(addr);
ks_mutex_unlock(mp_p->mutex);
+ if (r == KS_STATUS_SUCCESS) {
+ *addrP = NULL;
+ }
+
return r;
}
while(np) {
fp = np;
np = np->next;
- ks_pool_free(q->pool, fp);
+ ks_pool_free(q->pool, &fp);
}
np = q->empty;
while(np) {
fp = np;
np = np->next;
- ks_pool_free(q->pool, fp);
+ ks_pool_free(q->pool, &fp);
}
break;
case KS_MPCL_DESTROY:
ks_q_term(q);
pool = q->pool;
- ks_pool_free(pool, q);
+ ks_pool_free(pool, &q);
pool = NULL;
return KS_STATUS_SUCCESS;
if (thread) {
thread->running = 0;
if (pool) {
- ks_pool_safe_free(pool, thread);
+ ks_pool_free(pool, &thread);
}
}
done:
idle_sec = 0;
job->func(thread, job->data);
- ks_pool_free(tp->pool, job);
+ ks_pool_free(tp->pool, &job);
ks_mutex_lock(tp->mutex);
tp->busy_thread_count--;
kws->down = 2;
if (kws->write_buffer) {
- ks_pool_free(kws->pool, kws->write_buffer);
+ ks_pool_free(kws->pool, &kws->write_buffer);
kws->write_buffer = NULL;
kws->write_buffer_len = 0;
}
kws->ssl = NULL;
}
- if (kws->buffer) ks_pool_free(kws->pool, kws->buffer);
- if (kws->bbuffer) ks_pool_free(kws->pool, kws->bbuffer);
+ if (kws->buffer) ks_pool_free(kws->pool, &kws->buffer);
+ if (kws->bbuffer) ks_pool_free(kws->pool, &kws->bbuffer);
kws->buffer = kws->bbuffer = NULL;
- ks_pool_free(kws->pool, kws);
+ ks_pool_free(kws->pool, &kws);
kws = NULL;
}
kws->down = 1;
if (kws->uri) {
- ks_pool_free(kws->pool, kws->uri);
+ ks_pool_free(kws->pool, &kws->uri);
kws->uri = NULL;
}
printf("FREE:\n");
- status = ks_pool_safe_free(pool, str);
+ status = ks_pool_free(pool, &str);
if (status != KS_STATUS_SUCCESS) {
fprintf(stderr, "FREE ERR: [%s]\n", ks_pool_strerror(err));
exit(255);
printf("FREE OBJ:\n");
- status = ks_pool_safe_free(pool, foo);
+ status = ks_pool_free(pool, &foo);
ok(status == KS_STATUS_SUCCESS);
if (status != KS_STATUS_SUCCESS) {
fprintf(stderr, "FREE OBJ ERR: [%s]\n", ks_pool_strerror(status));
printf("FREE 2:\n");
- status = ks_pool_free(pool, str);
+ status = ks_pool_free(pool, &str);
ok(status == KS_STATUS_SUCCESS);
if (status != KS_STATUS_SUCCESS) {
fprintf(stderr, "FREE2 ERR: [%s]\n", ks_pool_strerror(status));
while(ks_q_pop(q, &pop) == KS_STATUS_SUCCESS) {
//int *i = (int *)pop;
//printf("POP %d\n", *i);
- ks_pool_free(thread->pool, pop);
+ ks_pool_free(thread->pool, &pop);
}
return NULL;
static void do_flush(ks_q_t *q, void *ptr, void *flush_data)
{
ks_pool_t *pool = (ks_pool_t *)flush_data;
- ks_pool_free(pool, ptr);
+ ks_pool_free(pool, &ptr);
}
//int *i = (int *)pop;
//printf("%p POP %d\n", (void *)pthread_self(), *i);
popped++;
- ks_pool_free(thread->pool, pop);
+ ks_pool_free(thread->pool, &pop);
} else if (status == KS_STATUS_INACTIVE) {
break;
} else if (t2->try && ks_q_size(t2->q)) {
for (i = 0; i < LOOP_COUNT; i++) {
if (last_mem) {
- ks_pool_safe_free(thread->pool, last_mem);
+ ks_pool_free(thread->pool, &last_mem);
}
mem = ks_pool_alloc(thread->pool, 1024);
last_mem = mem;
ok( ks_thread_priority(thread_p) == KS_PRI_IMPORTANT );
end_todo;
- ks_pool_free(pool, thread_p);
+ ks_pool_free(pool, &thread_p);
}
static void join_threads(void)