1 | /* |
2 | * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. Oracle designates this |
8 | * particular file as subject to the "Classpath" exception as provided |
9 | * by Oracle in the LICENSE file that accompanied this code. |
10 | * |
11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | * version 2 for more details (a copy is included in the LICENSE file that |
15 | * accompanied this code). |
16 | * |
17 | * You should have received a copy of the GNU General Public License version |
18 | * 2 along with this work; if not, write to the Free Software Foundation, |
19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
20 | * |
21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 | * or visit www.oracle.com if you need additional information or have any |
23 | * questions. |
24 | */ |
25 | |
26 | #if !defined(_DEBUG_TRACE_H) |
27 | #define _DEBUG_TRACE_H |
28 | |
29 | #if defined(__cplusplus) |
30 | extern "C" { |
31 | #endif |
32 | |
33 | #if defined(DEBUG) |
34 | |
35 | #include "debug_util.h" |
36 | |
37 | /* Use THIS_FILE when it is available. */ |
38 | #ifndef THIS_FILE |
39 | #define THIS_FILE __FILE__ |
40 | #endif |
41 | |
42 | typedef int dtrace_id; |
43 | enum { |
44 | UNDEFINED_TRACE_ID = -1 /* indicates trace point has not been registered yet */ |
45 | }; |
46 | |
47 | /* prototype for client provided output callback function */ |
48 | typedef void (JNICALL *DTRACE_OUTPUT_CALLBACK)(const char * msg); |
49 | |
50 | /* prototype for client provided print callback function */ |
51 | typedef void (JNICALL *DTRACE_PRINT_CALLBACK)(const char * file, int line, int argc, const char * fmt, va_list arglist); |
52 | |
53 | extern void DTrace_EnableAll(dbool_t enabled); |
54 | extern void DTrace_EnableFile(const char * file, dbool_t enabled); |
55 | extern void DTrace_EnableLine(const char * file, int linenum, dbool_t enabled); |
56 | extern void DTrace_SetOutputCallback(DTRACE_OUTPUT_CALLBACK pfn); |
57 | extern void DTrace_Initialize(); |
58 | extern void DTrace_Shutdown(); |
59 | void DTrace_DisableMutex(); |
60 | extern void DTrace_VPrintImpl(const char * fmt, va_list arglist); |
61 | extern void DTrace_PrintImpl(const char * fmt, ...); |
62 | /* JNIEXPORT because these functions are also called from libawt_xawt */ |
63 | JNIEXPORT void JNICALL DTrace_PrintFunction(DTRACE_PRINT_CALLBACK pfn, dtrace_id * pFileTraceId, dtrace_id * pTraceId, const char * file, int line, int argc, const char * fmt, ...); |
64 | |
65 | /* these functions are exported only for use in macros-- do not call them directly!!! */ |
66 | JNIEXPORT void JNICALL DTrace_VPrint(const char * file, int line, int argc, const char * fmt, va_list arglist); |
67 | JNIEXPORT void JNICALL DTrace_VPrintln(const char * file, int line, int argc, const char * fmt, va_list arglist); |
68 | |
69 | /* each file includes this flag indicating module trace status */ |
70 | static dtrace_id _Dt_FileTraceId = UNDEFINED_TRACE_ID; |
71 | |
72 | /* not meant to be called from client code-- |
73 | * it's just a template for the other macros |
74 | */ |
75 | #define _DTrace_Template(_func, _ac, _f, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) \ |
76 | { \ |
77 | static dtrace_id _dt_lineid_ = UNDEFINED_TRACE_ID; \ |
78 | DTrace_PrintFunction((_func), &_Dt_FileTraceId, &_dt_lineid_, THIS_FILE, __LINE__, (_ac), (_f), (_a1), (_a2), (_a3), (_a4), (_a5), (_a6), (_a7), (_a8) ); \ |
79 | } |
80 | |
81 | /* printf style trace macros */ |
82 | #define DTRACE_PRINT(_fmt) \ |
83 | _DTrace_Template(DTrace_VPrint, 0, (_fmt), 0, 0, 0, 0, 0, 0, 0, 0) |
84 | #define DTRACE_PRINT1(_fmt, _arg1) \ |
85 | _DTrace_Template(DTrace_VPrint, 1, (_fmt), (_arg1), 0, 0, 0, 0, 0, 0, 0) |
86 | #define DTRACE_PRINT2(_fmt, _arg1, _arg2) \ |
87 | _DTrace_Template(DTrace_VPrint, 2, (_fmt), (_arg1), (_arg2), 0, 0, 0, 0, 0, 0) |
88 | #define DTRACE_PRINT3(_fmt, _arg1, _arg2, _arg3) \ |
89 | _DTrace_Template(DTrace_VPrint, 3, (_fmt), (_arg1), (_arg2), (_arg3), 0, 0, 0, 0, 0) |
90 | #define DTRACE_PRINT4(_fmt, _arg1, _arg2, _arg3, _arg4) \ |
91 | _DTrace_Template(DTrace_VPrint, 4, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), 0, 0, 0, 0) |
92 | #define DTRACE_PRINT5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \ |
93 | _DTrace_Template(DTrace_VPrint, 5, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), 0, 0, 0) |
94 | #define DTRACE_PRINT6(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \ |
95 | _DTrace_Template(DTrace_VPrint, 6, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), 0, 0) |
96 | #define DTRACE_PRINT7(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7) \ |
97 | _DTrace_Template(DTrace_VPrint, 7, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), (_arg7), 0) |
98 | #define DTRACE_PRINT8(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8) \ |
99 | _DTrace_Template(DTrace_VPrint, 8, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), (_arg7), (_arg8)) |
100 | |
101 | /* printf style trace macros that automatically output a newline */ |
102 | #define DTRACE_PRINTLN(_fmt) \ |
103 | _DTrace_Template(DTrace_VPrintln, 0, (_fmt), 0, 0, 0, 0, 0, 0, 0, 0) |
104 | #define DTRACE_PRINTLN1(_fmt, _arg1) \ |
105 | _DTrace_Template(DTrace_VPrintln, 1, (_fmt), (_arg1), 0, 0, 0, 0, 0, 0, 0) |
106 | #define DTRACE_PRINTLN2(_fmt, _arg1, _arg2) \ |
107 | _DTrace_Template(DTrace_VPrintln, 2, (_fmt), (_arg1), (_arg2), 0, 0, 0, 0, 0, 0) |
108 | #define DTRACE_PRINTLN3(_fmt, _arg1, _arg2, _arg3) \ |
109 | _DTrace_Template(DTrace_VPrintln, 3, (_fmt), (_arg1), (_arg2), (_arg3), 0, 0, 0, 0, 0) |
110 | #define DTRACE_PRINTLN4(_fmt, _arg1, _arg2, _arg3, _arg4) \ |
111 | _DTrace_Template(DTrace_VPrintln, 4, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), 0, 0, 0, 0) |
112 | #define DTRACE_PRINTLN5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \ |
113 | _DTrace_Template(DTrace_VPrintln, 5, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), 0, 0, 0) |
114 | #define DTRACE_PRINTLN6(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \ |
115 | _DTrace_Template(DTrace_VPrintln, 6, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), 0, 0) |
116 | #define DTRACE_PRINTLN7(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7) \ |
117 | _DTrace_Template(DTrace_VPrintln, 7, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), (_arg7), 0) |
118 | #define DTRACE_PRINTLN8(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8) \ |
119 | _DTrace_Template(DTrace_VPrintln, 8, (_fmt), (_arg1), (_arg2), (_arg3), (_arg4), (_arg5), (_arg6), (_arg7), (_arg8)) |
120 | |
121 | #else /* else DEBUG not defined */ |
122 | |
123 | /* printf style trace macros */ |
124 | #define DTRACE_PRINT(_fmt) |
125 | #define DTRACE_PRINT1(_fmt, _arg1) |
126 | #define DTRACE_PRINT2(_fmt, _arg1, _arg2) |
127 | #define DTRACE_PRINT3(_fmt, _arg1, _arg2, _arg3) |
128 | #define DTRACE_PRINT4(_fmt, _arg1, _arg2, _arg3, _arg4) |
129 | #define DTRACE_PRINT5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) |
130 | #define DTRACE_PRINT6(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) |
131 | #define DTRACE_PRINT7(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7) |
132 | #define DTRACE_PRINT8(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8) |
133 | |
134 | /* printf style trace macros that automatically output a newline */ |
135 | #define DTRACE_PRINTLN(_fmt) |
136 | #define DTRACE_PRINTLN1(_fmt, _arg1) |
137 | #define DTRACE_PRINTLN2(_fmt, _arg1, _arg2) |
138 | #define DTRACE_PRINTLN3(_fmt, _arg1, _arg2, _arg3) |
139 | #define DTRACE_PRINTLN4(_fmt, _arg1, _arg2, _arg3, _arg4) |
140 | #define DTRACE_PRINTLN5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) |
141 | #define DTRACE_PRINTLN6(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) |
142 | #define DTRACE_PRINTLN7(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7) |
143 | #define DTRACE_PRINTLN8(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8) |
144 | |
145 | #endif /* endif DEBUG defined */ |
146 | |
147 | #if defined(__cplusplus) |
148 | } /* extern "C" */ |
149 | #endif |
150 | |
151 | #endif /* _DEBUG_TRACE_H */ |
152 | |