mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Fix query cancellation handling in psql
The refactoring done ina4fd3aa
for query cancellation has messed up with the logic in psql by mixing CancelRequested and cancel_pressed, breaking for example \watch. The former would be switched to true if a cancellation request has been attempted and that it actually succeeded, and the latter tracks if a cancellation attempt has been done. This commit brings back the code of psql to a state consistent to what it was beforea4fd3aa
, without giving up on the refactoring pieces introduced. It should be actually possible to merge more both flags as their concepts are close enough, however note that psql's --single-step mode relies on cancel_pressed to be always set, so this requires more careful analysis left for later. While on it, fix the declarations of CancelRequested (in cancel.c) and cancel_pressed (in psql) to be volatile sig_atomic_t. Previously, both were declared as booleans, which should be fine on modern platforms, but the C standard recommends the use of sig_atomic_t for variables used in signal handlers. Note that since its introduction ina1792320
, CancelRequested declaration was not volatile. Reported-by: Jeff Janes Author: Michael Paquier Discussion: https://postgr.es/m/CAMkU=1zpoUDGKqWKuMWkj7t-bOCaJDx0r=5te_-d0B2HVLABXg@mail.gmail.com
This commit is contained in:
@ -16,7 +16,6 @@
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "fe_utils/cancel.h"
|
||||
@ -37,8 +36,20 @@
|
||||
(void) rc_; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Contains all the information needed to cancel a query issued from
|
||||
* a database connection to the backend.
|
||||
*/
|
||||
static PGcancel *volatile cancelConn = NULL;
|
||||
bool CancelRequested = false;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
volatile sig_atomic_t CancelRequested = false;
|
||||
|
||||
#ifdef WIN32
|
||||
static CRITICAL_SECTION cancelConnLock;
|
||||
|
Reference in New Issue
Block a user