static void ptree_free(ptree_t * ptp) { if (ptp) { if (ptp->part) ptree_free(ptp->part); if (ptp->next) ptree_free(ptp->next); if (ptp->val.size) Free(ptp->val.val); Free(ptp); } }
void trie_cleanup(void) { rwlock_wr_lock(&tree_lock); ptree_free(tree); rwlock_unlock(&tree_lock); rwlock_destroy(&tree_lock); }
static ptree_t * parse_sexp(octet_t * sexp) { ptree_t *ptp, *ntp = 0, *ptr; if (*sexp->val == '(') { ptp = (ptree_t *) Calloc(1, sizeof(ptree_t)); ptp->list = 1; sexp->val++; sexp->len--; while (sexp->len && *sexp->val != ')') { if ((ptr = parse_sexp(sexp)) == 0) { ptree_free(ptp); return 0; } if (ptp->part == 0) ntp = ptp->part = ptr; else { ntp->next = ptr; ntp = ntp->next; } } if (*sexp->val == ')') { sexp->val++; sexp->len--; } else { /* error */ ptree_free(ptp); return 0; } } else { ptp = (ptree_t *) Calloc(1, sizeof(ptree_t)); if (get_str(sexp, &ptp->val) != SPOCP_SUCCESS) { ptree_free(ptp); return 0; } } return ptp; }
static void destroy_flowinfo_in_port(struct flowinfo *self) { struct ptree_node *node; struct flowinfo *flowinfo; node = ptree_top(self->ptree); while (node != NULL) { flowinfo = node->info; flowinfo->destroy_func(flowinfo); node = ptree_next(node); } ptree_free(self->ptree); self->misc->destroy_func(self->misc); free(self); }
static void destroy_flowinfo_ipv4_dst(struct flowinfo *self) { struct ptree_node *node; struct flowinfo *flowinfo; node = ptree_top(self->ptree); while (node != NULL) { flowinfo = node->info; if (flowinfo != NULL) { flowinfo->destroy_func(flowinfo); } node = ptree_next(node); } ptree_free(self->ptree); free(self); }