aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/common.c2
-rw-r--r--src/bin/scripts/scripts_parallel.c32
-rw-r--r--src/fe_utils/cancel.c20
3 files changed, 19 insertions, 35 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 06f801764b6..6323a35c91c 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -240,7 +240,7 @@ NoticeProcessor(void *arg, const char *message)
* fgets are coded to handle possible interruption.
*
* On Windows, currently this does not work, so control-C is less useful
- * there, and the callback is just a no-op.
+ * there.
*/
volatile bool sigint_interrupt_enabled = false;
diff --git a/src/bin/scripts/scripts_parallel.c b/src/bin/scripts/scripts_parallel.c
index 45c69b8d192..01bc6dfeffc 100644
--- a/src/bin/scripts/scripts_parallel.c
+++ b/src/bin/scripts/scripts_parallel.c
@@ -28,7 +28,7 @@
#include "scripts_parallel.h"
static void init_slot(ParallelSlot *slot, PGconn *conn);
-static int select_loop(int maxFd, fd_set *workerset, bool *aborting);
+static int select_loop(int maxFd, fd_set *workerset);
static void
init_slot(ParallelSlot *slot, PGconn *conn)
@@ -39,25 +39,19 @@ init_slot(ParallelSlot *slot, PGconn *conn)
}
/*
- * Loop on select() until a descriptor from the given set becomes readable.
+ * Wait until a file descriptor from the given set becomes readable.
*
- * If we get a cancel request while we're waiting, we forego all further
- * processing and set the *aborting flag to true. The return value must be
- * ignored in this case. Otherwise, *aborting is set to false.
+ * Returns the number of ready descriptors, or -1 on failure (including
+ * getting a cancel request).
*/
static int
-select_loop(int maxFd, fd_set *workerset, bool *aborting)
+select_loop(int maxFd, fd_set *workerset)
{
int i;
fd_set saveSet = *workerset;
if (CancelRequested)
- {
- *aborting = true;
return -1;
- }
- else
- *aborting = false;
for (;;)
{
@@ -90,7 +84,7 @@ select_loop(int maxFd, fd_set *workerset, bool *aborting)
if (i < 0 && errno == EINTR)
continue; /* ignore this */
if (i < 0 || CancelRequested)
- *aborting = true; /* but not this */
+ return -1; /* but not this */
if (i == 0)
continue; /* timeout (Win32 only) */
break;
@@ -135,7 +129,6 @@ ParallelSlotsGetIdle(ParallelSlot *slots, int numslots)
{
fd_set slotset;
int maxFd = 0;
- bool aborting;
/* We must reconstruct the fd_set for each call to select_loop */
FD_ZERO(&slotset);
@@ -157,19 +150,12 @@ ParallelSlotsGetIdle(ParallelSlot *slots, int numslots)
}
SetCancelConn(slots->connection);
- i = select_loop(maxFd, &slotset, &aborting);
+ i = select_loop(maxFd, &slotset);
ResetCancelConn();
- if (aborting)
- {
- /*
- * We set the cancel-receiving connection to the one in the zeroth
- * slot above, so fetch the error from there.
- */
- consumeQueryResult(slots->connection);
+ /* failure? */
+ if (i < 0)
return NULL;
- }
- Assert(i != 0);
for (i = 0; i < numslots; i++)
{
diff --git a/src/fe_utils/cancel.c b/src/fe_utils/cancel.c
index eb4056a9a6c..51fb67d384a 100644
--- a/src/fe_utils/cancel.c
+++ b/src/fe_utils/cancel.c
@@ -43,11 +43,11 @@
static PGcancel *volatile cancelConn = NULL;
/*
- * CancelRequested tracks if a cancellation request has completed after
- * a signal interruption. Note that if cancelConn is not set, in short
- * if SetCancelConn() was never called or if ResetCancelConn() freed
- * the cancellation object, then CancelRequested is switched to true after
- * all cancellation attempts.
+ * CancelRequested is set when we receive SIGINT (or local equivalent).
+ * There is no provision in this module for resetting it; but applications
+ * might choose to clear it after successfully recovering from a cancel.
+ * Note that there is no guarantee that we successfully sent a Cancel request,
+ * or that the request will have any effect if we did send it.
*/
volatile sig_atomic_t CancelRequested = false;
@@ -148,6 +148,8 @@ handle_sigint(SIGNAL_ARGS)
int save_errno = errno;
char errbuf[256];
+ CancelRequested = true;
+
if (cancel_callback != NULL)
cancel_callback();
@@ -156,7 +158,6 @@ handle_sigint(SIGNAL_ARGS)
{
if (PQcancel(cancelConn, errbuf, sizeof(errbuf)))
{
- CancelRequested = true;
write_stderr(_("Cancel request sent\n"));
}
else
@@ -165,8 +166,6 @@ handle_sigint(SIGNAL_ARGS)
write_stderr(errbuf);
}
}
- else
- CancelRequested = true;
errno = save_errno; /* just in case the write changed it */
}
@@ -193,6 +192,8 @@ consoleHandler(DWORD dwCtrlType)
if (dwCtrlType == CTRL_C_EVENT ||
dwCtrlType == CTRL_BREAK_EVENT)
{
+ CancelRequested = true;
+
if (cancel_callback != NULL)
cancel_callback();
@@ -203,7 +204,6 @@ consoleHandler(DWORD dwCtrlType)
if (PQcancel(cancelConn, errbuf, sizeof(errbuf)))
{
write_stderr(_("Cancel request sent\n"));
- CancelRequested = true;
}
else
{
@@ -211,8 +211,6 @@ consoleHandler(DWORD dwCtrlType)
write_stderr(errbuf);
}
}
- else
- CancelRequested = true;
LeaveCriticalSection(&cancelConnLock);