Replace the confusing exit_nicely() by an atexit/on_exit hook
authorPeter Eisentraut
Wed, 6 Apr 2011 20:00:44 +0000 (23:00 +0300)
committerPeter Eisentraut
Wed, 6 Apr 2011 20:00:44 +0000 (23:00 +0300)
contrib/pg_upgrade/check.c
contrib/pg_upgrade/option.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/server.c
contrib/pg_upgrade/util.c

index 1c4847abea1b3b0bf9488db00df722a457b50c8c..05aac8fde9cd5a05c8e351f25b9ab79e0e31eb42 100644 (file)
@@ -131,7 +131,7 @@ report_clusters_compatible(void)
        pg_log(PG_REPORT, "\n*Clusters are compatible*\n");
        /* stops new cluster */
        stop_postmaster(false, false);
-       exit_nicely(false);
+       exit(0);
    }
 
    pg_log(PG_REPORT, "\n"
index c984535461bee10d091c22d48d64db8d4a226e9d..857d6528c8a1fd867f2d8c3c64aede0074518eac 100644 (file)
@@ -77,12 +77,12 @@ parseCommandLine(int argc, char *argv[])
            strcmp(argv[1], "-?") == 0)
        {
            usage();
-           exit_nicely(false);
+           exit(0);
        }
        if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
        {
            pg_log(PG_REPORT, "pg_upgrade " PG_VERSION "\n");
-           exit_nicely(false);
+           exit(0);
        }
    }
 
@@ -125,7 +125,7 @@ parseCommandLine(int argc, char *argv[])
                if ((log_opts.debug_fd = fopen(optarg, "w")) == NULL)
                {
                    pg_log(PG_FATAL, "cannot open debug file\n");
-                   exit_nicely(false);
+                   exit(1);
                }
                break;
 
@@ -141,7 +141,7 @@ parseCommandLine(int argc, char *argv[])
                if ((old_cluster.port = atoi(optarg)) <= 0)
                {
                    pg_log(PG_FATAL, "invalid old port number\n");
-                   exit_nicely(false);
+                   exit(1);
                }
                break;
 
@@ -149,7 +149,7 @@ parseCommandLine(int argc, char *argv[])
                if ((new_cluster.port = atoi(optarg)) <= 0)
                {
                    pg_log(PG_FATAL, "invalid new port number\n");
-                   exit_nicely(false);
+                   exit(1);
                }
                break;
 
index 446195273c1cf307e331c3822a421af8c3e62447..8f72ea80d7ad9eb448a602de1f33b70a362b23f4 100644 (file)
@@ -363,7 +363,6 @@ void        check_for_libpq_envvars(void);
 
 /* util.c */
 
-void       exit_nicely(bool need_cleanup);
 char      *quote_identifier(const char *s);
 int            get_user_info(char **user_name);
 void       check_ok(void);
index 022f69742e5c1db2e9dd652d274a2134c0121164..b0df99cede6120cfe0ca82a35e4ad79cee6e333d 100644 (file)
@@ -23,7 +23,7 @@ static bool test_server_conn(ClusterInfo *cluster, int timeout);
  *
  * Connects to the desired database on the designated server.
  * If the connection attempt fails, this function logs an error
- * message and calls exit_nicely() to kill the program.
+ * message and calls exit() to kill the program.
  */
 PGconn *
 connectToServer(ClusterInfo *cluster, const char *db_name)
@@ -45,7 +45,8 @@ connectToServer(ClusterInfo *cluster, const char *db_name)
        if (conn)
            PQfinish(conn);
 
-       exit_nicely(true);
+       printf("Failure, exiting\n");
+       exit(1);
    }
 
    return conn;
@@ -57,7 +58,7 @@ connectToServer(ClusterInfo *cluster, const char *db_name)
  *
  * Formats a query string from the given arguments and executes the
  * resulting query.  If the query fails, this function logs an error
- * message and calls exit_nicely() to kill the program.
+ * message and calls exit() to kill the program.
  */
 PGresult *
 executeQueryOrDie(PGconn *conn, const char *fmt,...)
@@ -81,8 +82,8 @@ executeQueryOrDie(PGconn *conn, const char *fmt,...)
               PQerrorMessage(conn));
        PQclear(result);
        PQfinish(conn);
-       exit_nicely(true);
-       return NULL;            /* Never get here, but keeps compiler happy */
+       printf("Failure, exiting\n");
+       exit(1);
    }
    else
        return result;
@@ -152,6 +153,18 @@ get_major_server_version(ClusterInfo *cluster)
 }
 
 
+static void
+#ifdef HAVE_ATEXIT
+stop_postmaster_atexit(void)
+#else
+stop_postmaster_on_exit(int exitstatus, void *arg)
+#endif
+{
+   stop_postmaster(true, true);
+
+}
+
+
 void
 start_postmaster(ClusterInfo *cluster, bool quiet)
 {
@@ -159,11 +172,22 @@ start_postmaster(ClusterInfo *cluster, bool quiet)
    const char *bindir;
    const char *datadir;
    unsigned short port;
+   bool        exit_hook_registered = false;
 
    bindir = cluster->bindir;
    datadir = cluster->pgdata;
    port = cluster->port;
 
+   if (!exit_hook_registered)
+   {
+#ifdef HAVE_ATEXIT
+       atexit(stop_postmaster_atexit);
+#else
+       on_exit(stop_postmaster_on_exit);
+#endif
+       exit_hook_registered = true;
+   }
+
    /*
     * On Win32, we can't send both pg_upgrade output and pg_ctl output to the
     * same file because we get the error: "The process cannot access the file
index f957508101382a6065b0b7b9458ee4c52316e920..804aa0d1e5fa2900cdb59cffea565315294fe503 100644 (file)
@@ -99,7 +99,8 @@ pg_log(eLogType type, char *fmt,...)
        case PG_FATAL:
            printf("%s", "\n");
            printf("%s", _(message));
-           exit_nicely(true);
+           printf("Failure, exiting\n");
+           exit(1);
            break;
 
        case PG_DEBUG:
@@ -184,36 +185,6 @@ get_user_info(char **user_name)
 }
 
 
-void
-exit_nicely(bool need_cleanup)
-{
-   stop_postmaster(true, true);
-
-   pg_free(log_opts.filename);
-
-   if (log_opts.fd)
-       fclose(log_opts.fd);
-
-   if (log_opts.debug_fd)
-       fclose(log_opts.debug_fd);
-
-   /* terminate any running instance of postmaster */
-   if (os_info.postmasterPID != 0)
-       kill(os_info.postmasterPID, SIGTERM);
-   
-   if (need_cleanup)
-   {
-       printf("Failure, exiting\n");
-       /*
-        * FIXME must delete intermediate files
-        */
-       exit(1);
-   }
-   else
-       exit(0);
-}
-
-
 void *
 pg_malloc(int n)
 {