static inline void delete_state(store_t *const store, fcs_pseudo_dfs_lru_cache_t *const cache, fcs_cache_key_t *const key) { fcs_pdfs_cache_insert(cache, &(key->s)); int rc_int; JHSD(rc_int, *store, &(key->s), sizeof(key->s)); }
void network_manager_unclaim_invs(struct network_manager* nm, struct network_peer* peer, struct inv const* invs, size_t num_invs) { int rc; int stopped = 0; for(size_t i = 0; i < num_invs; i++) { JHSD(rc, nm->claimed_invs, (uint8_t*)(&invs[i]), sizeof(struct inv)); if(rc == 0 && stopped == 0) { network_peer_disconnect(peer, "bad unclaim"); stopped = 1; } } }
static int start_peer(struct network_manager* nm) { // Randomly pick an address to connect to struct network_address address; int have_address = 0; for(int i = 0; i < 50; i++) { if(database_get_random_peer_address(chaind_database(nm->chaind), &address) <= 0) { // Error, or no address to select break; } // Apply default port if sin_port == 0 if(address.sin_port == 0) address.sin_port = htons(NETWORK_DEFAULT_PORT); if(network_manager_get_peer_by_address(nm, &address) == NULL) { have_address = 1; break; } } if(!have_address) return -1; struct network_peer* peer = network_peer_create(nm); struct network_peer** ppeer = NULL; Word_t peer_id = nm->next_peer_id; JLI(ppeer, nm->peer_list, peer_id); *ppeer = peer; nm->next_peer_id += 1; Word_t* pindex; JHSI(pindex, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address)); *pindex = peer_id; int res = network_peer_connect(peer, &address, blockchain_link_height(chaind_best_blockchain_link(nm->chaind))); if(res != 0) { int rc; JLD(rc, nm->peer_list, peer_id); JHSD(rc, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address)); network_peer_destroy(peer); return res; } nm->num_peers += 1; return 0; }
static void stop_peer(struct network_manager* nm, struct network_peer* peer) { struct network_address address; network_peer_address(peer, &address); Word_t* pindex; JHSG(pindex, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address)); assert(pindex != NULL); Word_t peer_id = *pindex; struct network_peer** ppeer; JLG(ppeer, nm->peer_list, peer_id); assert(ppeer != NULL); assert(*ppeer == peer); // Remove from lists int rc; JLD(rc, nm->peer_list, peer_id); JHSD(rc, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address)); // Done with you! network_peer_destroy(peer); nm->num_peers -= 1; }
static void remove_from_wanted_invs(struct network_manager* nm, struct inv const* invs, size_t num_invs) { Word_t swap_index; struct inv** pinv1; struct inv** pinv2; struct inv* inv2; int rc; Word_t* pindex1; Word_t* pindex2; for(size_t i = 0; i < num_invs; i++) { struct inv const* inv = &invs[i]; JHSG(pindex1, nm->wanted_invs_by_inv, (uint8_t*)inv, sizeof(struct inv)); assert(pindex1 != NULL); Word_t* tail = NULL; Word_t* head = NULL; void** list = NULL; switch(inv->type) { case INV_TYPE_BLOCK: head = &nm->head_block_inv_id; tail = &nm->tail_block_inv_id; list = &nm->block_inv_list; break; case INV_TYPE_TX: head = &nm->head_tx_inv_id; tail = &nm->tail_tx_inv_id; list = &nm->tx_inv_list; break; case INV_TYPE_ERROR: assert(0); break; } assert(*head > *tail); swap_index = *head - 1; if(*pindex1 == *tail) { JLG(pinv1, *list, *pindex1); assert(memcmp(*pinv1, inv, sizeof(struct inv)) == 0); free(*pinv1); JLD(rc, *list, *pindex1); (*tail) += 1; } else if(*pindex1 < swap_index) { JLG(pinv1, *list, *pindex1); assert(pinv1 != NULL); JLG(pinv2, *list, swap_index); assert(pinv2 != NULL); assert(memcmp(*pinv1, inv, sizeof(struct inv)) == 0); assert(memcmp(*pinv1, *pinv2, sizeof(struct inv)) != 0); // JLD will kill the pinv2 pointer, so save the inv inv2 = *pinv2; free(*pinv1); JLD(rc, *list, swap_index); // JLD can reorder the array.. JLI(pinv1, *list, *pindex1); *pinv1 = inv2; // Remove from wanted array JHSG(pindex2, nm->wanted_invs_by_inv, (uint8_t*)inv2, sizeof(struct inv)); *pindex2 = *pindex1; (*head) -= 1; } else { assert(*pindex1 == swap_index); JLG(pinv2, *list, swap_index); assert(memcmp(*pinv2, inv, sizeof(struct inv)) == 0); free(*pinv2); JLD(rc, *list, swap_index); (*head) -= 1; } JHSD(rc, nm->wanted_invs_by_inv, (uint8_t*)inv, sizeof(struct inv)); } }