From: Kyotaro Horiguchi Date: Wed, 22 Feb 2017 09:07:49 +0900 Subject: [PATCH 08/13] Allow wait event set to be registered to resource owner WaitEventSet may have to be released using resource owner. This change allow the creator of a WaitEventSet to specify a resource owner. --- src/backend/libpq/pqcomm.c | 2 +- src/backend/storage/ipc/latch.c | 14 ++++++++------ src/backend/storage/lmgr/condition_variable.c | 2 +- src/backend/utils/resowner/resowner.c | 1 - src/include/storage/latch.h | 4 +++- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 7939b1f..16a5d7a 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -201,7 +201,7 @@ pq_init(void) (errmsg("could not set socket to nonblocking mode: %m"))); #endif - FeBeWaitSet = CreateWaitEventSet(TopMemoryContext, 3); + FeBeWaitSet = CreateWaitEventSet(TopMemoryContext, NULL, 3); AddWaitEventToSet(FeBeWaitSet, WL_SOCKET_WRITEABLE, MyProcPort->sock, NULL, NULL); AddWaitEventToSet(FeBeWaitSet, WL_LATCH_SET, -1, MyLatch, NULL); diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index 30dc77b..da2c41d 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -331,7 +331,7 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, /* This function doesn't need resowner for event set */ CurrentResourceOwner = NULL; - set = CreateWaitEventSet(CurrentMemoryContext, 3); + set = CreateWaitEventSet(CurrentMemoryContext, NULL, 3); CurrentResourceOwner = savedOwner; if (wakeEvents & WL_TIMEOUT) @@ -490,14 +490,14 @@ ResetLatch(volatile Latch *latch) * WaitEventSetWait(). */ WaitEventSet * -CreateWaitEventSet(MemoryContext context, int nevents) +CreateWaitEventSet(MemoryContext context, ResourceOwner res, int nevents) { WaitEventSet *set; char *data; Size sz = 0; - if (CurrentResourceOwner) - ResourceOwnerEnlargeWESs(CurrentResourceOwner); + if (res) + ResourceOwnerEnlargeWESs(res); /* * Use MAXALIGN size/alignment to guarantee that later uses of memory are @@ -558,9 +558,11 @@ CreateWaitEventSet(MemoryContext context, int nevents) StaticAssertStmt(WSA_INVALID_EVENT == NULL, ""); #endif - set->resowner = CurrentResourceOwner; - if (CurrentResourceOwner) + /* Register this wait event set if requested */ + set->resowner = res; + if (res) ResourceOwnerRememberWES(set->resowner, set); + return set; } diff --git a/src/backend/storage/lmgr/condition_variable.c b/src/backend/storage/lmgr/condition_variable.c index 6f1ef0b..503aef1 100644 --- a/src/backend/storage/lmgr/condition_variable.c +++ b/src/backend/storage/lmgr/condition_variable.c @@ -66,7 +66,7 @@ ConditionVariablePrepareToSleep(ConditionVariable *cv) /* Create a reusable WaitEventSet. */ if (cv_wait_event_set == NULL) { - cv_wait_event_set = CreateWaitEventSet(TopMemoryContext, 1); + cv_wait_event_set = CreateWaitEventSet(TopMemoryContext, NULL, 1); AddWaitEventToSet(cv_wait_event_set, WL_LATCH_SET, PGINVALID_SOCKET, &MyProc->procLatch, NULL); } diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index 34c7e37..d497216 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -1329,4 +1329,3 @@ PrintWESLeakWarning(WaitEventSet *events) elog(WARNING, "wait event set leak: %p still referenced", events); } - diff --git a/src/include/storage/latch.h b/src/include/storage/latch.h index 3158d7b..8233b6d 100644 --- a/src/include/storage/latch.h +++ b/src/include/storage/latch.h @@ -101,6 +101,7 @@ #define LATCH_H #include +#include "utils/resowner.h" /* * Latch structure should be treated as opaque and only accessed through @@ -152,7 +153,8 @@ extern void DisownLatch(volatile Latch *latch); extern void SetLatch(volatile Latch *latch); extern void ResetLatch(volatile Latch *latch); -extern WaitEventSet *CreateWaitEventSet(MemoryContext context, int nevents); +extern WaitEventSet *CreateWaitEventSet(MemoryContext context, + ResourceOwner res, int nevents); extern void FreeWaitEventSet(WaitEventSet *set); extern int AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch, void *user_data); -- 2.9.2 ----Next_Part(Wed_Feb_22_17_39_45_2017_090)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="0007-Add-instrumentation-to-async-execution.patch"