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
;
129 memcpy(rxi_tracebuf
+ rxi_tracepos
, &rxtinfo
, sizeof(struct rx_trace
));
130 rxi_tracepos
+= sizeof(struct rx_trace
);
131 if (rxi_tracepos
>= (4096 - sizeof(struct rx_trace
)))
137 #include <afs/afsutil.h>
141 main(int argc
, char **argv
)
149 while (argc
&& **argv
== '-') {
150 if (strcmp(*argv
, "-trace") == 0) {
151 strcpy(rxi_tracename
, *(++argv
));
159 if (err
|| argc
!= 0) {
160 printf("usage: dumptrace [-trace pathname]");
164 rxi_logfd
= open(rxi_tracename
, O_RDONLY
);
170 while (read(rxi_logfd
, &ip
, sizeof(struct rx_trace
))) {
171 printf("%9u ", ip
.now
);
179 case RX_CALL_ARRIVAL
:
189 printf(" %3u %7u %7u %x.%x\n", ip
.qlen
, ip
.servicetime
,
190 ip
.waittime
, ip
.cid
, ip
.call
);
195 #endif /* DUMPTRACE */