hotspot/src/share/vm/utilities/events.hpp
changeset 24424 2658d7834c6e
parent 17376 4ee999c3c007
child 28163 322d55d167be
equal deleted inserted replaced
24358:8528b67f6562 24424:2658d7834c6e
     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