Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bmake inefficiencies
On 2/5/21, Simon J. Gerraty <sjg%juniper.net@localhost> wrote:
> Mateusz Guzik <mjguzik%gmail.com@localhost> wrote:
>> >> is the signal stuff really necessary?
>> >
>> > It avoids the need to loop dealing with interupts.
>> > The name seems missleading should be block not lock.
>> >
>>
>> I know what it does, it popped up on truss.
>>
>> My point is that there are no callers of mkTempFile from a signal
>> handler (and would argue if any were present, they should be fixed)
>> and the DEBUG stuff seems to only be set at startup time. iow i don't
>> see any relevance of signal handling to this code.
>
> The open in mkstemp can fail due to EINTR.
> That's the only reason I see for blocking signals.
>
Ok, I did not get this bit.
> The patch below eliminates the strdup in mkTempFile
> and adds a Job_TempFile so meta.c can get the signal blocking too when
> needed.
>
Why keep calling eunlink instead of unlink?
More importantly though, folding all of this into one routine will
facilitate using O_TMPFILE. It's a Linux-specific (for now) flag to
create a file without having to supply a random pattern (and having to
unlink it later, like you do here).
> diff -r 19c080e3f296 bmake/job.c
> --- a/bmake/job.c Mon Feb 01 10:44:48 2021 -0800
> +++ b/bmake/job.c Fri Feb 05 10:16:20 2021 -0800
> @@ -1586,8 +1586,7 @@
> * are put. It is removed before the child shell is executed,
> * unless DEBUG(SCRIPT) is set.
> */
> - char *tfile;
> - sigset_t mask;
> + char tfile[MAXPATHLEN];
> int tfd; /* File descriptor to the temp file */
>
> /*
> @@ -1599,11 +1598,9 @@
> DieHorribly();
> }
>
> - JobSigLock(&mask);
> - tfd = mkTempFile(TMPPAT, &tfile);
> + tfd = Job_TempFile(TMPPAT, tfile, sizeof tfile);
> if (!DEBUG(SCRIPT))
> - (void)eunlink(tfile);
> - JobSigUnlock(&mask);
> + eunlink(tfile);
>
> job->cmdFILE = fdopen(tfd, "w+");
> if (job->cmdFILE == NULL)
> @@ -1620,8 +1617,6 @@
> #endif
>
> *out_run = JobPrintCommands(job);
> -
> - free(tfile);
> }
>
> /*
> @@ -2796,6 +2791,20 @@
> continue;
> }
>
> +/* Get a temp file */
> +int
> +Job_TempFile(const char *pattern, char *tfile, size_t tfile_sz)
> +{
> + int fd;
> + sigset_t mask;
> +
> + JobSigLock(&mask);
> + fd = mkTempFile(pattern, tfile, tfile_sz);
> + JobSigUnlock(&mask);
> +
> + return fd;
> +}
> +
> /* Prep the job token pipe in the root make process. */
> void
> Job_ServerStart(int max_tokens, int jp_0, int jp_1)
> diff -r 19c080e3f296 bmake/job.h
> --- a/bmake/job.h Mon Feb 01 10:44:48 2021 -0800
> +++ b/bmake/job.h Fri Feb 05 10:16:20 2021 -0800
> @@ -205,5 +205,6 @@
> void Job_SetPrefix(void);
> Boolean Job_RunTarget(const char *, const char *);
> void Job_FlagsToString(const Job *, char *, size_t);
> +int Job_TempFile(const char *, char *, size_t);
>
> #endif /* MAKE_JOB_H */
> diff -r 19c080e3f296 bmake/main.c
> --- a/bmake/main.c Mon Feb 01 10:44:48 2021 -0800
> +++ b/bmake/main.c Fri Feb 05 10:16:20 2021 -0800
> @@ -2245,27 +2245,29 @@
> * Otherwise unlink the file once open.
> */
> int
> -mkTempFile(const char *pattern, char **out_fname)
> +mkTempFile(const char *pattern, char *tfile, size_t tfile_sz)
> {
> static char *tmpdir = NULL;
> - char tfile[MAXPATHLEN];
> + char tbuf[MAXPATHLEN];
> int fd;
>
> if (pattern == NULL)
> pattern = TMPPAT;
> if (tmpdir == NULL)
> tmpdir = getTmpdir();
> + if (tfile == NULL) {
> + tfile = tbuf;
> + tfile_sz = sizeof tbuf;
> + }
> if (pattern[0] == '/') {
> - snprintf(tfile, sizeof tfile, "%s", pattern);
> + snprintf(tfile, tfile_sz, "%s", pattern);
> } else {
> - snprintf(tfile, sizeof tfile, "%s%s", tmpdir, pattern);
> + snprintf(tfile, tfile_sz, "%s%s", tmpdir, pattern);
> }
> if ((fd = mkstemp(tfile)) < 0)
> Punt("Could not create temporary file %s: %s", tfile,
> strerror(errno));
> - if (out_fname != NULL) {
> - *out_fname = bmake_strdup(tfile);
> - } else {
> + if (tfile == tbuf) {
> unlink(tfile); /* we just want the descriptor */
> }
> return fd;
> diff -r 19c080e3f296 bmake/make.h
> --- a/bmake/make.h Mon Feb 01 10:44:48 2021 -0800
> +++ b/bmake/make.h Fri Feb 05 10:16:20 2021 -0800
> @@ -727,7 +727,7 @@
> void PrintOnError(GNode *, const char *);
> void Main_ExportMAKEFLAGS(Boolean);
> Boolean Main_SetObjdir(Boolean, const char *, ...) MAKE_ATTR_PRINTFLIKE(2,
> 3);
> -int mkTempFile(const char *, char **);
> +int mkTempFile(const char *, char *, size_t);
> int str2Lst_Append(StringList *, char *);
> int getInt(const char *, int);
> void GNode_FprintDetails(FILE *, const char *, const GNode *, const char
> *);
> diff -r 19c080e3f296 bmake/meta.c
> --- a/bmake/meta.c Mon Feb 01 10:44:48 2021 -0800
> +++ b/bmake/meta.c Fri Feb 05 10:16:20 2021 -0800
> @@ -144,7 +144,10 @@
> * cwd causing getcwd to do a lot more work.
> * We only care about the descriptor.
> */
> - pbm->mon_fd = mkTempFile("filemon.XXXXXX", NULL);
> + if (!opts.compatMake)
> + pbm->mon_fd = Job_TempFile("filemon.XXXXXX", NULL, 0);
> + else
> + pbm->mon_fd = mkTempFile("filemon.XXXXXX", NULL, 0);
> if ((dupfd = dup(pbm->mon_fd)) == -1) {
> err(1, "Could not dup filemon output!");
> }
>
--
Mateusz Guzik <mjguzik gmail.com>
Home |
Main Index |
Thread Index |
Old Index