2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include <afs/param.h>
16 char rxi_tracename[80] = "\0Tracing not compiled in";
19 main(int argc, char **argv)
27 #include "rx_atomic.h"
28 #include "rx_globals.h"
29 #include "rx_internal.h"
36 char rxi_tracename[80] = "/tmp/rxcalltrace";
38 char rxi_tracename[80] =
39 "\0Change This pathname (and preceding NUL) to initiate tracing";
42 char rxi_tracebuf[4096];
43 afs_uint32 rxi_tracepos = 0;
51 afs_uint32 servicetime;
58 afs_uint32 len = rxi_tracepos;
63 if (write(rxi_logfd, rxi_tracebuf, len) < 0) {
69 rxi_calltrace(unsigned int event, struct rx_call *call)
72 struct rx_trace rxtinfo;
74 if (!rxi_tracename[0])
78 rxi_logfd = open(rxi_tracename, O_WRONLY | O_CREAT | O_TRUNC, 0777);
80 rxi_tracename[0] = '\0';
84 rxtinfo.event = event;
85 rxtinfo.now = now.sec * 1000 + now.usec / 1000;
86 rxtinfo.cid = call->conn->cid;
87 rxtinfo.call = *(call->callNumber);
88 rxtinfo.qlen = rx_atomic_read(&rx_nWaiting);
89 rxtinfo.servicetime = 0;
94 clock_Sub(&now, &(call->traceStart));
95 rxtinfo.servicetime = now.sec * 10000 + now.usec / 100;
96 if (call->traceWait.sec) {
97 now = call->traceStart;
98 clock_Sub(&now, &(call->traceWait));
99 rxtinfo.waittime = now.sec * 10000 + now.usec / 100;
101 rxtinfo.waittime = 0;
102 call->traceWait.sec = call->traceWait.usec = call->traceStart.sec =
103 call->traceStart.usec = 0;
107 call->traceStart = now;
108 if (call->traceWait.sec) {
109 clock_Sub(&now, &(call->traceWait));
110 rxtinfo.waittime = now.sec * 10000 + now.usec / 100;
112 rxtinfo.waittime = 0;
116 if (call->traceWait.sec) {
117 clock_Sub(&now, &(call->traceWait));
118 rxtinfo.waittime = now.sec * 10000 + now.usec / 100;
120 rxtinfo.waittime = 0;
123 case RX_CALL_ARRIVAL:
124 call->traceWait = now;
131 memcpy(rxi_tracebuf + rxi_tracepos, &rxtinfo, sizeof(struct rx_trace));
132 rxi_tracepos += sizeof(struct rx_trace);
133 if (rxi_tracepos >= (4096 - sizeof(struct rx_trace)))
139 #include <afs/afsutil.h>
143 main(int argc, char **argv)
151 while (argc && **argv == '-') {
152 if (strcmp(*argv, "-trace") == 0) {
153 strcpy(rxi_tracename, *(++argv));
161 if (err || argc != 0) {
162 printf("usage: dumptrace [-trace pathname]");
166 rxi_logfd = open(rxi_tracename, O_RDONLY);
172 while (read(rxi_logfd, &ip, sizeof(struct rx_trace))) {
173 printf("%9u ", ip.now);
181 case RX_CALL_ARRIVAL:
191 printf(" %3u %7u %7u %x.%x\n", ip.qlen, ip.servicetime,
192 ip.waittime, ip.cid, ip.call);
197 #endif /* DUMPTRACE */