1 /* |
1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
126 void print(outputStream* out, T& e); |
126 void print(outputStream* out, T& e); |
127 |
127 |
128 void print(outputStream* out, EventRecord<T>& e) { |
128 void print(outputStream* out, EventRecord<T>& e) { |
129 out->print("Event: %.3f ", e.timestamp); |
129 out->print("Event: %.3f ", e.timestamp); |
130 if (e.thread != NULL) { |
130 if (e.thread != NULL) { |
131 out->print("Thread " INTPTR_FORMAT " ", e.thread); |
131 out->print("Thread " INTPTR_FORMAT " ", p2i(e.thread)); |
132 } |
132 } |
133 print(out, e.data); |
133 print(out, e.data); |
134 } |
134 } |
135 }; |
135 }; |
136 |
136 |
146 // A simple ring buffer of fixed size text messages. |
146 // A simple ring buffer of fixed size text messages. |
147 class StringEventLog : public EventLogBase<StringLogMessage> { |
147 class StringEventLog : public EventLogBase<StringLogMessage> { |
148 public: |
148 public: |
149 StringEventLog(const char* name, int count = LogEventsBufferEntries) : EventLogBase<StringLogMessage>(name, count) {} |
149 StringEventLog(const char* name, int count = LogEventsBufferEntries) : EventLogBase<StringLogMessage>(name, count) {} |
150 |
150 |
151 void logv(Thread* thread, const char* format, va_list ap) { |
151 void logv(Thread* thread, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0) { |
152 if (!should_log()) return; |
152 if (!should_log()) return; |
153 |
153 |
154 double timestamp = fetch_timestamp(); |
154 double timestamp = fetch_timestamp(); |
155 MutexLockerEx ml(&_mutex, Mutex::_no_safepoint_check_flag); |
155 MutexLockerEx ml(&_mutex, Mutex::_no_safepoint_check_flag); |
156 int index = compute_log_index(); |
156 int index = compute_log_index(); |
157 _records[index].thread = thread; |
157 _records[index].thread = thread; |
158 _records[index].timestamp = timestamp; |
158 _records[index].timestamp = timestamp; |
159 _records[index].data.printv(format, ap); |
159 _records[index].data.printv(format, ap); |
160 } |
160 } |
161 |
161 |
162 void log(Thread* thread, const char* format, ...) { |
162 void log(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(3, 4) { |
163 va_list ap; |
163 va_list ap; |
164 va_start(ap, format); |
164 va_start(ap, format); |
165 logv(thread, format, ap); |
165 logv(thread, format, ap); |
166 va_end(ap); |
166 va_end(ap); |
167 } |
167 } |
191 |
191 |
192 // Dump all events to the tty |
192 // Dump all events to the tty |
193 static void print(); |
193 static void print(); |
194 |
194 |
195 // Logs a generic message with timestamp and format as printf. |
195 // Logs a generic message with timestamp and format as printf. |
196 static void log(Thread* thread, const char* format, ...); |
196 static void log(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); |
197 |
197 |
198 // Log exception related message |
198 // Log exception related message |
199 static void log_exception(Thread* thread, const char* format, ...); |
199 static void log_exception(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); |
200 |
200 |
201 static void log_deopt_message(Thread* thread, const char* format, ...); |
201 static void log_deopt_message(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); |
202 |
202 |
203 // Register default loggers |
203 // Register default loggers |
204 static void init(); |
204 static void init(); |
205 }; |
205 }; |
206 |
|
207 |
206 |
208 inline void Events::log(Thread* thread, const char* format, ...) { |
207 inline void Events::log(Thread* thread, const char* format, ...) { |
209 if (LogEvents) { |
208 if (LogEvents) { |
210 va_list ap; |
209 va_list ap; |
211 va_start(ap, format); |
210 va_start(ap, format); |
281 class EventMark : public StackObj { |
280 class EventMark : public StackObj { |
282 StringLogMessage _buffer; |
281 StringLogMessage _buffer; |
283 |
282 |
284 public: |
283 public: |
285 // log a begin event, format as printf |
284 // log a begin event, format as printf |
286 EventMark(const char* format, ...); |
285 EventMark(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); |
287 // log an end event |
286 // log an end event |
288 ~EventMark(); |
287 ~EventMark(); |
289 }; |
288 }; |
290 |
289 |
291 #endif // SHARE_VM_UTILITIES_EVENTS_HPP |
290 #endif // SHARE_VM_UTILITIES_EVENTS_HPP |