mirror of
https://git.savannah.gnu.org/git/make.git
synced 2024-11-25 04:35:44 +00:00
* src/posixos.c (job_root): Remember root jobserver instances
(jobserver_setup): Set job_root to true. (jobserver_clear): if we're the root instance and we're using a FIFO, unlink it. If we're not in a signal handler, free memory. (jobserver_acquire_all): Call jobserver_clear(). (sync_root): Rename from sync_parent for consistency.
This commit is contained in:
parent
01b1d4f401
commit
383eb3a923
2 changed files with 36 additions and 13 deletions
9
src/os.h
9
src/os.h
|
@ -67,10 +67,12 @@ char *jobserver_get_auth ();
|
|||
cannot access the jobserver, or NULL if it always can. */
|
||||
const char *jobserver_get_invalid_auth ();
|
||||
|
||||
/* Clear this instance's jobserver configuration. */
|
||||
/* Clear this instance's jobserver configuration.
|
||||
This method might be invoked from a signal handler. */
|
||||
void jobserver_clear ();
|
||||
|
||||
/* Recover all the jobserver tokens and return the number we got. */
|
||||
/* Recover all the jobserver tokens and return the number we got.
|
||||
Will also run jobserver_clear() as a side-effect. */
|
||||
unsigned int jobserver_acquire_all ();
|
||||
|
||||
/* Release a jobserver token. If it fails and is_fatal is 1, fatal. */
|
||||
|
@ -129,7 +131,8 @@ char *osync_get_mutex ();
|
|||
Return 1 if we got a valid mutex, else 0. */
|
||||
unsigned int osync_parse_mutex (const char *mutex);
|
||||
|
||||
/* Clean up this instance's output sync facilities. */
|
||||
/* Clean up this instance's output sync facilities.
|
||||
This method might be invoked from a signal handler. */
|
||||
void osync_clear ();
|
||||
|
||||
/* Acquire the output sync lock. This will wait until available.
|
||||
|
|
|
@ -75,6 +75,9 @@ check_io_state ()
|
|||
|
||||
/* This section provides OS-specific functions to support the jobserver. */
|
||||
|
||||
/* True if this is the root make instance. */
|
||||
static unsigned char job_root = 0;
|
||||
|
||||
/* These track the state of the jobserver pipe. Passed to child instances. */
|
||||
static int job_fds[2] = { -1, -1 };
|
||||
|
||||
|
@ -198,6 +201,8 @@ jobserver_setup (int slots, const char *style)
|
|||
/* When using pselect() we want the read to be non-blocking. */
|
||||
set_blocking (job_fds[0], 0);
|
||||
|
||||
job_root = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -320,8 +325,20 @@ jobserver_clear ()
|
|||
|
||||
job_fds[0] = job_fds[1] = job_rfd = -1;
|
||||
|
||||
free (fifo_name);
|
||||
fifo_name = NULL;
|
||||
if (fifo_name)
|
||||
{
|
||||
if (job_root)
|
||||
{
|
||||
int r;
|
||||
EINTRLOOP (r, unlink (fifo_name));
|
||||
}
|
||||
|
||||
if (!handling_fatal_signal)
|
||||
{
|
||||
free (fifo_name);
|
||||
fifo_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
js_type = js_none;
|
||||
}
|
||||
|
@ -361,11 +378,10 @@ jobserver_acquire_all ()
|
|||
++tokens;
|
||||
}
|
||||
|
||||
if (fifo_name)
|
||||
EINTRLOOP (r, unlink (fifo_name));
|
||||
|
||||
DB (DB_JOBS, ("Acquired all %u jobserver tokens.\n", tokens));
|
||||
|
||||
jobserver_clear ();
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
|
@ -608,7 +624,7 @@ static int osync_handle = -1;
|
|||
|
||||
static char *osync_tmpfile = NULL;
|
||||
|
||||
static unsigned int sync_parent = 0;
|
||||
static unsigned int sync_root = 0;
|
||||
|
||||
unsigned int
|
||||
osync_enabled ()
|
||||
|
@ -623,7 +639,7 @@ osync_setup ()
|
|||
if (osync_handle >= 0)
|
||||
{
|
||||
fd_noinherit (osync_handle);
|
||||
sync_parent = 1;
|
||||
sync_root = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -672,9 +688,11 @@ osync_clear ()
|
|||
osync_handle = -1;
|
||||
}
|
||||
|
||||
if (sync_parent && osync_tmpfile)
|
||||
if (sync_root && osync_tmpfile)
|
||||
{
|
||||
unlink (osync_tmpfile);
|
||||
int r;
|
||||
|
||||
EINTRLOOP (r, unlink (osync_tmpfile));
|
||||
osync_tmpfile = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -690,6 +708,7 @@ osync_acquire ()
|
|||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 1;
|
||||
/* We don't want to keep waiting on EINTR. */
|
||||
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
||||
{
|
||||
perror ("fcntl()");
|
||||
|
@ -711,6 +730,7 @@ osync_release ()
|
|||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 1;
|
||||
/* We don't want to keep waiting on EINTR. */
|
||||
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
||||
perror ("fcntl()");
|
||||
}
|
||||
|
@ -734,7 +754,7 @@ get_bad_stdin ()
|
|||
if (pipe (pd) == 0)
|
||||
{
|
||||
/* Close the write side. */
|
||||
(void) close (pd[1]);
|
||||
close (pd[1]);
|
||||
/* Save the read side. */
|
||||
bad_stdin = pd[0];
|
||||
|
||||
|
|
Loading…
Reference in a new issue