mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
From: Tom Lane <tgl@sss.pgh.pa.us>
Making PQrequestCancel safe to call in a signal handler turned out to be much easier than I feared. So here are the diffs. Some notes: * I modified the postmaster's packet "iodone" callback interface to allow the callback routine to return a continue-or-drop-connection return code; this was necessary to allow the connection to be closed after receiving a Cancel, rather than proceeding to launch a new backend... Being a neatnik, I also made the iodone proc have a typechecked parameter list. * I deleted all code I could find that had to do with OOB. * I made some edits to ensure that all signals mentioned in the code are referred to symbolically not by numbers ("SIGUSR2" not "2"). I think Bruce may have already done at least some of the same edits; I hope that merging these patches is not too painful.
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.55 1998/07/03 04:24:13 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.56 1998/07/09 03:29:08 scrappy Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -361,6 +361,16 @@ parseInput(PGconn *conn)
|
||||
PGRES_EMPTY_QUERY);
|
||||
conn->asyncStatus = PGASYNC_READY;
|
||||
break;
|
||||
case 'K': /* secret key data from the backend */
|
||||
/* This is expected only during backend startup,
|
||||
* but it's just as easy to handle it as part of the
|
||||
* main loop. Save the data and continue processing.
|
||||
*/
|
||||
if (pqGetInt(&(conn->be_pid), 4, conn))
|
||||
return;
|
||||
if (pqGetInt(&(conn->be_key), 4, conn))
|
||||
return;
|
||||
break;
|
||||
case 'N': /* notices from the backend */
|
||||
if (getNotice(conn))
|
||||
return;
|
||||
@ -761,44 +771,6 @@ PQexec(PGconn *conn, const char *query)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Attempt to request cancellation of the current operation.
|
||||
*
|
||||
* The return value is TRUE if the cancel request was successfully
|
||||
* dispatched, FALSE if not (in which case errorMessage is set).
|
||||
* Note: successful dispatch is no guarantee that there will be any effect at
|
||||
* the backend. The application must read the operation result as usual.
|
||||
*/
|
||||
|
||||
int
|
||||
PQrequestCancel(PGconn *conn)
|
||||
{
|
||||
char msg[1];
|
||||
|
||||
if (!conn)
|
||||
return FALSE;
|
||||
|
||||
if (conn->sock < 0)
|
||||
{
|
||||
sprintf(conn->errorMessage,
|
||||
"PQrequestCancel() -- connection is not open\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
msg[0] = '\0';
|
||||
|
||||
if (send(conn->sock, msg, 1, MSG_OOB) < 0)
|
||||
{
|
||||
sprintf(conn->errorMessage,
|
||||
"PQrequestCancel() -- couldn't send OOB data: errno=%d\n%s\n",
|
||||
errno, strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Attempt to read a Notice response message.
|
||||
* This is possible in several places, so we break it out as a subroutine.
|
||||
|
Reference in New Issue
Block a user