From 4368e052e2f8cd828ef25a7abad0cfce155a1613 Mon Sep 17 00:00:00 2001 From: John Jones Date: Mon, 24 Jul 2017 10:26:07 -0500 Subject: [PATCH] First cut of peer request queue complete --- cid/cid.c | 7 +++ exchange/bitswap/peer_request_queue.c | 16 ++++-- test/exchange/test_bitswap_request_queue.h | 66 +++++++++++++++++++++- 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/cid/cid.c b/cid/cid.c index d9d9d2d..504171b 100644 --- a/cid/cid.c +++ b/cid/cid.c @@ -256,6 +256,13 @@ int ipfs_cid_cast(const unsigned char* incoming, size_t incoming_size, struct Ci * @returns < 0 if side A is greater, > 0 if side B is greater, or 0 if equal */ int ipfs_cid_compare(struct Cid* a, struct Cid* b) { + if (a == NULL && b == NULL) + return 0; + if (a != NULL && b == NULL) + return -1; + if (a == NULL && b != NULL) + return 1; + if (a->version != b->version) { return b->version - a->version; } diff --git a/exchange/bitswap/peer_request_queue.c b/exchange/bitswap/peer_request_queue.c index 9467159..72dae3f 100644 --- a/exchange/bitswap/peer_request_queue.c +++ b/exchange/bitswap/peer_request_queue.c @@ -35,8 +35,11 @@ int ipfs_bitswap_peer_request_free(struct PeerRequest* request) { */ struct PeerRequestQueue* ipfs_bitswap_peer_request_queue_new() { struct PeerRequestQueue* queue = malloc(sizeof(struct PeerRequestQueue)); - queue->first = NULL; - queue->last = NULL; + if (queue != NULL) { + pthread_mutex_init(&queue->queue_mutex, NULL); + queue->first = NULL; + queue->last = NULL; + } return queue; } @@ -49,10 +52,12 @@ int ipfs_bitswap_peer_request_queue_free(struct PeerRequestQueue* queue) { pthread_mutex_lock(&queue->queue_mutex); struct PeerRequestEntry* current = queue->last; while (current != NULL) { + struct PeerRequestEntry* prior = current->prior; ipfs_bitswap_peer_request_entry_free(current); - current = current->prior; + current = prior; } pthread_mutex_unlock(&queue->queue_mutex); + free(queue); return 1; } @@ -69,6 +74,9 @@ int ipfs_bitswap_peer_request_queue_add(struct PeerRequestQueue* queue, struct P pthread_mutex_lock(&queue->queue_mutex); entry->prior = queue->last; queue->last = entry; + if (queue->first == NULL) { + queue->first = entry; + } pthread_mutex_unlock(&queue->queue_mutex); return 1; } @@ -151,13 +159,13 @@ struct PeerRequestEntry* ipfs_bitswap_peer_request_entry_new() { /** * Frees resources allocated - * NOTE: This does not free the embedded PeerRequest (should it?) * @param entry the PeerRequestEntry to free * @returns true(1) */ int ipfs_bitswap_peer_request_entry_free(struct PeerRequestEntry* entry) { entry->next = NULL; entry->prior = NULL; + ipfs_bitswap_peer_request_free(entry->current); entry->current = NULL; free(entry); return 1; diff --git a/test/exchange/test_bitswap_request_queue.h b/test/exchange/test_bitswap_request_queue.h index 82cfefb..d1c45b2 100644 --- a/test/exchange/test_bitswap_request_queue.h +++ b/test/exchange/test_bitswap_request_queue.h @@ -5,11 +5,71 @@ * Create a queue, do some work, free the queue, make sure valgrind likes it. */ int test_bitswap_peer_request_queue_new() { + int retVal = 0; + struct PeerRequestQueue* queue = NULL; + struct PeerRequest* request = NULL; + // create a queue - struct PeerRequestQueue* queue = ipfs_bitswap_peer_request_queue_new(); - struct PeerRequest* request = ipfs_bitswap_peer_request_new(); + queue = ipfs_bitswap_peer_request_queue_new(); + if (queue == NULL) + goto exit; + + // add a request + request = ipfs_bitswap_peer_request_new(); + if (request == NULL) + goto exit; ipfs_bitswap_peer_request_queue_add(queue, request); + + retVal = 1; + exit: // clean up ipfs_bitswap_peer_request_queue_free(queue); - return 1; + return retVal; +} + +int test_bitswap_peer_request_queue_find() { + int retVal = 0; + struct PeerRequestQueue* queue = NULL; + struct PeerRequest* request1 = NULL; + struct PeerRequest* request2 = NULL; + struct PeerRequestEntry* foundRequestEntry = NULL; + + // create a queue + queue = ipfs_bitswap_peer_request_queue_new(); + if (queue == NULL) + goto exit; + + // add a request + request1 = ipfs_bitswap_peer_request_new(); + if (request1 == NULL) + goto exit; + request1->peer_id = 1; + ipfs_bitswap_peer_request_queue_add(queue, request1); + + // add a second request + request2 = ipfs_bitswap_peer_request_new(); + if (request2 == NULL) + goto exit; + request2->peer_id = 2; + ipfs_bitswap_peer_request_queue_add(queue, request2); + + // find the first + foundRequestEntry = ipfs_bitswap_peer_request_queue_find_entry(queue, request1); + if (foundRequestEntry == NULL) + goto exit; + if (foundRequestEntry->current->peer_id != 1) + goto exit; + + // find the second + foundRequestEntry = ipfs_bitswap_peer_request_queue_find_entry(queue, request2); + if (foundRequestEntry == NULL) + goto exit; + if (foundRequestEntry->current->peer_id != 2) + goto exit; + + retVal = 1; + exit: + // clean up + ipfs_bitswap_peer_request_queue_free(queue); + return retVal; }