diff options
Diffstat (limited to 'src/backend/lib/hasht.c')
-rw-r--r-- | src/backend/lib/hasht.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/backend/lib/hasht.c b/src/backend/lib/hasht.c index 5caeabd281a..1ac04cc92dd 100644 --- a/src/backend/lib/hasht.c +++ b/src/backend/lib/hasht.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/lib/Attic/hasht.c,v 1.13 2000/01/31 04:35:51 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/lib/Attic/hasht.c,v 1.14 2001/01/02 04:33:15 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -21,23 +21,32 @@ /* ----------------------------------- * HashTableWalk * - * call function on every element in hashtable - * one extra argument (arg) may be supplied + * call given function on every element in hashtable + * + * one extra argument (arg) may be supplied + * + * NOTE: it is allowed for the given function to delete the hashtable entry + * it is passed. However, deleting any other element while the scan is + * in progress is UNDEFINED (see hash_seq functions). Also, if elements are + * added to the table while the scan is in progress, it is unspecified + * whether they will be visited by the scan or not. * ----------------------------------- */ void -HashTableWalk(HTAB *hashtable, HashtFunc function, int arg) +HashTableWalk(HTAB *hashtable, HashtFunc function, Datum arg) { + HASH_SEQ_STATUS status; long *hashent; void *data; int keysize; + hash_seq_init(&status, hashtable); keysize = hashtable->hctl->keysize; - hash_seq((HTAB *) NULL); - while ((hashent = hash_seq(hashtable)) != (long *) TRUE) + + while ((hashent = hash_seq_search(&status)) != (long *) TRUE) { if (hashent == NULL) - elog(FATAL, "error in HashTableWalk."); + elog(FATAL, "error in HashTableWalk"); /* * XXX the corresponding hash table insertion does NOT LONGALIGN |