- port to FreeBSD 4.11 Dec Alpha. Also works on Solaris 10 sparc64,
Solaris 9, FreeBSD 6, Linux i386 and OSX powerpc.
- malloc rndstate, so that it is aligned for access.
+ - fixed rbtree cleanup with postorder traverse.
+ - fixed pending messages are deleted when handled.
14 February 2007: Wouter
- Included configure.ac changes from ldns.
comm_timer_disable(p->timer);
log_info("outnet handle udp reply");
(void)(*p->cb)(p->c, p->cb_arg, NETEVENT_NOERROR, NULL);
+ pending_delete(outnet, p);
return 0;
}
/* it timed out */
log_info("timeout udp");
(void)(*p->cb)(p->c, p->cb_arg, NETEVENT_TIMEOUT, NULL);
+ pending_delete(p->outnet, p);
}
struct outside_network*
return outnet;
}
+/** helper pending delete */
+static void
+pending_node_del(rbnode_t* node, void* arg)
+{
+ struct pending* pend = (struct pending*)node;
+ struct outside_network* outnet = (struct outside_network*)arg;
+ pending_delete(outnet, pend);
+}
+
void
outside_network_delete(struct outside_network* outnet)
{
return;
/* check every element, since we can be called on malloc error */
if(outnet->pending) {
- struct pending *p, *np;
- p = (struct pending*)rbtree_first(outnet->pending);
- while(p && (rbnode_t*)p!=RBTREE_NULL) {
- np = (struct pending*)rbtree_next((rbnode_t*)p);
- pending_delete(NULL, p);
- p = np;
- }
+ traverse_postorder(outnet->pending, pending_node_del, outnet);
free(outnet->pending);
}
if(outnet->udp_buff)
pend->addrlen = addrlen;
pend->cb = callback;
pend->cb_arg = callback_arg;
+ pend->outnet = outnet;
/* insert in tree */
pend->node.key = pend;
comm_point_callback_t* cb;
/** callback user argument */
void* cb_arg;
+ /** the outside network it is part of */
+ struct outside_network* outnet;
};
/**
}
return node;
}
+
+/** recursive descent traverse. */
+static void
+traverse_post(void (*func)(rbnode_t*, void*), void* arg, rbnode_t* node)
+{
+ if(!node || node == RBTREE_NULL)
+ return;
+ /* recurse */
+ traverse_post(func, arg, node->left);
+ traverse_post(func, arg, node->right);
+ /* call user func */
+ (*func)(node, arg);
+}
+
+void
+traverse_postorder(rbtree_t* tree, void (*func)(rbnode_t*, void*), void* arg)
+{
+ traverse_post(func, arg, tree->root);
+}
(rbnode_t*)node != RBTREE_NULL; \
node = (type)rbtree_next((rbnode_t*)node))
+/**
+ * Call function for all elements in the redblack tree, such that
+ * leaf elements are called before parent elements. So that all
+ * elements can be safely free()d.
+ * @param tree: the tree
+ * @param func: function called with element and user arg.
+ * @param arg: user argument.
+ */
+void traverse_postorder(rbtree_t* tree, void (*func)(rbnode_t*, void*),
+ void* arg);
+
#endif /* UTIL_RBTREE_H_ */