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. */
|
cannot access the jobserver, or NULL if it always can. */
|
||||||
const char *jobserver_get_invalid_auth ();
|
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 ();
|
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 ();
|
unsigned int jobserver_acquire_all ();
|
||||||
|
|
||||||
/* Release a jobserver token. If it fails and is_fatal is 1, fatal. */
|
/* 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. */
|
Return 1 if we got a valid mutex, else 0. */
|
||||||
unsigned int osync_parse_mutex (const char *mutex);
|
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 ();
|
void osync_clear ();
|
||||||
|
|
||||||
/* Acquire the output sync lock. This will wait until available.
|
/* 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. */
|
/* 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. */
|
/* These track the state of the jobserver pipe. Passed to child instances. */
|
||||||
static int job_fds[2] = { -1, -1 };
|
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. */
|
/* When using pselect() we want the read to be non-blocking. */
|
||||||
set_blocking (job_fds[0], 0);
|
set_blocking (job_fds[0], 0);
|
||||||
|
|
||||||
|
job_root = 1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,8 +325,20 @@ jobserver_clear ()
|
||||||
|
|
||||||
job_fds[0] = job_fds[1] = job_rfd = -1;
|
job_fds[0] = job_fds[1] = job_rfd = -1;
|
||||||
|
|
||||||
free (fifo_name);
|
if (fifo_name)
|
||||||
fifo_name = NULL;
|
{
|
||||||
|
if (job_root)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
EINTRLOOP (r, unlink (fifo_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handling_fatal_signal)
|
||||||
|
{
|
||||||
|
free (fifo_name);
|
||||||
|
fifo_name = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
js_type = js_none;
|
js_type = js_none;
|
||||||
}
|
}
|
||||||
|
@ -361,11 +378,10 @@ jobserver_acquire_all ()
|
||||||
++tokens;
|
++tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fifo_name)
|
|
||||||
EINTRLOOP (r, unlink (fifo_name));
|
|
||||||
|
|
||||||
DB (DB_JOBS, ("Acquired all %u jobserver tokens.\n", tokens));
|
DB (DB_JOBS, ("Acquired all %u jobserver tokens.\n", tokens));
|
||||||
|
|
||||||
|
jobserver_clear ();
|
||||||
|
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -608,7 +624,7 @@ static int osync_handle = -1;
|
||||||
|
|
||||||
static char *osync_tmpfile = NULL;
|
static char *osync_tmpfile = NULL;
|
||||||
|
|
||||||
static unsigned int sync_parent = 0;
|
static unsigned int sync_root = 0;
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
osync_enabled ()
|
osync_enabled ()
|
||||||
|
@ -623,7 +639,7 @@ osync_setup ()
|
||||||
if (osync_handle >= 0)
|
if (osync_handle >= 0)
|
||||||
{
|
{
|
||||||
fd_noinherit (osync_handle);
|
fd_noinherit (osync_handle);
|
||||||
sync_parent = 1;
|
sync_root = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,9 +688,11 @@ osync_clear ()
|
||||||
osync_handle = -1;
|
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;
|
osync_tmpfile = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -690,6 +708,7 @@ osync_acquire ()
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_start = 0;
|
fl.l_start = 0;
|
||||||
fl.l_len = 1;
|
fl.l_len = 1;
|
||||||
|
/* We don't want to keep waiting on EINTR. */
|
||||||
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
||||||
{
|
{
|
||||||
perror ("fcntl()");
|
perror ("fcntl()");
|
||||||
|
@ -711,6 +730,7 @@ osync_release ()
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_start = 0;
|
fl.l_start = 0;
|
||||||
fl.l_len = 1;
|
fl.l_len = 1;
|
||||||
|
/* We don't want to keep waiting on EINTR. */
|
||||||
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
if (fcntl (osync_handle, F_SETLKW, &fl) == -1)
|
||||||
perror ("fcntl()");
|
perror ("fcntl()");
|
||||||
}
|
}
|
||||||
|
@ -734,7 +754,7 @@ get_bad_stdin ()
|
||||||
if (pipe (pd) == 0)
|
if (pipe (pd) == 0)
|
||||||
{
|
{
|
||||||
/* Close the write side. */
|
/* Close the write side. */
|
||||||
(void) close (pd[1]);
|
close (pd[1]);
|
||||||
/* Save the read side. */
|
/* Save the read side. */
|
||||||
bad_stdin = pd[0];
|
bad_stdin = pd[0];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue