diff --git a/src/backend/storage/ipc/dht.c b/src/backend/storage/ipc/dht.c index 0916a3f..6974b91 100644 --- a/src/backend/storage/ipc/dht.c +++ b/src/backend/storage/ipc/dht.c @@ -51,21 +51,6 @@ #include "storage/spin.h" #include "utils/memutils.h" -/* - * An item in the hash table. This wraps the user's entry object in an - * envelop that holds a pointer back to the bucket and a pointer to the next - * item in the bucket. - */ -struct dht_hash_table_item -{ - /* The hashed key, to avoid having to recompute it. */ - dht_hash hash; - /* The next item in the same bucket. */ - dsa_pointer next; - /* The user's entry object follows here. */ - char entry[FLEXIBLE_ARRAY_MEMBER]; -}; - /* The number of partitions for locking purposes. */ #define DHT_NUM_PARTITIONS_LOG2 7 #define DHT_NUM_PARTITIONS (1 << DHT_NUM_PARTITIONS_LOG2) @@ -699,6 +684,30 @@ dht_iterate_next(dht_iterator *iterator) { dsa_pointer item_pointer; + item_pointer = dht_iterate_next_dsa(iterator); + + if (DsaPointerIsValid(item_pointer)) + { + iterator->item = dsa_get_address(iterator->hash_table->area, + item_pointer); + return &(iterator->item->entry); + } + + return NULL; +} + +/* + * dht_iterate_next_dsa + * + * Move to the next item in the hash table. Returns a dsa_pointer to + * next item, or InvalidDsaPointer if the end of the hash table has + * been reached. + */ +dsa_pointer +dht_iterate_next_dsa(dht_iterator *iterator) +{ + dsa_pointer item_pointer; + Assert(iterator->hash_table->control->magic == DHT_MAGIC); while (iterator->partition < DHT_NUM_PARTITIONS) @@ -716,9 +725,8 @@ dht_iterate_next(dht_iterator *iterator) { /* Remember this item, so that we can step over it next time. */ iterator->last_item_pointer = item_pointer; - iterator->item = dsa_get_address(iterator->hash_table->area, - item_pointer); - return &(iterator->item->entry); + + return item_pointer; } /* We have reached the end of the bucket. */ @@ -751,7 +759,7 @@ dht_iterate_next(dht_iterator *iterator) } } iterator->item = NULL; - return NULL; + return InvalidDsaPointer; } /* diff --git a/src/include/storage/dht.h b/src/include/storage/dht.h index ccf9d17..8655f55 100644 --- a/src/include/storage/dht.h +++ b/src/include/storage/dht.h @@ -61,11 +61,25 @@ typedef struct /* Forward declaration of private types for use only by dht.c. */ struct dht_hash_table_bucket; -struct dht_hash_table_item; -typedef struct dht_hash_table_item dht_hash_table_item; + typedef struct dht_hash_table_bucket dht_hash_table_bucket; /* + * An item in the hash table. This wraps the user's entry object in an + * envelop that holds a pointer back to the bucket and a pointer to the next + * item in the bucket. + */ +typedef struct dht_hash_table_item +{ + /* The hashed key, to avoid having to recompute it. */ + dht_hash hash; + /* The next item in the same bucket. */ + dsa_pointer next; + /* The user's entry object follows here. */ + char entry[FLEXIBLE_ARRAY_MEMBER]; +}dht_hash_table_item; + +/* * The state used to track a walk over all entries in a hash table. The * members of this struct are only for use by code in dht.c, but it is * included in the header because it's useful to be able to create objects of @@ -101,6 +115,7 @@ extern void *dht_iterate_next(dht_iterator *iterator); extern void dht_iterate_delete(dht_iterator *iterator); extern void dht_iterate_release(dht_iterator *iterator); extern void dht_iterate_end(dht_iterator *iterator); +extern dsa_pointer dht_iterate_next_dsa(dht_iterator *iterator); /* Finding, creating, deleting entries. */ extern void *dht_find(dht_hash_table *hash_table,