make/tests/scripts/functions
Paul Smith 4da2055a10 Rework output sync to lock a temp file on POSIX
Some POSIX systems do not allow locks to be taken on non-files, such
as pipes.  This is a problem since very often make is invoked with
its stdout redirected to a pipe.  Also, if stdout is redirected to a
file that already has a lock on it for some other reason (perhaps a
shared file such as /dev/null) it can cause a hang.

This means our previous method of locking stdout, although it had some
nice advantages, is not portable enough.  Instead, use a temporary
file and take the lock on that.  We pass the name of the file to child
make processes.  On Windows we continue to use a shared mutex for
output sync.

Remove POSIX emulation functions like fcntl from Windows; instead
follow the lead of the jobserver and create an interface in os.h for
output sync, and move the OS-specific content to posixos.c and
w32os.c.

* NEWS: Add a note.
* src/makeint.h (ALL_SET): Check that all bits are set.
* src/os.h: Add bits for checking the state of stdin/stdout/stderr.
Add prototypes for OS-specific output sync methods.
* src/posixos.c (check_io_state): Determine the status of stdin,
stdout, stderr an return a suite of bits describing them.
(osync_enabled): If the global variable holding the FD of the lock
file (osync_handle) is valid return true.
(osync_setup): Create a temporary file and remember its name in a
global variable (osync_tmpfile), and set osync_handle.
(osync_get_mutex): If output sync is enabled, return the filename
of the lock file prefixed with "fnm:" to denote a filename.
(osync_parse_mutex): If the provided filename has the wrong format
disable output sync.  Else open the lock file and set osync_handle.
(osync_clear): Close osync_handle.  If we're the parent make, then
also unlink the temporary file.
(osync_acquire): Take a lock on the osync_handle descriptor.
(osync_release): Release the lock on the osync_handle descriptor.
(fd_set_append): Add APPEND mode to a file descriptor.
* src/w32/w32os.c: Perform the same actions as posixos.c, copying
the details from src/w32/compat/posixfcn.c.  Use a mutex rather
than locking a temporary file.
* src/output.h: Remove all the OS-specific content.
* src/output.c: Remove all the OS-specific content.
(set_append_mode): Remove and replace with fd_set_append().
(sync_init): Remove and replace with check_io_state().
(acquire_semaphore): Remove and replace with osync_acquire().
(release_semaphore): Remove and replace with osync_release().
(setup_tmpfile): If the IO state is not obtained, get it.  If stdout
and/or stderr are valid, set up a tempfile to capture them.
(output_init): Set io_state if not set already, and check it when
deciding whether to close stdout on exit.
* src/main.c (main): If we're syncing, set up the mutex using the
new osync_setup() / osync_parse_mutex() methods.
(prepare_mutex_handl_string): Replace with osync_parse_mutex().
(die): Call osync_clear().
* src/w32/compat/posixfcn.c: Remove implementations of fcntl(),
record_sync_mutex(), create_mutex(), and same_stream().
2022-08-30 15:44:43 -04:00
..
abspath Add test suite support to Windows 2017-06-04 18:37:20 -04:00
addprefix * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
addsuffix * Various fixes for problems in the 3.79.0.1 pretest. 2000-06-19 21:22:44 +00:00
andor - New code capability: a read-only string cache. Start of solution for 2006-02-10 05:29:00 +00:00
basename * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
call [SV 46995] Strip leading/trailing space from variable names 2016-03-23 01:25:51 -04:00
dir * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
error [SV 46433] Show recipe line offsets in line number messages. 2016-04-11 07:51:05 -04:00
eval tests: Simplify customization of %ENV 2020-04-01 02:02:57 -04:00
file Fix build and test issues on Windows 2021-03-28 16:25:52 -04:00
filter-out [SV 59093] Rewrite filter/filter-out to avoid large stack usage 2020-11-13 00:44:24 -05:00
findstring * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
flavor Implemented the flavor function which returns the flavor of 2005-11-17 07:27:28 +00:00
foreach tests: Simplify customization of %ENV 2020-04-01 02:02:57 -04:00
guile * tests/scripts/function/guile: Valgrind doesn't work with Guile. 2019-09-21 15:38:52 -04:00
if Fix bugs 5798 and 6195. 2003-11-04 07:40:29 +00:00
intcmp * src/function.c (parse_textint): Handle ints without 0 properly. 2022-01-17 19:11:59 -05:00
join * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
let Create $(let ...) providing lexically scoped variables 2020-12-06 18:30:58 -05:00
notdir * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
origin tests: Simplify customization of %ENV 2020-04-01 02:02:57 -04:00
realpath Add test suite support to Windows 2017-06-04 18:37:20 -04:00
shell Rework output sync to lock a temp file on POSIX 2022-08-30 15:44:43 -04:00
sort [SV 46995] Strip leading/trailing space from variable names 2016-03-23 01:25:51 -04:00
strip * Various bug fixes. 2000-04-22 02:11:17 +00:00
substitution Fix some bugs in variable pattern substitution (e.g. $(VAR:A=B)), 2004-09-21 04:00:31 +00:00
suffix * Added the test suite to the main distribution. 1999-09-14 02:03:19 +00:00
value Major updates in preparation for 3.80. 2002-07-08 02:26:47 +00:00
warning [SV 46433] Show recipe line offsets in line number messages. 2016-04-11 07:51:05 -04:00
wildcard * tests/scripts/functions/wildcard: Skip slash tests for local glob. 2019-10-05 17:48:19 -04:00
word Use a well-known error string for out-of-bound function arguments 2021-12-19 16:34:19 -05:00