hotspot/src/share/vm/prims/jvmtiTrace.cpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 1623 a0dd9009e992
child 5547 f4b087cbb361
permissions -rw-r--r--
6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
1623
a0dd9009e992 6785258: Update copyright year
xdono
parents: 1402
diff changeset
     2
 * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
# include "incls/_precompiled.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
# include "incls/_jvmtiTrace.cpp.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
// class JvmtiTrace
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// Support for JVMTI tracing code
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// ------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// Usage:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
//    -XX:TraceJVMTI=DESC,DESC,DESC
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
//    DESC is   DOMAIN ACTION KIND
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//    DOMAIN is function name
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//              event name
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//              "all" (all functions and events)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//              "func" (all functions except boring)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
//              "allfunc" (all functions)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//              "event" (all events)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//              "ec" (event controller)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//    ACTION is "+" (add)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//              "-" (remove)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//    KIND is
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
//     for func
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//              "i" (input params)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
//              "e" (error returns)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
//              "o" (output)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
//     for event
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//              "t" (event triggered aka posted)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
//              "s" (event sent)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// Example:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//            -XX:TraceJVMTI=ec+,GetCallerFrame+ie,Breakpoint+s
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
#ifdef JVMTI_TRACE
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
bool JvmtiTrace::_initialized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
bool JvmtiTrace::_on = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
bool JvmtiTrace::_trace_event_controller = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
void JvmtiTrace::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  if (_initialized) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  SafeResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  const char *very_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  const char *curr;
1402
ccb40ce62b79 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 1
diff changeset
    76
  if (TraceJVMTI != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    curr = TraceJVMTI;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    curr = "";  // hack in fixed tracing here
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  very_end = curr + strlen(curr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  while (curr < very_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    const char *curr_end = strchr(curr, ',');
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    if (curr_end == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
      curr_end = very_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    const char *op_pos = strchr(curr, '+');
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    const char *minus_pos = strchr(curr, '-');
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    if (minus_pos != NULL && (minus_pos < op_pos || op_pos == NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
      op_pos = minus_pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    char op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    const char *flags = op_pos + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    const char *flags_end = curr_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    if (op_pos == NULL || op_pos > curr_end) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
      flags = "ies";
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
      flags_end = flags + strlen(flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
      op_pos = curr_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
      op = '+';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
      op = *op_pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    jbyte bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    for (; flags < flags_end; ++flags) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
      switch (*flags) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
      case 'i':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
        bits |= SHOW_IN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
      case 'I':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
        bits |= SHOW_IN_DETAIL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
      case 'e':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
        bits |= SHOW_ERROR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
      case 'o':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
        bits |= SHOW_OUT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
      case 'O':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
        bits |= SHOW_OUT_DETAIL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
      case 't':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
        bits |= SHOW_EVENT_TRIGGER;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
      case 's':
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
        bits |= SHOW_EVENT_SENT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
        tty->print_cr("Invalid trace flag '%c'", *flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    const int FUNC = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    const int EXCLUDE  = 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    const int ALL_FUNC = 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    const int EVENT = 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    const int ALL_EVENT = 16;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    int domain = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    size_t len = op_pos - curr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    if (op_pos == curr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
      domain = ALL_FUNC | FUNC | ALL_EVENT | EVENT | EXCLUDE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    } else if (len==3 && strncmp(curr, "all", 3)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
      domain = ALL_FUNC | FUNC | ALL_EVENT | EVENT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    } else if (len==7 && strncmp(curr, "allfunc", 7)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
      domain = ALL_FUNC | FUNC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    } else if (len==4 && strncmp(curr, "func", 4)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
      domain = ALL_FUNC | FUNC | EXCLUDE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    } else if (len==8 && strncmp(curr, "allevent", 8)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
      domain = ALL_EVENT | EVENT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    } else if (len==5 && strncmp(curr, "event", 5)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
      domain = ALL_EVENT | EVENT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    } else if (len==2 && strncmp(curr, "ec", 2)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
      _trace_event_controller = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
      tty->print_cr("JVMTI Tracing the event controller");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
      domain = FUNC | EVENT;  // go searching
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    int exclude_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    if (domain & FUNC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
      if (domain & ALL_FUNC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
        if (domain & EXCLUDE) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
          tty->print("JVMTI Tracing all significant functions");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
          tty->print_cr("JVMTI Tracing all functions");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
      for (int i = 0; i <= _max_function_index; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
        if (domain & EXCLUDE && i == _exclude_functions[exclude_index]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
          ++exclude_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
          bool do_op = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
          if (domain & ALL_FUNC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
            do_op = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
            const char *fname = function_name(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
            if (fname != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
              size_t fnlen = strlen(fname);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
              if (len==fnlen && strncmp(curr, fname, fnlen)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
                tty->print_cr("JVMTI Tracing the function: %s", fname);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
                do_op = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
          if (do_op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
            if (op == '+') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
              _trace_flags[i] |= bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
              _trace_flags[i] &= ~bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
            _on = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    if (domain & EVENT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
      if (domain & ALL_EVENT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
        tty->print_cr("JVMTI Tracing all events");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      for (int i = 0; i <= _max_event_index; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
        bool do_op = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
        if (domain & ALL_EVENT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
          do_op = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
          const char *ename = event_name(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
          if (ename != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
            size_t evtlen = strlen(ename);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
            if (len==evtlen && strncmp(curr, ename, evtlen)==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
              tty->print_cr("JVMTI Tracing the event: %s", ename);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
              do_op = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
        if (do_op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
          if (op == '+') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
            _event_trace_flags[i] |= bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
            _event_trace_flags[i] &= ~bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
          _on = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    if (!_on && (domain & (FUNC|EVENT))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
      tty->print_cr("JVMTI Trace domain not found");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    curr = curr_end + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  _initialized = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
void JvmtiTrace::shutdown() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  _on = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  _trace_event_controller = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  for (i = 0; i <= _max_function_index; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    _trace_flags[i] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  for (i = 0; i <= _max_event_index; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    _event_trace_flags[i] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
const char* JvmtiTrace::enum_name(const char** names, const jint* values, jint value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  for (int index = 0; names[index] != 0; ++index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    if (values[index] == value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
      return names[index];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  return "*INVALID-ENUM-VALUE*";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
// return a valid string no matter what state the thread is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
const char *JvmtiTrace::safe_get_thread_name(Thread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  if (thread == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    return "NULL";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  if (!thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    return thread->name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  JavaThread *java_thread = (JavaThread *)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  oop threadObj = java_thread->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  if (threadObj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    return "NULL";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  typeArrayOop name = java_lang_Thread::name(threadObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  if (name == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    return "<NOT FILLED IN>";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  return UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
// return the name of the current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
const char *JvmtiTrace::safe_get_current_thread_name() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  if (JvmtiEnv::is_vm_live()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    return JvmtiTrace::safe_get_thread_name(Thread::current());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    return "VM not live";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
// return a valid string no matter what the state of k_mirror
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
const char * JvmtiTrace::get_class_name(oop k_mirror) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  if (java_lang_Class::is_primitive(k_mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    return "primitive";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  if (k_oop == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    return "INVALID";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  return Klass::cast(k_oop)->external_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
#endif /*JVMTI_TRACE */