/* tracks whether any work is needed in callback functions */
static bool xact_got_connection = false;
+/* custom wait event values, retrieved from shared memory */
+static uint32 pgfdw_we_cleanup_result = 0;
+static uint32 pgfdw_we_connect = 0;
+static uint32 pgfdw_we_get_result = 0;
+
/*
* Milliseconds to wait to cancel an in-progress query or execute a cleanup
* query; if it takes longer than 30 seconds to do these, we assume the
/* verify the set of connection parameters */
check_conn_params(keywords, values, user);
+ /* first time, allocate or get the custom wait event */
+ if (pgfdw_we_connect == 0)
+ pgfdw_we_connect = WaitEventExtensionNew("PostgresFdwConnect");
+
/* OK to make connection */
conn = libpqsrv_connect_params(keywords, values,
false, /* expand_dbname */
- WAIT_EVENT_EXTENSION);
+ pgfdw_we_connect);
if (!conn || PQstatus(conn) != CONNECTION_OK)
ereport(ERROR,
{
int wc;
+ /* first time, allocate or get the custom wait event */
+ if (pgfdw_we_get_result == 0)
+ pgfdw_we_get_result = WaitEventExtensionNew("PostgresFdwGetResult");
+
/* Sleep until there's something to do */
wc = WaitLatchOrSocket(MyLatch,
WL_LATCH_SET | WL_SOCKET_READABLE |
WL_EXIT_ON_PM_DEATH,
PQsocket(conn),
- -1L, WAIT_EVENT_EXTENSION);
+ -1L, pgfdw_we_get_result);
ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS();
goto exit;
}
+ /* first time, allocate or get the custom wait event */
+ if (pgfdw_we_cleanup_result == 0)
+ pgfdw_we_cleanup_result = WaitEventExtensionNew("PostgresFdwCleanupResult");
+
/* Sleep until there's something to do */
wc = WaitLatchOrSocket(MyLatch,
WL_LATCH_SET | WL_SOCKET_READABLE |
WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
PQsocket(conn),
- cur_timeout, WAIT_EVENT_EXTENSION);
+ cur_timeout, pgfdw_we_cleanup_result);
ResetLatch(MyLatch);
CHECK_FOR_INTERRUPTS();