summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-04-27 14:20:49 +0300
committerEli Zaretskii <eliz@gnu.org>2013-04-27 14:20:49 +0300
commitda7df54309eb759837a289ade900fe8e3d6ddc36 (patch)
tree18ae26775357fc0e3dc4d9830f62cc8e561a3c2e /main.c
parentf3a4b4ce6f16830b0f2c42b14fe6f955d49eb274 (diff)
downloadgunmake-da7df54309eb759837a289ade900fe8e3d6ddc36.tar.gz
Support --output-sync on MS-Windows.
w32/compat/posixfcn.c: New file, with emulations of Posix functions and Posix functionality for MS-Windows. w32/subproc/sub_proc.c: Include io.h. (process_noinherit): New function, forces a file descriptor to not be inherited by child processes. (process_easy): Accept two additional arguments, and use them to set up the standard output and standard error handles of the child process. w32/include/sub_proc.h (process_easy): Adjust prototype. (process_noinherit): Add prototype. read.c [WINDOWS32]: Include windows.h and sub_proc.h. makeint.h (LOCALEDIR) [WINDOWS32}: Define to NULL if not defined. This is needed because the MS-Windows build doesn't have a canonical place for LOCALEDIR. (WIN32_LEAN_AND_MEAN) [WINDOWS32]: Define, to avoid getting from windows.h header too much stuff that could conflict with the code. main.c <sync_mutex>: New static variable. <switches>: Add support for "--sync-mutex" switch. (decode_output_sync_flags): Decode the --sync-mutex= switch. (prepare_mutex_handle_string) [WINDOWS32]: New function. (main): Add "output-sync" to .FEATURES. job.h (CLOSE_ON_EXEC) [WINDOWS32]: Define to call process_noinherit. (F_GETFD, F_SETLKW, F_WRLCK, F_UNLCK, struct flock) [WINDOWS32]: New macros. (RECORD_SYNC_MUTEX): New macro, a no-op for Posix platforms. (sync_handle_t): New typedef. job.c <sync_handle>: Change type to sync_handle_t. (FD_NOT_EMPTY): Seek to the file's end. Suggested by Frank Heckenbach <f.heckenbach@fh-soft.de>. (pump_from_tmp_fd) [WINDOWS32]: Switch to_fd to binary mode for the duration of this function, and then change back before returning. (start_job_command) [WINDOWS32]: Support output_sync mode on MS-Windows. Use a system-wide mutex instead of locking stdout/stderr. Call process_easy with two additional arguments: child->outfd and child->errfd. (exec_command) [WINDOWS32]: Pass two additional arguments, both -1, to process_easy, to adjust for the changed function signature. function.c (windows32_openpipe) [WINDOWS32]: This function now returns an int, which is -1 if it fails and zero otherwise. It also calls 'error' instead of 'fatal', to avoid exiting prematurely. (func_shell_base) [WINDOWS32]: Call perror_with_name if windows32_openpipe fails, now that it always returns. This avoids a compiler warning that error_prefix is not used in the MS-Windows build. config.h.W32.template (OUTPUT_SYNC): Define. build_w32.bat: Add w32/compat/posixfcn.c to compilation and linking commands. From Frank Heckenbach <f.heckenbach@fh-soft.de>: job.c (sync_output): Don't discard the output if acquire_semaphore fails; instead, dump the output unsynchronized.
Diffstat (limited to 'main.c')
-rw-r--r--main.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/main.c b/main.c
index 8a69683..0037587 100644
--- a/main.c
+++ b/main.c
@@ -239,6 +239,11 @@ static struct stringlist *jobserver_fds = 0;
int job_fds[2] = { -1, -1 };
int job_rfd = -1;
+/* Handle for the mutex used on Windows to synchronize output of our
+ children under -O. */
+
+static struct stringlist *sync_mutex = 0;
+
/* Maximum load average at which multiple jobs will be run.
Negative values mean unlimited, while zero means limit to
zero load (which could be useful to start infinite jobs remotely
@@ -415,6 +420,7 @@ static const struct command_switch switches[] =
{ 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print" },
{ 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file" },
{ 'O', string, &output_sync_option, 1, 1, 0, "target", 0, "output-sync" },
+ { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, "sync-mutex" },
{ 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base" },
{ 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question" },
{ 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules" },
@@ -696,9 +702,47 @@ decode_output_sync_flags (void)
else
fatal (NILF, _("unknown output-sync type '%s'"), p);
}
+
+ if (sync_mutex)
+ {
+ const char *mp;
+ unsigned int idx;
+
+ for (idx = 1; idx < sync_mutex->idx; idx++)
+ if (!streq (sync_mutex->list[0], sync_mutex->list[idx]))
+ fatal (NILF, _("internal error: multiple --sync-mutex options"));
+
+ /* Now parse the mutex handle string. */
+ mp = sync_mutex->list[0];
+ RECORD_SYNC_MUTEX (mp);
+ }
}
#ifdef WINDOWS32
+
+/* This is called from start_job_command when it detects that
+ output_sync option is in effect. The handle to the synchronization
+ mutex is passed, as a string, to sub-makes via the --sync-mutex
+ command-line argument. */
+void
+prepare_mutex_handle_string (sync_handle_t handle)
+{
+ if (!sync_mutex)
+ {
+ /* 2 hex digits per byte + 2 characters for "0x" + null. */
+ char hdl_string[2 * sizeof (sync_handle_t) + 2 + 1];
+
+ /* Prepare the mutex handle string for our children. */
+ sprintf (hdl_string, "0x%x", handle);
+ sync_mutex = xmalloc (sizeof (struct stringlist));
+ sync_mutex->list = xmalloc (sizeof (char *));
+ sync_mutex->list[0] = xstrdup (hdl_string);
+ sync_mutex->idx = 1;
+ sync_mutex->max = 1;
+ define_makeflags (1, 0);
+ }
+}
+
/*
* HANDLE runtime exceptions by avoiding a requestor on the GUI. Capture
* exception and print it to stderr instead.
@@ -1137,6 +1181,9 @@ main (int argc, char **argv, char **envp)
#ifdef MAKE_JOBSERVER
" jobserver"
#endif
+#ifdef OUTPUT_SYNC
+ " output-sync"
+#endif
#ifdef MAKE_SYMLINKS
" check-symlink"
#endif