pg_upgrade: fix initialization of thread argument
authorBruce Momjian
Thu, 25 Jul 2013 02:01:14 +0000 (22:01 -0400)
committerBruce Momjian
Thu, 25 Jul 2013 02:01:31 +0000 (22:01 -0400)
Reorder initialization of thread argument marker to it happens before
reap_child() is called.
Backpatch to 9.3.

contrib/pg_upgrade/parallel.c

index caeebcd9d0797639268340f424d3a4a4e610be7f..38ded518329cc6e714d4f62c4ece8c330f188baa 100644 (file)
@@ -87,6 +87,24 @@ parallel_exec_prog(const char *log_file, const char *opt_log_file,
    {
        /* parallel */
 #ifdef WIN32
+       if (thread_handles == NULL)
+           thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+       if (exec_thread_args == NULL)
+       {
+           int         i;
+
+           exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
+
+           /*
+            * For safety and performance, we keep the args allocated during
+            * the entire life of the process, and we don't free the args in a
+            * thread different from the one that allocated it.
+            */
+           for (i = 0; i < user_opts.jobs; i++)
+               exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
+       }
+
        cur_thread_args = (void **) exec_thread_args;
 #endif
        /* harvest any dead children */
@@ -112,24 +130,6 @@ parallel_exec_prog(const char *log_file, const char *opt_log_file,
            /* fork failed */
            pg_log(PG_FATAL, "could not create worker process: %s\n", strerror(errno));
 #else
-       if (thread_handles == NULL)
-           thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
-
-       if (exec_thread_args == NULL)
-       {
-           int         i;
-
-           exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
-
-           /*
-            * For safety and performance, we keep the args allocated during
-            * the entire life of the process, and we don't free the args in a
-            * thread different from the one that allocated it.
-            */
-           for (i = 0; i < user_opts.jobs; i++)
-               exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
-       }
-
        /* use first empty array element */
        new_arg = exec_thread_args[parallel_jobs - 1];
 
@@ -196,6 +196,24 @@ parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
    {
        /* parallel */
 #ifdef WIN32
+       if (thread_handles == NULL)
+           thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+       if (transfer_thread_args == NULL)
+       {
+           int         i;
+
+           transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
+
+           /*
+            * For safety and performance, we keep the args allocated during
+            * the entire life of the process, and we don't free the args in a
+            * thread different from the one that allocated it.
+            */
+           for (i = 0; i < user_opts.jobs; i++)
+               transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
+       }
+
        cur_thread_args = (void **) transfer_thread_args;
 #endif
        /* harvest any dead children */
@@ -226,24 +244,6 @@ parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
            /* fork failed */
            pg_log(PG_FATAL, "could not create worker process: %s\n", strerror(errno));
 #else
-       if (thread_handles == NULL)
-           thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
-
-       if (transfer_thread_args == NULL)
-       {
-           int         i;
-
-           transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
-
-           /*
-            * For safety and performance, we keep the args allocated during
-            * the entire life of the process, and we don't free the args in a
-            * thread different from the one that allocated it.
-            */
-           for (i = 0; i < user_opts.jobs; i++)
-               transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
-       }
-
        /* use first empty array element */
        new_arg = transfer_thread_args[parallel_jobs - 1];