+/** @brief Return a new packet
+ *
+ * Assumes that @ref lock is held. */
+static struct packet *new_packet(void) {
+ struct packet *p;
+
+ if(free_packets) {
+ p = &free_packets->p;
+ free_packets = free_packets->next;
+ } else {
+ if(!count_free_packets) {
+ next_free_packet = xcalloc(1024, sizeof (union free_packet));
+ count_free_packets = 1024;
+ }
+ p = &(next_free_packet++)->p;
+ --count_free_packets;
+ }
+ return p;
+}
+
+/** @brief Free a packet
+ *
+ * Assumes that @ref lock is held. */
+static void free_packet(struct packet *p) {
+ union free_packet *u = (union free_packet *)p;
+ u->next = free_packets;
+ free_packets = u;
+}
+