isolationtester: Use atexit()

Replace exit_nicely() calls with standard exit() and register the
cleanup actions using atexit().

Reviewed-by: Alvaro Herrera <alvherre@2ndquadrant.com>
Discussion: https://www.postgresql.org/message-id/flat/ec4135ba-84e9-28bf-b584-0e78d47448d5@2ndquadrant.com/
This commit is contained in:
Peter Eisentraut 2019-01-05 15:05:49 +01:00
parent 3913a40ff1
commit be2e329f2e
1 changed files with 19 additions and 23 deletions

View File

@ -32,7 +32,6 @@ static int nconns = 0;
/* In dry run only output permutations to be run by the tester. */
static int dry_run = false;
static void exit_nicely(void) pg_attribute_noreturn();
static void run_testspec(TestSpec *testspec);
static void run_all_permutations(TestSpec *testspec);
static void run_all_permutations_recurse(TestSpec *testspec, int nsteps,
@ -51,15 +50,14 @@ static void printResultSet(PGresult *res);
static void isotesterNoticeProcessor(void *arg, const char *message);
static void blackholeNoticeProcessor(void *arg, const char *message);
/* close all connections and exit */
static void
exit_nicely(void)
disconnect_atexit(void)
{
int i;
for (i = 0; i < nconns; i++)
PQfinish(conns[i]);
exit(1);
if (conns[i])
PQfinish(conns[i]);
}
int
@ -140,7 +138,7 @@ main(int argc, char **argv)
{
fprintf(stderr, "duplicate step name: %s\n",
testspec->allsteps[i]->name);
exit_nicely();
exit(1);
}
}
@ -162,6 +160,7 @@ main(int argc, char **argv)
*/
nconns = 1 + testspec->nsessions;
conns = calloc(nconns, sizeof(PGconn *));
atexit(disconnect_atexit);
backend_pids = calloc(nconns, sizeof(*backend_pids));
for (i = 0; i < nconns; i++)
{
@ -170,7 +169,7 @@ main(int argc, char **argv)
{
fprintf(stderr, "Connection %d to database failed: %s",
i, PQerrorMessage(conns[i]));
exit_nicely();
exit(1);
}
/*
@ -196,7 +195,7 @@ main(int argc, char **argv)
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "message level setup failed: %s", PQerrorMessage(conns[i]));
exit_nicely();
exit(1);
}
PQclear(res);
@ -210,14 +209,14 @@ main(int argc, char **argv)
{
fprintf(stderr, "backend pid query returned %d rows and %d columns, expected 1 row and 1 column",
PQntuples(res), PQnfields(res));
exit_nicely();
exit(1);
}
}
else
{
fprintf(stderr, "backend pid query failed: %s",
PQerrorMessage(conns[i]));
exit_nicely();
exit(1);
}
PQclear(res);
}
@ -254,7 +253,7 @@ main(int argc, char **argv)
{
fprintf(stderr, "prepare of lock wait query failed: %s",
PQerrorMessage(conns[0]));
exit_nicely();
exit(1);
}
PQclear(res);
termPQExpBuffer(&wait_query);
@ -265,9 +264,6 @@ main(int argc, char **argv)
*/
run_testspec(testspec);
/* Clean up and exit */
for (i = 0; i < nconns; i++)
PQfinish(conns[i]);
return 0;
}
@ -375,7 +371,7 @@ run_named_permutations(TestSpec *testspec)
{
fprintf(stderr, "undefined step \"%s\" specified in permutation\n",
p->stepnames[j]);
exit_nicely();
exit(1);
}
steps[j] = *this;
}
@ -510,7 +506,7 @@ run_permutation(TestSpec *testspec, int nsteps, Step **steps)
else if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "setup failed: %s", PQerrorMessage(conns[0]));
exit_nicely();
exit(1);
}
PQclear(res);
}
@ -530,7 +526,7 @@ run_permutation(TestSpec *testspec, int nsteps, Step **steps)
fprintf(stderr, "setup of session %s failed: %s",
testspec->sessions[i]->name,
PQerrorMessage(conns[i + 1]));
exit_nicely();
exit(1);
}
PQclear(res);
}
@ -612,7 +608,7 @@ run_permutation(TestSpec *testspec, int nsteps, Step **steps)
{
fprintf(stdout, "failed to send query for step %s: %s\n",
step->name, PQerrorMessage(conn));
exit_nicely();
exit(1);
}
/* Try to complete this step without blocking. */
@ -723,7 +719,7 @@ try_complete_step(Step *step, int flags)
if (sock < 0)
{
fprintf(stderr, "invalid socket: %s", PQerrorMessage(conn));
exit_nicely();
exit(1);
}
gettimeofday(&start_time, NULL);
@ -741,7 +737,7 @@ try_complete_step(Step *step, int flags)
if (errno == EINTR)
continue;
fprintf(stderr, "select failed: %s\n", strerror(errno));
exit_nicely();
exit(1);
}
else if (ret == 0) /* select() timeout: check for lock wait */
{
@ -761,7 +757,7 @@ try_complete_step(Step *step, int flags)
{
fprintf(stderr, "lock wait query failed: %s",
PQerrorMessage(conns[0]));
exit_nicely();
exit(1);
}
waiting = ((PQgetvalue(res, 0, 0))[0] == 't');
PQclear(res);
@ -818,14 +814,14 @@ try_complete_step(Step *step, int flags)
{
fprintf(stderr, "step %s timed out after 200 seconds\n",
step->name);
exit_nicely();
exit(1);
}
}
else if (!PQconsumeInput(conn)) /* select(): data available */
{
fprintf(stderr, "PQconsumeInput failed: %s\n",
PQerrorMessage(conn));
exit_nicely();
exit(1);
}
}