mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
Improve ilist.h's support for deletion of slist elements during iteration.
Previously one had to use slist_delete(), implying an additional scan of the list, making this infrastructure considerably less efficient than traditional Lists when deletion of element(s) in a long list is needed. Modify the slist_foreach_modify() macro to support deleting the current element in O(1) time, by keeping a "prev" pointer in addition to "cur" and "next". Although this makes iteration with this macro a bit slower, no real harm is done, since in any scenario where you're not going to delete the current list element you might as well just use slist_foreach instead. Improve the comments about when to use each macro. Back-patch to 9.3 so that we'll have consistent semantics in all branches that provide ilist.h. Note this is an ABI break for callers of slist_foreach_modify(). Andres Freund and Tom Lane
This commit is contained in:
@@ -3598,6 +3598,13 @@ pgstat_write_statsfiles(bool permanent, bool allDbs)
|
||||
{
|
||||
slist_mutable_iter iter;
|
||||
|
||||
/*
|
||||
* Strictly speaking we should do slist_delete_current() before
|
||||
* freeing each request struct. We skip that and instead
|
||||
* re-initialize the list header at the end. Nonetheless, we must use
|
||||
* slist_foreach_modify, not just slist_foreach, since we will free
|
||||
* the node's storage before advancing.
|
||||
*/
|
||||
slist_foreach_modify(iter, &last_statrequests)
|
||||
{
|
||||
DBWriteRequest *req;
|
||||
|
Reference in New Issue
Block a user