1/*	$NetBSD: trace.c,v 1.11 2008/12/28 18:31:51 christos Exp $	*/
2
3/*-
4 * Copyright (c) 2000 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Bill Sommerfeld
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32
33#ifndef MAKE_NATIVE
34static char rcsid[] = "$NetBSD: trace.c,v 1.11 2008/12/28 18:31:51 christos Exp $";
35#else
36#include <sys/cdefs.h>
37#ifndef lint
38__RCSID("$NetBSD: trace.c,v 1.11 2008/12/28 18:31:51 christos Exp $");
39#endif /* not lint */
40#endif
41
42/*-
43 * trace.c --
44 *	handle logging of trace events generated by various parts of make.
45 *
46 * Interface:
47 *	Trace_Init		Initialize tracing (called once during
48 *				the lifetime of the process)
49 *
50 *	Trace_End		Finalize tracing (called before make exits)
51 *
52 *	Trace_Log		Log an event about a particular make job.
53 */
54
55#include <sys/time.h>
56
57#include <stdio.h>
58#include <unistd.h>
59
60#include "make.h"
61#include "job.h"
62#include "trace.h"
63
64static FILE *trfile;
65static pid_t trpid;
66char *trwd;
67
68static const char *evname[] = {
69	"BEG",
70	"END",
71	"ERR",
72	"JOB",
73	"DON",
74	"INT",
75};
76
77void
78Trace_Init(const char *pathname)
79{
80	char *p1;
81	if (pathname != NULL) {
82		trpid = getpid();
83		trwd = Var_Value(".CURDIR", VAR_GLOBAL, &p1);
84
85		trfile = fopen(pathname, "a");
86	}
87}
88
89void
90Trace_Log(TrEvent event, Job *job)
91{
92	struct timeval rightnow;
93
94	if (trfile == NULL)
95		return;
96
97	gettimeofday(&rightnow, NULL);
98
99	fprintf(trfile, "%lld.%06ld %d %s %d %s",
100	    (long long)rightnow.tv_sec, (long)rightnow.tv_usec,
101	    jobTokensRunning,
102	    evname[event], trpid, trwd);
103	if (job != NULL) {
104		fprintf(trfile, " %s %d %x %x", job->node->name,
105		    job->pid, job->flags, job->node->type);
106	}
107	fputc('\n', trfile);
108	fflush(trfile);
109}
110
111void
112Trace_End(void)
113{
114	if (trfile != NULL)
115		fclose(trfile);
116}
117