aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/file/sharedfileset.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/file/sharedfileset.c')
-rw-r--r--src/backend/storage/file/sharedfileset.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/backend/storage/file/sharedfileset.c b/src/backend/storage/file/sharedfileset.c
index 8b96e81ffff..859c22e79b6 100644
--- a/src/backend/storage/file/sharedfileset.c
+++ b/src/backend/storage/file/sharedfileset.c
@@ -266,12 +266,16 @@ SharedFileSetOnDetach(dsm_segment *segment, Datum datum)
static void
SharedFileSetDeleteOnProcExit(int status, Datum arg)
{
- ListCell *l;
-
- /* Loop over all the pending shared fileset entry */
- foreach(l, filesetlist)
+ /*
+ * Remove all the pending shared fileset entries. We don't use foreach() here
+ * because SharedFileSetDeleteAll will remove the current element in
+ * filesetlist. Though we have used foreach_delete_current() to remove the
+ * element from filesetlist it could only fix up the state of one of the
+ * loops, see SharedFileSetUnregister.
+ */
+ while (list_length(filesetlist) > 0)
{
- SharedFileSet *fileset = (SharedFileSet *) lfirst(l);
+ SharedFileSet *fileset = (SharedFileSet *) linitial(filesetlist);
SharedFileSetDeleteAll(fileset);
}
@@ -301,7 +305,7 @@ SharedFileSetUnregister(SharedFileSet *input_fileset)
/* Remove the entry from the list */
if (input_fileset == fileset)
{
- filesetlist = list_delete_cell(filesetlist, l);
+ filesetlist = foreach_delete_current(filesetlist, l);
return;
}
}