xref: /netbsd-src/usr.bin/make/trace.c (revision 3c2f2cbb8fecc4ed30bbc516531e830ef06b84d1)
1*3c2f2cbbSrillig /*	$NetBSD: trace.c,v 1.33 2023/03/28 14:39:31 rillig Exp $	*/
2694b899bSsommerfeld 
385aee7a6Srillig /*
4694b899bSsommerfeld  * Copyright (c) 2000 The NetBSD Foundation, Inc.
5694b899bSsommerfeld  * All rights reserved.
6694b899bSsommerfeld  *
7694b899bSsommerfeld  * This code is derived from software contributed to The NetBSD Foundation
8694b899bSsommerfeld  * by Bill Sommerfeld
9694b899bSsommerfeld  *
10694b899bSsommerfeld  * Redistribution and use in source and binary forms, with or without
11694b899bSsommerfeld  * modification, are permitted provided that the following conditions
12694b899bSsommerfeld  * are met:
13694b899bSsommerfeld  * 1. Redistributions of source code must retain the above copyright
14694b899bSsommerfeld  *    notice, this list of conditions and the following disclaimer.
15694b899bSsommerfeld  * 2. Redistributions in binary form must reproduce the above copyright
16694b899bSsommerfeld  *    notice, this list of conditions and the following disclaimer in the
17694b899bSsommerfeld  *    documentation and/or other materials provided with the distribution.
18694b899bSsommerfeld  *
19694b899bSsommerfeld  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20694b899bSsommerfeld  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21694b899bSsommerfeld  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22694b899bSsommerfeld  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23694b899bSsommerfeld  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24694b899bSsommerfeld  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25694b899bSsommerfeld  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26694b899bSsommerfeld  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27694b899bSsommerfeld  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28694b899bSsommerfeld  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29694b899bSsommerfeld  * POSSIBILITY OF SUCH DAMAGE.
30694b899bSsommerfeld  */
31694b899bSsommerfeld 
3285aee7a6Srillig /*
33694b899bSsommerfeld  * trace.c --
34694b899bSsommerfeld  *	handle logging of trace events generated by various parts of make.
35694b899bSsommerfeld  *
36694b899bSsommerfeld  * Interface:
37694b899bSsommerfeld  *	Trace_Init		Initialize tracing (called once during
38694b899bSsommerfeld  *				the lifetime of the process)
39694b899bSsommerfeld  *
40694b899bSsommerfeld  *	Trace_End		Finalize tracing (called before make exits)
41694b899bSsommerfeld  *
42694b899bSsommerfeld  *	Trace_Log		Log an event about a particular make job.
43694b899bSsommerfeld  */
44694b899bSsommerfeld 
4586ebbc3aSwiz #include <sys/time.h>
4686ebbc3aSwiz 
47694b899bSsommerfeld #include "make.h"
48694b899bSsommerfeld #include "job.h"
49694b899bSsommerfeld #include "trace.h"
50694b899bSsommerfeld 
51*3c2f2cbbSrillig MAKE_RCSID("$NetBSD: trace.c,v 1.33 2023/03/28 14:39:31 rillig Exp $");
526de75a95Srillig 
53694b899bSsommerfeld static FILE *trfile;
54694b899bSsommerfeld static pid_t trpid;
55*3c2f2cbbSrillig static const char *trwd;
56694b899bSsommerfeld 
57ad3f6413Srillig static const char evname[][4] = {
58694b899bSsommerfeld 	"BEG",
59694b899bSsommerfeld 	"END",
60694b899bSsommerfeld 	"ERR",
61694b899bSsommerfeld 	"JOB",
62694b899bSsommerfeld 	"DON",
63694b899bSsommerfeld 	"INT",
64694b899bSsommerfeld };
65694b899bSsommerfeld 
66694b899bSsommerfeld void
Trace_Init(const char * pathname)6786ebbc3aSwiz Trace_Init(const char *pathname)
68694b899bSsommerfeld {
69694b899bSsommerfeld 	if (pathname != NULL) {
7003074130Srillig 		FStr curDir;
7186abf69eSrillig 		trpid = getpid();
72a8e14f36Srillig 		/*
73a8e14f36Srillig 		 * XXX: This variable may get overwritten later, which would
74a8e14f36Srillig 		 * make trwd point to undefined behavior.
75a8e14f36Srillig 		 */
76835b4db4Srillig 		curDir = Var_Value(SCOPE_GLOBAL, ".CURDIR");
7703074130Srillig 		trwd = curDir.str;
78694b899bSsommerfeld 
79694b899bSsommerfeld 		trfile = fopen(pathname, "a");
80694b899bSsommerfeld 	}
81694b899bSsommerfeld }
82694b899bSsommerfeld 
83694b899bSsommerfeld void
Trace_Log(TrEvent event,Job * job)8486ebbc3aSwiz Trace_Log(TrEvent event, Job *job)
85694b899bSsommerfeld {
86a233fbd5Sreinoud 	struct timeval rightnow;
87694b899bSsommerfeld 
88694b899bSsommerfeld 	if (trfile == NULL)
89694b899bSsommerfeld 		return;
90694b899bSsommerfeld 
91a686e4e7Schristos 	gettimeofday(&rightnow, NULL);
92694b899bSsommerfeld 
93302298bfSrillig #if __STDC_VERSION__ >= 199901L
94266b18d8Schristos 	fprintf(trfile, "%lld.%06ld %d %s %d %s",
95266b18d8Schristos 	    (long long)rightnow.tv_sec, (long)rightnow.tv_usec,
96913c34c2Sdsl 	    jobTokensRunning,
97694b899bSsommerfeld 	    evname[event], trpid, trwd);
98a28470e2Srillig #else
99a28470e2Srillig 	fprintf(trfile, "%ld.%06ld %d %s %d %s",
100a28470e2Srillig 	    (long)rightnow.tv_sec, (long)rightnow.tv_usec,
101a28470e2Srillig 	    jobTokensRunning,
102a28470e2Srillig 	    evname[event], trpid, trwd);
103a28470e2Srillig #endif
104694b899bSsommerfeld 	if (job != NULL) {
105e0fa644cSrillig 		char flags[4];
106c2147f48Srillig 
107a6d2ec59Srillig 		Job_FlagsToString(job, flags, sizeof flags);
108c2147f48Srillig 		fprintf(trfile, " %s %d %s %x", job->node->name,
109c2147f48Srillig 		    job->pid, flags, job->node->type);
110694b899bSsommerfeld 	}
111a686e4e7Schristos 	fputc('\n', trfile);
112a686e4e7Schristos 	fflush(trfile);
113694b899bSsommerfeld }
114694b899bSsommerfeld 
115694b899bSsommerfeld void
Trace_End(void)11686ebbc3aSwiz Trace_End(void)
117694b899bSsommerfeld {
118694b899bSsommerfeld 	if (trfile != NULL)
119a686e4e7Schristos 		fclose(trfile);
120694b899bSsommerfeld }
121