/* * fd_free * * free up memory allocated to scamper's monitoring of the file descriptor. */ static void fd_free(scamper_fd_t *fdn) { scamper_debug(__func__, "fd %d type %s", fdn->fd, fd_tostr(fdn)); if(fdn->fd >= 0 && fdn->fd < fd_array_s && fd_array != NULL) fd_array[fdn->fd] = NULL; if(fdn->read.node != NULL) dlist_node_pop(fdn->read.list, fdn->read.node); if(fdn->write.node != NULL) dlist_node_pop(fdn->write.list, fdn->write.node); if(fdn->rc0 != NULL) dlist_node_pop(refcnt_0, fdn->rc0); if(fdn->fd_tree_node != NULL) splaytree_remove_node(fd_tree, fdn->fd_tree_node); if(fdn->fd_list_node != NULL) dlist_node_pop(fd_list, fdn->fd_list_node); if(SCAMPER_FD_TYPE_IS_ICMP(fdn)) { if(fdn->fd_icmp_addr != NULL) free(fdn->fd_icmp_addr); } else if(SCAMPER_FD_TYPE_IS_UDP(fdn)) { if(fdn->fd_udp_addr != NULL) free(fdn->fd_udp_addr); } else if(SCAMPER_FD_TYPE_IS_TCP(fdn)) { if(fdn->fd_tcp_addr != NULL) free(fdn->fd_tcp_addr); } else if(SCAMPER_FD_TYPE_IS_DL(fdn)) { if(fdn->fd_dl_dl != NULL) scamper_dl_state_free(fdn->fd_dl_dl); } free(fdn); return; }
void scamper_task_anc_del(scamper_task_t *task, scamper_task_anc_t *anc) { if(anc == NULL) return; dlist_node_pop(task->ancillary, anc->node); free(anc); return; }
int scamper_task_dehold(scamper_task_t *task, void *cookie) { task_onhold_t *toh; assert(task->onhold != NULL); if((toh = dlist_node_pop(task->onhold, cookie)) == NULL) return -1; free(toh); return 0; }
static void rtsock_pair_free(rtsock_pair_t *pair) { if(pair == NULL) return; pair->route->internal = NULL; if(pair->node != NULL) dlist_node_pop(pairs, pair->node); free(pair); return; }
/* * fd_find * * search the tree of file descriptors known to scamper for a matching * entry. if one is found, increment its reference count and return it. */ static scamper_fd_t *fd_find(scamper_fd_t *findme) { scamper_fd_t *fdn; if((fdn = splaytree_find(fd_tree, findme)) != NULL) { if(fdn->refcnt == 0 && fdn->rc0 != NULL) { dlist_node_pop(refcnt_0, fdn->rc0); fdn->rc0 = NULL; } fdn->refcnt++; } return fdn; }
static rtsock_pair_t *rtsock_pair_get(uint16_t seq) { rtsock_pair_t *pair; dlist_node_t *node; for(node=dlist_head_node(pairs); node != NULL; node=dlist_node_next(node)) { pair = dlist_node_item(node); if(pair->seq != seq) continue; dlist_node_pop(pairs, node); pair->node = NULL; return pair; } return NULL; }
static void s2t_free(s2t_t *s2t) { scamper_task_sig_t *sig = s2t->sig; if(s2t == NULL) return; if(s2t->node != NULL) { if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_TX_IP) splaytree_remove_node(tx_ip, s2t->node); else if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_TX_ND) splaytree_remove_node(tx_nd, s2t->node); else if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_SNIFF) dlist_node_pop(sniff, s2t->node); } free(s2t); return; }