From e6dce4e439e1d271dad9a95bc4b94147be2fc39a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 11 Jan 2011 13:41:13 -0500 Subject: [PATCH] Adjust basebackup.c to suppress compiler warnings. Some versions of gcc complain about "variable `tablespaces' might be clobbered by `longjmp' or `vfork'" with the original coding. Fix by moving the PG_TRY block into a separate subroutine. --- src/backend/replication/basebackup.c | 54 +++++++++++++++++----------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index de5fa2209b..2a74c5f831 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -49,7 +49,7 @@ typedef struct /* - * Called when ERROR or FATAL happens in SendBaseBackup() after + * Called when ERROR or FATAL happens in perform_base_backup() after * we have started the backup - make sure we end it! */ static void @@ -58,6 +58,37 @@ base_backup_cleanup(int code, Datum arg) do_pg_abort_backup(); } +/* + * Actually do a base backup for the specified tablespaces. + * + * This is split out mainly to avoid complaints about "variable might be + * clobbered by longjmp" from stupider versions of gcc. + */ +static void +perform_base_backup(const char *backup_label, List *tablespaces) +{ + do_pg_start_backup(backup_label, true); + + PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); + { + ListCell *lc; + + /* Send tablespace header */ + SendBackupHeader(tablespaces); + + /* Send off our tablespaces one by one */ + foreach(lc, tablespaces) + { + tablespaceinfo *ti = (tablespaceinfo *) lfirst(lc); + + SendBackupDirectory(ti->path, ti->oid); + } + } + PG_END_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); + + do_pg_stop_backup(); +} + /* * SendBaseBackup() - send a complete base backup. * @@ -145,26 +176,7 @@ SendBaseBackup(const char *options) } FreeDir(dir); - do_pg_start_backup(backup_label, true); - - PG_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); - { - ListCell *lc; - - /* Send tablespace header */ - SendBackupHeader(tablespaces); - - /* Send off our tablespaces one by one */ - foreach(lc, tablespaces) - { - ti = (tablespaceinfo *) lfirst(lc); - - SendBackupDirectory(ti->path, ti->oid); - } - } - PG_END_ENSURE_ERROR_CLEANUP(base_backup_cleanup, (Datum) 0); - - do_pg_stop_backup(); + perform_base_backup(backup_label, tablespaces); MemoryContextSwitchTo(old_context); MemoryContextDelete(backup_context);