X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Frow.c;h=ba00bb9f3059140b965b00989fd49298c5898f95;hb=df2fa9b50e1c0e93c6be1d31a5d69eb4f077add3;hp=d088ff98a1c6a7e957c7549fbed30dc3cf31448d;hpb=c69ee87c10818267f991236201150b1fa51ae519;p=openvswitch diff --git a/ovsdb/row.c b/ovsdb/row.c index d088ff98..ba00bb9f 100644 --- a/ovsdb/row.c +++ b/ovsdb/row.c @@ -35,6 +35,8 @@ allocate_row(const struct ovsdb_table *table) struct ovsdb_row *row = xmalloc(row_size); row->table = (struct ovsdb_table *) table; row->txn_row = NULL; + list_init(&row->src_refs); + list_init(&row->dst_refs); row->n_refs = 0; return row; } @@ -77,8 +79,21 @@ ovsdb_row_destroy(struct ovsdb_row *row) { if (row) { const struct ovsdb_table *table = row->table; + struct ovsdb_weak_ref *weak, *next; const struct shash_node *node; + LIST_FOR_EACH_SAFE (weak, next, dst_node, &row->dst_refs) { + list_remove(&weak->src_node); + list_remove(&weak->dst_node); + free(weak); + } + + LIST_FOR_EACH_SAFE (weak, next, src_node, &row->src_refs) { + list_remove(&weak->src_node); + list_remove(&weak->dst_node); + free(weak); + } + SHASH_FOR_EACH (node, &table->schema->columns) { const struct ovsdb_column *column = node->data; ovsdb_datum_destroy(&row->fields[column->index], &column->type); @@ -309,8 +324,7 @@ ovsdb_row_hash_destroy(struct ovsdb_row_hash *rh, bool destroy_rows) { struct ovsdb_row_hash_node *node, *next; - HMAP_FOR_EACH_SAFE (node, next, struct ovsdb_row_hash_node, hmap_node, - &rh->rows) { + HMAP_FOR_EACH_SAFE (node, next, hmap_node, &rh->rows) { hmap_remove(&rh->rows, &node->hmap_node); if (destroy_rows) { ovsdb_row_destroy((struct ovsdb_row *) node->row); @@ -343,7 +357,7 @@ ovsdb_row_hash_contains_all(const struct ovsdb_row_hash *a, struct ovsdb_row_hash_node *node; assert(ovsdb_column_set_equals(&a->columns, &b->columns)); - HMAP_FOR_EACH (node, struct ovsdb_row_hash_node, hmap_node, &b->rows) { + HMAP_FOR_EACH (node, hmap_node, &b->rows) { if (!ovsdb_row_hash_contains__(a, node->row, node->hmap_node.hash)) { return false; } @@ -363,8 +377,7 @@ ovsdb_row_hash_contains__(const struct ovsdb_row_hash *rh, const struct ovsdb_row *row, size_t hash) { struct ovsdb_row_hash_node *node; - HMAP_FOR_EACH_WITH_HASH (node, struct ovsdb_row_hash_node, hmap_node, - hash, &rh->rows) { + HMAP_FOR_EACH_WITH_HASH (node, hmap_node, hash, &rh->rows) { if (ovsdb_row_equal_columns(row, node->row, &rh->columns)) { return true; }