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