diff options
author | Eli Zaretskii <eliz@gnu.org> | 2013-04-27 14:20:49 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2013-04-27 14:20:49 +0300 |
commit | da7df54309eb759837a289ade900fe8e3d6ddc36 (patch) | |
tree | 18ae26775357fc0e3dc4d9830f62cc8e561a3c2e /main.c | |
parent | f3a4b4ce6f16830b0f2c42b14fe6f955d49eb274 (diff) | |
download | gunmake-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.c | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -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 |