First cut of peer request queue complete
This commit is contained in:
parent
5507937bff
commit
4368e052e2
3 changed files with 82 additions and 7 deletions
|
@ -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
|
* @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) {
|
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) {
|
if (a->version != b->version) {
|
||||||
return b->version - a->version;
|
return b->version - a->version;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,11 @@ int ipfs_bitswap_peer_request_free(struct PeerRequest* request) {
|
||||||
*/
|
*/
|
||||||
struct PeerRequestQueue* ipfs_bitswap_peer_request_queue_new() {
|
struct PeerRequestQueue* ipfs_bitswap_peer_request_queue_new() {
|
||||||
struct PeerRequestQueue* queue = malloc(sizeof(struct PeerRequestQueue));
|
struct PeerRequestQueue* queue = malloc(sizeof(struct PeerRequestQueue));
|
||||||
queue->first = NULL;
|
if (queue != NULL) {
|
||||||
queue->last = NULL;
|
pthread_mutex_init(&queue->queue_mutex, NULL);
|
||||||
|
queue->first = NULL;
|
||||||
|
queue->last = NULL;
|
||||||
|
}
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,10 +52,12 @@ int ipfs_bitswap_peer_request_queue_free(struct PeerRequestQueue* queue) {
|
||||||
pthread_mutex_lock(&queue->queue_mutex);
|
pthread_mutex_lock(&queue->queue_mutex);
|
||||||
struct PeerRequestEntry* current = queue->last;
|
struct PeerRequestEntry* current = queue->last;
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
|
struct PeerRequestEntry* prior = current->prior;
|
||||||
ipfs_bitswap_peer_request_entry_free(current);
|
ipfs_bitswap_peer_request_entry_free(current);
|
||||||
current = current->prior;
|
current = prior;
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&queue->queue_mutex);
|
pthread_mutex_unlock(&queue->queue_mutex);
|
||||||
|
free(queue);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +74,9 @@ int ipfs_bitswap_peer_request_queue_add(struct PeerRequestQueue* queue, struct P
|
||||||
pthread_mutex_lock(&queue->queue_mutex);
|
pthread_mutex_lock(&queue->queue_mutex);
|
||||||
entry->prior = queue->last;
|
entry->prior = queue->last;
|
||||||
queue->last = entry;
|
queue->last = entry;
|
||||||
|
if (queue->first == NULL) {
|
||||||
|
queue->first = entry;
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&queue->queue_mutex);
|
pthread_mutex_unlock(&queue->queue_mutex);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -151,13 +159,13 @@ struct PeerRequestEntry* ipfs_bitswap_peer_request_entry_new() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees resources allocated
|
* Frees resources allocated
|
||||||
* NOTE: This does not free the embedded PeerRequest (should it?)
|
|
||||||
* @param entry the PeerRequestEntry to free
|
* @param entry the PeerRequestEntry to free
|
||||||
* @returns true(1)
|
* @returns true(1)
|
||||||
*/
|
*/
|
||||||
int ipfs_bitswap_peer_request_entry_free(struct PeerRequestEntry* entry) {
|
int ipfs_bitswap_peer_request_entry_free(struct PeerRequestEntry* entry) {
|
||||||
entry->next = NULL;
|
entry->next = NULL;
|
||||||
entry->prior = NULL;
|
entry->prior = NULL;
|
||||||
|
ipfs_bitswap_peer_request_free(entry->current);
|
||||||
entry->current = NULL;
|
entry->current = NULL;
|
||||||
free(entry);
|
free(entry);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -5,11 +5,71 @@
|
||||||
* Create a queue, do some work, free the queue, make sure valgrind likes it.
|
* Create a queue, do some work, free the queue, make sure valgrind likes it.
|
||||||
*/
|
*/
|
||||||
int test_bitswap_peer_request_queue_new() {
|
int test_bitswap_peer_request_queue_new() {
|
||||||
|
int retVal = 0;
|
||||||
|
struct PeerRequestQueue* queue = NULL;
|
||||||
|
struct PeerRequest* request = NULL;
|
||||||
|
|
||||||
// create a queue
|
// create a queue
|
||||||
struct PeerRequestQueue* queue = ipfs_bitswap_peer_request_queue_new();
|
queue = ipfs_bitswap_peer_request_queue_new();
|
||||||
struct PeerRequest* request = ipfs_bitswap_peer_request_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);
|
ipfs_bitswap_peer_request_queue_add(queue, request);
|
||||||
|
|
||||||
|
retVal = 1;
|
||||||
|
exit:
|
||||||
// clean up
|
// clean up
|
||||||
ipfs_bitswap_peer_request_queue_free(queue);
|
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue