diff options
Diffstat (limited to 'job.h')
-rw-r--r-- | job.h | 116 |
1 files changed, 83 insertions, 33 deletions
@@ -1,7 +1,5 @@ /* Definitions for managing subprocesses in GNU Make. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -Foundation, Inc. +Copyright (C) 1992-2013 Free Software Foundation, Inc. This file is part of GNU Make. GNU Make is free software; you can redistribute it and/or modify it under the @@ -16,8 +14,7 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef SEEN_JOB_H -#define SEEN_JOB_H +#include "output.h" #ifdef HAVE_FCNTL_H # include <fcntl.h> @@ -28,7 +25,11 @@ this program. If not, see <http://www.gnu.org/licenses/>. */ /* How to set close-on-exec for a file descriptor. */ #if !defined F_SETFD -# define CLOSE_ON_EXEC(_d) +# ifdef WINDOWS32 +# define CLOSE_ON_EXEC(_d) process_noinherit(_d) +# else +# define CLOSE_ON_EXEC(_d) +# endif #else # ifndef FD_CLOEXEC # define FD_CLOEXEC 1 @@ -36,34 +37,78 @@ this program. If not, see <http://www.gnu.org/licenses/>. */ # define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC) #endif +#ifdef NO_OUTPUT_SYNC +# define RECORD_SYNC_MUTEX(m) \ + error (NILF, \ + _("-O[TYPE] (--output-sync[=TYPE]) is not configured for this build.")); +#else +# ifdef WINDOWS32 +/* For emulations in w32/compat/posixfcn.c. */ +# define F_GETFD 1 +# define F_SETLKW 2 +/* Implementation note: None of the values of l_type below can be zero + -- they are compared with a static instance of the struct, so zero + means unknown/invalid, see w32/compat/posixfcn.c. */ +# define F_WRLCK 1 +# define F_UNLCK 2 + +struct flock + { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; + }; + +/* This type is actually a HANDLE, but we want to avoid including + windows.h as much as possible. */ +typedef intptr_t sync_handle_t; + +/* Public functions emulated/provided in posixfcn.c. */ +int fcntl (intptr_t fd, int cmd, ...); +intptr_t create_mutex (void); +int same_stream (FILE *f1, FILE *f2); + +# define RECORD_SYNC_MUTEX(m) record_sync_mutex(m) +void record_sync_mutex (const char *str); +void prepare_mutex_handle_string (intptr_t hdl); +# else /* !WINDOWS32 */ + +typedef int sync_handle_t; /* file descriptor */ + +# define RECORD_SYNC_MUTEX(m) (void)(m) + +# endif +#endif /* !NO_OUTPUT_SYNC */ + /* Structure describing a running or dead child process. */ struct child { - struct child *next; /* Link in the chain. */ - - struct file *file; /* File being remade. */ + struct child *next; /* Link in the chain. */ - char **environment; /* Environment for commands. */ + struct file *file; /* File being remade. */ - char **command_lines; /* Array of variable-expanded cmd lines. */ - unsigned int command_line; /* Index into above. */ - char *command_ptr; /* Ptr into command_lines[command_line]. */ + char **environment; /* Environment for commands. */ + char *sh_batch_file; /* Script file for shell commands */ + char **command_lines; /* Array of variable-expanded cmd lines. */ + char *command_ptr; /* Ptr into command_lines[command_line]. */ - pid_t pid; /* Child process's ID number. */ #ifdef VMS - int efn; /* Completion event flag number */ - int cstatus; /* Completion status */ char *comname; /* Temporary command file name */ + int efn; /* Completion event flag number */ + int cstatus; /* Completion status */ #endif - char *sh_batch_file; /* Script file for shell commands */ - unsigned int remote:1; /* Nonzero if executing remotely. */ - unsigned int noerror:1; /* Nonzero if commands contained a `-'. */ - - unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ - unsigned int deleted:1; /* Nonzero if targets have been deleted. */ - unsigned int dontcare:1; /* Saved dontcare flag. */ + unsigned int command_line; /* Index into command_lines. */ + struct output output; /* Output for this child. */ + pid_t pid; /* Child process's ID number. */ + unsigned int remote:1; /* Nonzero if executing remotely. */ + unsigned int noerror:1; /* Nonzero if commands contained a '-'. */ + unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ + unsigned int deleted:1; /* Nonzero if targets have been deleted. */ + unsigned int dontcare:1; /* Saved dontcare flag. */ }; extern struct child *children; @@ -77,17 +122,24 @@ char **construct_command_argv (char *line, char **restp, struct file *file, int cmd_flags, char** batch_file); #ifdef VMS int child_execute_job (char *argv, struct child *child); -#elif defined(__EMX__) -int child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); #else -void child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); +# define FD_STDIN (fileno (stdin)) +# define FD_STDOUT (fileno (stdout)) +# define FD_STDERR (fileno (stderr)) +# if defined(__EMX__) +int child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp); +# else +void child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, + char **argv, char **envp) __attribute__ ((noreturn)); +# endif #endif #ifdef _AMIGA -void exec_command (char **argv); +void exec_command (char **argv) __attribute__ ((noreturn)); #elif defined(__EMX__) int exec_command (char **argv, char **envp); #else -void exec_command (char **argv, char **envp); +void exec_command (char **argv, char **envp) __attribute__ ((noreturn)); #endif extern unsigned int job_slots_used; @@ -96,14 +148,12 @@ void block_sigs (void); #ifdef POSIX void unblock_sigs (void); #else -#ifdef HAVE_SIGSETMASK +#ifdef HAVE_SIGSETMASK extern int fatal_signal_mask; -#define unblock_sigs() sigsetmask (0) +#define unblock_sigs() sigsetmask (0) #else -#define unblock_sigs() +#define unblock_sigs() #endif #endif extern unsigned int jobserver_tokens; - -#endif /* SEEN_JOB_H */ |