diff --git a/c/tskit/tables.c b/c/tskit/tables.c index 3dff91728e..cc0345a977 100644 --- a/c/tskit/tables.c +++ b/c/tskit/tables.c @@ -12893,22 +12893,31 @@ typedef struct _edge_list_t { struct _edge_list_t *next; } edge_list_t; -static edge_list_t *TSK_WARN_UNUSED -extend_edges_alloc_entry(tsk_blkalloc_t *heap, tsk_id_t edge) +static int +extend_edges_append_entry( + edge_list_t **head, edge_list_t **tail, tsk_blkalloc_t *heap, tsk_id_t edge) { + int ret = 0; edge_list_t *x = NULL; x = tsk_blkalloc_get(heap, sizeof(*x)); if (x == NULL) { + ret = TSK_ERR_NO_MEMORY; goto out; } - tsk_bug_assert(edge >= 0); x->edge = edge; x->extended = false; x->next = NULL; + + if (*tail == NULL) { + *head = x; + } else { + (*tail)->next = x; + } + *tail = x; out: - return x; + return ret; } static void @@ -12953,7 +12962,7 @@ forward_extend(tsk_table_collection_t *self, int direction) tsk_blkalloc_t edge_list_heap; edge_list_t *edges_in_head, *edges_in_tail; edge_list_t *edges_out_head, *edges_out_tail; - edge_list_t *x, *y, *ex1, *ex2, *ex_in; + edge_list_t *ex1, *ex2, *ex_in; tsk_edge_table_t edges; tsk_edge_t edge; double sign, here, there; @@ -13021,36 +13030,24 @@ forward_extend(tsk_table_collection_t *self, int direction) while (((tk < M) && (tk >= 0)) && (far_side[O[tk]] == here)) { // add edge tk to pending_out - x = extend_edges_alloc_entry(&edge_list_heap, O[tk]); - if (x == NULL) { + ret = extend_edges_append_entry( + &edges_out_head, &edges_out_tail, &edge_list_heap, O[tk]); + if (ret != 0) { ret = TSK_ERR_NO_MEMORY; goto out; } - if (edges_out_tail == NULL) { - edges_out_head = x; - } else { - y = edges_out_tail; - y->next = x; - } - edges_out_tail = x; num_children[edges.parent[O[tk]]] -= 1; num_children[edges.child[O[tk]]] -= 1; tk += sign_int; } while (((tj < M) && (tj >= 0)) && (near_side[I[tj]] == here)) { // add edge tj to pending_in - x = extend_edges_alloc_entry(&edge_list_heap, I[tj]); - if (x == NULL) { + ret = extend_edges_append_entry( + &edges_in_head, &edges_in_tail, &edge_list_heap, I[tj]); + if (ret != 0) { ret = TSK_ERR_NO_MEMORY; goto out; } - if (edges_in_tail == NULL) { - edges_in_head = x; - } else { - y = edges_in_tail; - y->next = x; - } - edges_in_tail = x; num_children[edges.parent[I[tj]]] += 1; num_children[edges.child[I[tj]]] += 1; tj += sign_int;