aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2015-09-30 18:36:31 -0400
committerRobert Haas <rhaas@postgresql.org>2015-09-30 18:42:10 -0400
commit91d97f03ca2a9ed56b322b69dde0392db835f722 (patch)
treed6ebb80e236014c190cd6753278a878be5ac2ba7 /src
parent75096c458aa8e27160112cc20a18fec3a111e4b0 (diff)
downloadpostgresql-91d97f03ca2a9ed56b322b69dde0392db835f722.tar.gz
postgresql-91d97f03ca2a9ed56b322b69dde0392db835f722.zip
Don't dump core when destroying an unused ParallelContext.
If a transaction or subtransaction creates a ParallelContext but ends without calling InitializeParallelDSM, the previous code would seg fault. Fix that.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/parallel.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index f4ba8518b12..29d6ed57cc2 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -513,14 +513,17 @@ DestroyParallelContext(ParallelContext *pcxt)
dlist_delete(&pcxt->node);
/* Kill each worker in turn, and forget their error queues. */
- for (i = 0; i < pcxt->nworkers; ++i)
+ if (pcxt->worker != NULL)
{
- if (pcxt->worker[i].bgwhandle != NULL)
- TerminateBackgroundWorker(pcxt->worker[i].bgwhandle);
- if (pcxt->worker[i].error_mqh != NULL)
+ for (i = 0; i < pcxt->nworkers; ++i)
{
- pfree(pcxt->worker[i].error_mqh);
- pcxt->worker[i].error_mqh = NULL;
+ if (pcxt->worker[i].bgwhandle != NULL)
+ TerminateBackgroundWorker(pcxt->worker[i].bgwhandle);
+ if (pcxt->worker[i].error_mqh != NULL)
+ {
+ pfree(pcxt->worker[i].error_mqh);
+ pcxt->worker[i].error_mqh = NULL;
+ }
}
}
@@ -550,7 +553,7 @@ DestroyParallelContext(ParallelContext *pcxt)
{
BgwHandleStatus status;
- if (pcxt->worker[i].bgwhandle == NULL)
+ if (pcxt->worker == NULL || pcxt->worker[i].bgwhandle == NULL)
continue;
/*