*/
KS_DECLARE(ks_status_t) ks_dht_endpoint_alloc(ks_dht_endpoint_t **endpoint, ks_pool_t *pool);
KS_DECLARE(ks_status_t) ks_dht_endpoint_prealloc(ks_dht_endpoint_t *endpoint, ks_pool_t *pool);
-KS_DECLARE(ks_status_t) ks_dht_endpoint_free(ks_dht_endpoint_t *endpoint);
+KS_DECLARE(ks_status_t) ks_dht_endpoint_free(ks_dht_endpoint_t **endpoint);
KS_DECLARE(ks_status_t) ks_dht_endpoint_init(ks_dht_endpoint_t *endpoint,
const ks_dht_nodeid_t *nodeid,
*/
KS_DECLARE(ks_status_t) ks_dht_storageitem_alloc(ks_dht_storageitem_t **item, ks_pool_t *pool);
KS_DECLARE(ks_status_t) ks_dht_storageitem_prealloc(ks_dht_storageitem_t *item, ks_pool_t *pool);
-KS_DECLARE(ks_status_t) ks_dht_storageitem_free(ks_dht_storageitem_t *item);
+KS_DECLARE(ks_status_t) ks_dht_storageitem_free(ks_dht_storageitem_t **item);
KS_DECLARE(ks_status_t) ks_dht_storageitem_init(ks_dht_storageitem_t *item, struct bencode *v);
KS_DECLARE(ks_status_t) ks_dht_storageitem_deinit(ks_dht_storageitem_t *item);
d->pool = pool;
d->pool_alloc = pool_alloc;
- d->autoroute = KS_FALSE;
- d->autoroute_port = 0;
- d->registry_type = NULL;
- d->registry_query = NULL;
- d->registry_error = NULL;
- d->bind_ipv4 = KS_FALSE;
- d->bind_ipv6 = KS_FALSE;
- d->endpoints = NULL;
- d->endpoints_size = 0;
- d->endpoints_hash = NULL;
- d->endpoints_poll = NULL;
- d->send_q = NULL;
- d->send_q_unsent = NULL;
- d->recv_buffer_length = 0;
- d->transactionid_next = 0;
- d->transactions_hash = NULL;
- d->rt_ipv4 = NULL;
- d->rt_ipv6 = NULL;
- d->token_secret_current = 0;
- d->token_secret_previous = 0;
- d->token_secret_expiration = 0;
- d->storage_hash = NULL;
-
return KS_STATUS_SUCCESS;
}
ks_assert(dht);
ks_assert(pool);
+ memset(dht, 0, sizeof(ks_dht_t));
+
dht->pool = pool;
dht->pool_alloc = KS_FALSE;
- dht->autoroute = KS_FALSE;
- dht->autoroute_port = 0;
- dht->registry_type = NULL;
- dht->registry_query = NULL;
- dht->registry_error = NULL;
- dht->bind_ipv4 = KS_FALSE;
- dht->bind_ipv6 = KS_FALSE;
- dht->endpoints = NULL;
- dht->endpoints_size = 0;
- dht->endpoints_hash = NULL;
- dht->endpoints_poll = NULL;
- dht->send_q = NULL;
- dht->send_q_unsent = NULL;
- dht->recv_buffer_length = 0;
- dht->transactionid_next = 0;
- dht->transactions_hash = NULL;
- dht->rt_ipv4 = NULL;
- dht->rt_ipv6 = NULL;
- dht->token_secret_current = 0;
- dht->token_secret_previous = 0;
- dht->token_secret_expiration = 0;
- dht->storage_hash = NULL;
-
return KS_STATUS_SUCCESS;
}
/**
*
*/
-KS_DECLARE(ks_status_t) ks_dht_free(ks_dht_t *dht)
+KS_DECLARE(ks_status_t) ks_dht_free(ks_dht_t **dht)
{
- ks_pool_t *pool = dht->pool;
- ks_bool_t pool_alloc = dht->pool_alloc;
+ ks_pool_t *pool;
+ ks_bool_t pool_alloc;
+
+ ks_assert(dht);
+ ks_assert(*dht);
+
+ pool = (*dht)->pool;
+ pool_alloc = (*dht)->pool_alloc;
- ks_dht_deinit(dht);
- ks_pool_free(pool, dht);
+ ks_dht_deinit(*dht);
+ ks_pool_free(pool, *dht);
if (pool_alloc) {
ks_pool_close(&pool);
}
+ *dht = NULL;
+
return KS_STATUS_SUCCESS;
}
ks_dht_message_t *msg;
while (ks_q_pop_timeout(dht->send_q, (void **)&msg, 1) == KS_STATUS_SUCCESS && msg) {
ks_dht_message_deinit(msg);
- ks_dht_message_free(msg);
+ ks_dht_message_free(&msg);
}
ks_q_destroy(&dht->send_q);
dht->send_q = NULL;
}
if (dht->send_q_unsent) {
ks_dht_message_deinit(dht->send_q_unsent);
- ks_dht_message_free(dht->send_q_unsent);
- dht->send_q_unsent = NULL;
+ ks_dht_message_free(&dht->send_q_unsent);
}
for (int32_t i = 0; i < dht->endpoints_size; ++i) {
ks_dht_endpoint_t *ep = dht->endpoints[i];
ks_dht_endpoint_deinit(ep);
- ks_dht_endpoint_free(ep);
+ ks_dht_endpoint_free(&ep);
}
dht->endpoints_size = 0;
if (dht->endpoints) {
}
if (ks_dht_endpoint_init(ep, nodeid, addr, sock) != KS_STATUS_SUCCESS) {
- ks_dht_endpoint_free(ep);
+ ks_dht_endpoint_free(&ep);
ks_socket_close(&sock);
return KS_STATUS_FAIL;
}
dht->send_q_unsent = message;
} else if (ret == KS_STATUS_SUCCESS) {
ks_dht_message_deinit(message);
- ks_dht_message_free(message);
+ ks_dht_message_free(&message);
}
}
}
done:
if (ret != KS_STATUS_SUCCESS && error) {
ks_dht_message_deinit(error);
- ks_dht_message_free(error);
+ ks_dht_message_free(&error);
}
return ret;
}
if (ret != KS_STATUS_SUCCESS) {
if (trans) {
ks_dht_transaction_deinit(trans);
- ks_dht_transaction_free(trans);
+ ks_dht_transaction_free(&trans);
}
if (msg) {
ks_dht_message_deinit(msg);
- ks_dht_message_free(msg);
+ ks_dht_message_free(&msg);
}
*message = NULL;
}
done:
if (ret != KS_STATUS_SUCCESS && msg) {
ks_dht_message_deinit(msg);
- ks_dht_message_free(msg);
+ ks_dht_message_free(&msg);
*message = NULL;
}
return ret;
*/
KS_DECLARE(ks_status_t) ks_dht_alloc(ks_dht_t **dht, ks_pool_t *pool);
KS_DECLARE(ks_status_t) ks_dht_prealloc(ks_dht_t *dht, ks_pool_t *pool);
-KS_DECLARE(ks_status_t) ks_dht_free(ks_dht_t *dht);
+KS_DECLARE(ks_status_t) ks_dht_free(ks_dht_t **dht);
KS_DECLARE(ks_status_t) ks_dht_init(ks_dht_t *dht);
*/
KS_DECLARE(ks_status_t) ks_dht_message_alloc(ks_dht_message_t **message, ks_pool_t *pool);
KS_DECLARE(ks_status_t) ks_dht_message_prealloc(ks_dht_message_t *message, ks_pool_t *pool);
-KS_DECLARE(ks_status_t) ks_dht_message_free(ks_dht_message_t *message);
+KS_DECLARE(ks_status_t) ks_dht_message_free(ks_dht_message_t **message);
KS_DECLARE(ks_status_t) ks_dht_message_init(ks_dht_message_t *message, ks_dht_endpoint_t *ep, ks_sockaddr_t *raddr, ks_bool_t alloc_data);
KS_DECLARE(ks_status_t) ks_dht_message_deinit(ks_dht_message_t *message);
*/
KS_DECLARE(ks_status_t) ks_dht_transaction_alloc(ks_dht_transaction_t **transaction, ks_pool_t *pool);
KS_DECLARE(ks_status_t) ks_dht_transaction_prealloc(ks_dht_transaction_t *transaction, ks_pool_t *pool);
-KS_DECLARE(ks_status_t) ks_dht_transaction_free(ks_dht_transaction_t *transaction);
+KS_DECLARE(ks_status_t) ks_dht_transaction_free(ks_dht_transaction_t **transaction);
KS_DECLARE(ks_status_t) ks_dht_transaction_init(ks_dht_transaction_t *transaction,
ks_sockaddr_t *raddr,
ks_assert(endpoint);
ks_assert(pool);
+ memset(endpoint, 0, sizeof(ks_dht_endpoint_t));
+
endpoint->pool = pool;
endpoint->sock = KS_SOCK_INVALID;
/**
*
*/
-KS_DECLARE(ks_status_t) ks_dht_endpoint_free(ks_dht_endpoint_t *endpoint)
+KS_DECLARE(ks_status_t) ks_dht_endpoint_free(ks_dht_endpoint_t **endpoint)
{
ks_assert(endpoint);
+ ks_assert(*endpoint);
+
+ ks_dht_endpoint_deinit(*endpoint);
+ ks_pool_free((*endpoint)->pool, *endpoint);
- ks_dht_endpoint_deinit(endpoint);
- ks_pool_free(endpoint->pool, endpoint);
+ *endpoint = NULL;
return KS_STATUS_SUCCESS;
}
ks_assert(message);
ks_assert(pool);
-
+
*message = msg = ks_pool_alloc(pool, sizeof(ks_dht_message_t));
msg->pool = pool;
- msg->endpoint = NULL;
- msg->raddr = (const ks_sockaddr_t){ 0 };
- msg->args = NULL;
- msg->type[0] = '\0';
- msg->transactionid_length = 0;
- msg->data = NULL;
return KS_STATUS_SUCCESS;
}
{
ks_assert(message);
ks_assert(pool);
-
+
+ memset(message, 0, sizeof(ks_dht_message_t));
+
message->pool = pool;
- message->endpoint = NULL;
- message->raddr = (const ks_sockaddr_t){ 0 };
- message->args = NULL;
- message->type[0] = '\0';
- message->transactionid_length = 0;
- message->data = NULL;
return KS_STATUS_SUCCESS;
}
/**
*
*/
-KS_DECLARE(ks_status_t) ks_dht_message_free(ks_dht_message_t *message)
+KS_DECLARE(ks_status_t) ks_dht_message_free(ks_dht_message_t **message)
{
ks_assert(message);
+ ks_assert(*message);
- ks_dht_message_deinit(message);
- ks_pool_free(message->pool, message);
+ ks_dht_message_deinit(*message);
+ ks_pool_free((*message)->pool, *message);
+
+ *message = NULL;
return KS_STATUS_SUCCESS;
}
ks_assert(item);
ks_assert(pool);
-
+
*item = si = ks_pool_alloc(pool, sizeof(ks_dht_storageitem_t));
si->pool = pool;
- si->v = NULL;
- si->mutable = KS_FALSE;
- si->salt_length = 0;
- si->seq = 0;
return KS_STATUS_SUCCESS;
}
ks_assert(item);
ks_assert(pool);
+ memset(item, 0, sizeof(ks_dht_storageitem_t));
+
item->pool = pool;
- item->v = NULL;
- item->mutable = KS_FALSE;
- item->salt_length = 0;
- item->seq = 0;
return KS_STATUS_SUCCESS;
}
/**
*
*/
-KS_DECLARE(ks_status_t) ks_dht_storageitem_free(ks_dht_storageitem_t *item)
+KS_DECLARE(ks_status_t) ks_dht_storageitem_free(ks_dht_storageitem_t **item)
{
ks_assert(item);
+ ks_assert(*item);
+
+ ks_dht_storageitem_deinit(*item);
+ ks_pool_free((*item)->pool, *item);
- ks_dht_storageitem_deinit(item);
- ks_pool_free(item->pool, item);
+ *item = NULL;
return KS_STATUS_SUCCESS;
}
ks_assert(transaction);
ks_assert(pool);
-
+
*transaction = tran = ks_pool_alloc(pool, sizeof(ks_dht_transaction_t));
tran->pool = pool;
- tran->raddr = (const ks_sockaddr_t){ 0 };
- tran->transactionid = 0;
- tran->callback = NULL;
- tran->expiration = 0;
- tran->finished = KS_FALSE;
return KS_STATUS_SUCCESS;
}
{
ks_assert(transaction);
ks_assert(pool);
-
+
+ memset(transaction, 0, sizeof(ks_dht_transaction_t));
+
transaction->pool = pool;
- transaction->raddr = (const ks_sockaddr_t){ 0 };
- transaction->transactionid = 0;
- transaction->callback = NULL;
- transaction->expiration = 0;
- transaction->finished = KS_FALSE;
return KS_STATUS_SUCCESS;
}
/**
*
*/
-KS_DECLARE(ks_status_t) ks_dht_transaction_free(ks_dht_transaction_t *transaction)
+KS_DECLARE(ks_status_t) ks_dht_transaction_free(ks_dht_transaction_t **transaction)
{
ks_assert(transaction);
+ ks_assert(*transaction);
+
+ ks_dht_transaction_deinit(*transaction);
+ ks_pool_free((*transaction)->pool, *transaction);
- ks_dht_transaction_deinit(transaction);
- ks_pool_free(transaction->pool, transaction);
+ *transaction = NULL;
return KS_STATUS_SUCCESS;
}
err = ks_dht_deinit(dht1);
ok(err == KS_STATUS_SUCCESS);
- err = ks_dht_free(dht1);
+ err = ks_dht_free(&dht1);
ok(err == KS_STATUS_SUCCESS);
err = ks_shutdown();