hotspot/src/share/vm/runtime/thread.cpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 19723 79c3f91dc0fa
child 20005 6fb8070af25d
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15432
9d976ca484d8 8000692: Remove old KERNEL code
zgu
parents: 15221
diff changeset
     2
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    26
#include "classfile/classLoader.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    27
#include "classfile/javaClasses.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    28
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    29
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    30
#include "code/scopeDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    31
#include "compiler/compileBroker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    32
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    33
#include "interpreter/linkResolver.hpp"
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
    34
#include "interpreter/oopMapCache.hpp"
7897
201a8b00ec91 6814943: getcpool001 catches more than one JvmtiThreadState problem
kamg
parents: 7724
diff changeset
    35
#include "jvmtifiles/jvmtiEnv.hpp"
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
    36
#include "memory/gcLocker.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
    37
#include "memory/metaspaceShared.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    38
#include "memory/oopFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    39
#include "memory/universe.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    40
#include "oops/instanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    41
#include "oops/objArrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    42
#include "oops/oop.inline.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
    43
#include "oops/symbol.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    44
#include "prims/jvm_misc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    45
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    46
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    47
#include "prims/privilegedStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    48
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    49
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    50
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    51
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    52
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    53
#include "runtime/init.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    54
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    55
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    56
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    57
#include "runtime/jniPeriodicChecker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    58
#include "runtime/memprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    59
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    60
#include "runtime/objectMonitor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    61
#include "runtime/osThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    62
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    63
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    64
#include "runtime/statSampler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    65
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    66
#include "runtime/task.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14582
diff changeset
    67
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    68
#include "runtime/threadCritical.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    69
#include "runtime/threadLocalStorage.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    70
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    71
#include "runtime/vframeArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    72
#include "runtime/vframe_hp.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    73
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    74
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    75
#include "services/attachListener.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    76
#include "services/management.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
    77
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    78
#include "services/threadService.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
    79
#include "trace/tracing.hpp"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
    80
#include "trace/traceMacros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    81
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    82
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    83
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    84
#include "utilities/preserveException.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
    85
#include "utilities/macros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    86
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    87
# include "os_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    88
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    89
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    90
# include "os_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    91
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    92
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    93
# include "os_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    94
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    95
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    96
# include "os_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    97
#endif
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
    98
#if INCLUDE_ALL_GCS
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
    99
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   100
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   101
#include "gc_implementation/parallelScavenge/pcTasks.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
   102
#endif // INCLUDE_ALL_GCS
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   103
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   104
#include "c1/c1_Compiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   105
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   106
#ifdef COMPILER2
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   107
#include "opto/c2compiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   108
#include "opto/idealGraphPrinter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7123
diff changeset
   109
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
#ifdef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
// Only bother with this argument setup if dtrace is available
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   115
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
HS_DTRACE_PROBE_DECL(hotspot, vm__init__begin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
HS_DTRACE_PROBE_DECL(hotspot, vm__init__end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
HS_DTRACE_PROBE_DECL5(hotspot, thread__start, char*, intptr_t,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  intptr_t, intptr_t, bool);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
HS_DTRACE_PROBE_DECL5(hotspot, thread__stop, char*, intptr_t,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  intptr_t, intptr_t, bool);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
#define DTRACE_THREAD_PROBE(probe, javathread)                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  {                                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    ResourceMark rm(this);                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    int len = 0;                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    const char* name = (javathread)->get_thread_name();                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    len = strlen(name);                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    HS_DTRACE_PROBE5(hotspot, thread__##probe,                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
      name, len,                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
      java_lang_Thread::thread_id((javathread)->threadObj()),              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
      (javathread)->osthread()->thread_id(),                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
      java_lang_Thread::is_daemon((javathread)->threadObj()));             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   136
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   137
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   138
#define HOTSPOT_THREAD_PROBE_start HOTSPOT_THREAD_PROBE_START
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   139
#define HOTSPOT_THREAD_PROBE_stop HOTSPOT_THREAD_PROBE_STOP
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   140
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   141
#define DTRACE_THREAD_PROBE(probe, javathread)                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   142
  {                                                                        \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   143
    ResourceMark rm(this);                                                 \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   144
    int len = 0;                                                           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   145
    const char* name = (javathread)->get_thread_name();                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   146
    len = strlen(name);                                                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   147
    HOTSPOT_THREAD_PROBE_##probe(  /* probe = start, stop */               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   148
      (char *) name, len,                                                           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   149
      java_lang_Thread::thread_id((javathread)->threadObj()),              \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   150
      (uintptr_t) (javathread)->osthread()->thread_id(),                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   151
      java_lang_Thread::is_daemon((javathread)->threadObj()));             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   152
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   153
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   154
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   155
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
#else //  ndef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
#define DTRACE_THREAD_PROBE(probe, javathread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
#endif // ndef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   162
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
// Class hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
// - Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
//   - VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
//   - WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
//   - ConcurrentMarkSweepThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
//   - JavaThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
//     - CompilerThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// ======= Thread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
// Support for forcing alignment of thread objects for biased locking
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   173
void* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    const int alignment = markOopDesc::biased_lock_alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    size_t aligned_size = size + (alignment - sizeof(intptr_t));
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   177
    void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC)
14083
103054a71a30 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 13978
diff changeset
   178
                                          : AllocateHeap(aligned_size, flags, CURRENT_PC,
103054a71a30 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 13978
diff changeset
   179
                                              AllocFailStrategy::RETURN_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    void* aligned_addr     = (void*) align_size_up((intptr_t) real_malloc_addr, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    assert(((uintptr_t) aligned_addr + (uintptr_t) size) <=
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
           ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
           "JavaThread alignment code overflowed allocated storage");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    if (TraceBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
      if (aligned_addr != real_malloc_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
        tty->print_cr("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
                      real_malloc_addr, aligned_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    return aligned_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  } else {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   192
    return throw_excpt? AllocateHeap(size, flags, CURRENT_PC)
14083
103054a71a30 8000617: It should be possible to allocate memory without the VM dying.
nloodin
parents: 13978
diff changeset
   193
                       : AllocateHeap(size, flags, CURRENT_PC, AllocFailStrategy::RETURN_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
void Thread::operator delete(void* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    void* real_malloc_addr = ((Thread*) p)->_real_malloc_address;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   200
    FreeHeap(real_malloc_addr, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  } else {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   202
    FreeHeap(p, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
// Base class for all threads: VMThread, WatcherThread, ConcurrentMarkSweepThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// JavaThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
Thread::Thread() {
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   212
  // stack and get_thread
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   213
  set_stack_base(NULL);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   214
  set_stack_size(0);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   215
  set_self_raw_id(0);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   216
  set_lgrp_id(-1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  // allocated data structures
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   219
  set_osthread(NULL);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   220
  set_resource_area(new (mtThread)ResourceArea());
18928
ac0163dd0a50 7143807: ResourceMark nesting problem in stringStream
fparain
parents: 18687
diff changeset
   221
  DEBUG_ONLY(_current_resource_mark = NULL;)
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   222
  set_handle_area(new (mtThread) HandleArea(NULL));
18432
037577e626b1 8008964: NPG: Memory regression: Thread::_metadata_handles uses 1 KB per thread.
iklam
parents: 18025
diff changeset
   223
  set_metadata_handles(new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(30, true));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  set_active_handles(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  set_free_handle_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  set_last_handle_mark(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // This initial value ==> never claimed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  _oops_do_parity = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // the handle mark links itself to last_handle_mark
17031
9a576749065b 8012907: anti-delta fix for 8010992
dcubed
parents: 17026
diff changeset
   232
  new HandleMark(this);
9a576749065b 8012907: anti-delta fix for 8010992
dcubed
parents: 17026
diff changeset
   233
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // plain initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  debug_only(_owned_locks = NULL;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  debug_only(_allow_allocation_count = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  NOT_PRODUCT(_allow_safepoint_count = 0;)
2995
d8283445992a 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 2526
diff changeset
   238
  NOT_PRODUCT(_skip_gcalot = false;)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  CHECK_UNHANDLED_OOPS_ONLY(_gc_locked_out_count = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  _jvmti_env_iteration_count = 0;
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   241
  set_allocated_bytes(0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  _vm_operation_started_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  _vm_operation_completed_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  _current_pending_monitor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  _current_pending_monitor_is_from_java = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  _current_waiting_monitor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  _num_nested_signal = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  omFreeList = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  omFreeCount = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  omFreeProvision = 32 ;
5710
d664086c0add 6852873: Reduce safepoint cleanup time
acorn
parents: 5085
diff changeset
   251
  omInUseList = NULL ;
d664086c0add 6852873: Reduce safepoint cleanup time
acorn
parents: 5085
diff changeset
   252
  omInUseCount = 0 ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
12108
b2ee55606008 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 11776
diff changeset
   254
#ifdef ASSERT
b2ee55606008 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 11776
diff changeset
   255
  _visited_for_critical_count = false;
b2ee55606008 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 11776
diff changeset
   256
#endif
b2ee55606008 7150390: JFR test crashed on assert(_jni_lock_count == count) failed: must be equal
never
parents: 11776
diff changeset
   257
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  _SR_lock = new Monitor(Mutex::suspend_resume, "SR_lock", true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  _suspend_flags = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // thread-specific hashCode stream generator state - Marsaglia shift-xor form
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  _hashStateX = os::random() ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  _hashStateY = 842502087 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  _hashStateZ = 0x8767 ;    // (int)(3579807591LL & 0xffff) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  _hashStateW = 273326509 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  _OnTrap   = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  _schedctl = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  _Stalled  = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  _TypeTag  = 0x2BAD ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // Many of the following fields are effectively final - immutable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // Note that nascent threads can't use the Native Monitor-Mutex
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // construct until the _MutexEvent is initialized ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // CONSIDER: instead of using a fixed set of purpose-dedicated ParkEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // we might instead use a stack of ParkEvents that we could provision on-demand.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // The stack would act as a cache to avoid calls to ParkEvent::Allocate()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // and ::Release()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  _ParkEvent   = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  _SleepEvent  = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  _MutexEvent  = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  _MuxEvent    = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
#ifdef CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  if (CheckUnhandledOops) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    _unhandled_oops = new UnhandledOops(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
#endif // CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    assert((((uintptr_t) this) & (markOopDesc::biased_lock_alignment - 1)) == 0, "forced alignment of thread object failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    assert(this == _real_malloc_address ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
           this == (void*) align_size_up((intptr_t) _real_malloc_address, markOopDesc::biased_lock_alignment),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
           "bug in forced alignment of thread objects");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
#endif /* ASSERT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
void Thread::initialize_thread_local_storage() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // Note: Make sure this method only calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // non-blocking operations. Otherwise, it might not work
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // with the thread-startup/safepoint interaction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  // During Java thread startup, safepoint code should allow this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // method to complete because it may need to allocate memory to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // store information for the new thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // initialize structure dependent on thread local storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  ThreadLocalStorage::set_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
void Thread::record_stack_base_and_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  set_stack_base(os::current_stack_base());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  set_stack_size(os::current_stack_size());
13859
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   315
  // CR 7190089: on Solaris, primordial thread's stack is adjusted
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   316
  // in initialize_thread(). Without the adjustment, stack size is
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   317
  // incorrect if stack is set to unlimited (ulimit -s unlimited).
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   318
  // So far, only Solaris has real implementation of initialize_thread().
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   319
  //
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   320
  // set up any platform-specific state.
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   321
  os::initialize_thread(this);
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   322
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
   323
#if INCLUDE_NMT
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   324
  // record thread's native stack, stack grows downward
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   325
  address stack_low_addr = stack_base() - stack_size();
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   326
  MemTracker::record_thread_stack(stack_low_addr, stack_size(), this,
13859
7fe4578493fc 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 13748
diff changeset
   327
      CURRENT_PC);
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
   328
#endif // INCLUDE_NMT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
Thread::~Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // Reclaim the objectmonitors from the omFreeList of the moribund thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  ObjectSynchronizer::omFlush (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
13748
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   336
  // stack_base can be NULL if the thread is never started or exited before
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   337
  // record_stack_base_and_size called. Although, we would like to ensure
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   338
  // that all started threads do call record_stack_base_and_size(), there is
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   339
  // not proper way to enforce that.
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
   340
#if INCLUDE_NMT
13748
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   341
  if (_stack_base != NULL) {
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   342
    address low_stack_addr = stack_base() - stack_size();
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   343
    MemTracker::release_thread_stack(low_stack_addr, stack_size(), this);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   344
#ifdef ASSERT
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   345
    set_stack_base(NULL);
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
   346
#endif
13748
c4455a44f974 7198529: NPG: assert with NMT code in Thread destructor
zgu
parents: 13744
diff changeset
   347
  }
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
   348
#endif // INCLUDE_NMT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
   349
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // deallocate data structures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  delete resource_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // since the handle marks are using the handle area, we have to deallocated the root
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // handle mark before deallocating the thread's handle area,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  assert(last_handle_mark() != NULL, "check we have an element");
17031
9a576749065b 8012907: anti-delta fix for 8010992
dcubed
parents: 17026
diff changeset
   355
  delete last_handle_mark();
9a576749065b 8012907: anti-delta fix for 8010992
dcubed
parents: 17026
diff changeset
   356
  assert(last_handle_mark() == NULL, "check we have reached the end");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // It's possible we can encounter a null _ParkEvent, etc., in stillborn threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  // We NULL out the fields for good hygiene.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  ParkEvent::Release (_ParkEvent)   ; _ParkEvent   = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  ParkEvent::Release (_SleepEvent)  ; _SleepEvent  = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  ParkEvent::Release (_MutexEvent)  ; _MutexEvent  = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  ParkEvent::Release (_MuxEvent)    ; _MuxEvent    = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  delete handle_area();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   366
  delete metadata_handles();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // osthread() can be NULL, if creation of thread failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  if (osthread() != NULL) os::free_thread(osthread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  delete _SR_lock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // clear thread local storage if the Thread is deleting itself
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  if (this == Thread::current()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    ThreadLocalStorage::set_thread(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    // In the case where we're not the current thread, invalidate all the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    // caches in case some code tries to get the current thread or the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    // thread that was destroyed, and gets stale information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    ThreadLocalStorage::invalidate_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) delete unhandled_oops();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// NOTE: dummy function for assertion purpose.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
void Thread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
// Private method to check for dangling thread pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
void check_for_dangling_thread_pointer(Thread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
         "possibility of dangling Thread pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
// Tracing method for basic thread operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
void Thread::trace(const char* msg, const Thread* const thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  if (!TraceThreadEvents) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  ThreadCritical tc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  const char *name = "non-Java thread";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  int prio = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  if (thread->is_Java_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
      && !thread->is_Compiler_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    // The Threads_lock must be held to get information about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    // this thread but may not be in some situations when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    // tracing  thread events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    bool release_Threads_lock = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    if (!Threads_lock->owned_by_self()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      Threads_lock->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
      release_Threads_lock = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    JavaThread* jt = (JavaThread *)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
    name = (char *)jt->get_thread_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    oop thread_oop = jt->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
    if (thread_oop != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
      prio = java_lang_Thread::priority(thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    if (release_Threads_lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
      Threads_lock->unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  tty->print_cr("Thread::%s " INTPTR_FORMAT " [%lx] %s (prio: %d)", msg, thread, thread->osthread()->thread_id(), name, prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
ThreadPriority Thread::get_priority(const Thread* const thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  trace("get priority", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  ThreadPriority priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // Can return an error!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  (void)os::get_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  assert(MinPriority <= priority && priority <= MaxPriority, "non-Java priority found");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  return priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
void Thread::set_priority(Thread* thread, ThreadPriority priority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  trace("set priority", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // Can return an error!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  (void)os::set_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
void Thread::start(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  trace("start", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // Start is different from resume in that its safety is guaranteed by context or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // being called from a Java method synchronized on the Thread object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  if (!DisableStartThread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    if (thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      // Initialize the thread state to RUNNABLE before starting this thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
      // Can not set it after the thread started because we do not know the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
      // exact thread state at that time. It could be in MONITOR_WAIT or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
      // in SLEEPING or some other state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
      java_lang_Thread::set_thread_status(((JavaThread*)thread)->threadObj(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
                                          java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    os::start_thread(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
// Enqueue a VM_Operation to do the job for us - sometime later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
void Thread::send_async_exception(oop java_thread, oop java_throwable) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  VM_ThreadStop* vm_stop = new VM_ThreadStop(java_thread, java_throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  VMThread::execute(vm_stop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
// Check if an external suspend request has completed (or has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
// cancelled). Returns true if the thread is externally suspended and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
// false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
// The bits parameter returns information about the code path through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
// the routine. Useful for debugging:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
// set in is_ext_suspend_completed():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
// 0x00000001 - routine was entered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
// 0x00000010 - routine return false at end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
// 0x00000100 - thread exited (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
// 0x00000200 - suspend request cancelled (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
// 0x00000400 - thread suspended (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
// 0x00001000 - thread is in a suspend equivalent state (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
// 0x00002000 - thread is native and walkable (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
// 0x00004000 - thread is native_trans and walkable (needed retry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
// set in wait_for_ext_suspend_completion():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
// 0x00010000 - routine was entered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
// 0x00020000 - suspend request cancelled before loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
// 0x00040000 - thread suspended before loop (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
// 0x00080000 - suspend request cancelled in loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
// 0x00100000 - thread suspended in loop (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
// 0x00200000 - suspend not completed during retry loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
// Helper class for tracing suspend wait debug bits.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
// 0x00000100 indicates that the target thread exited before it could
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
// self-suspend which is not a wait failure. 0x00000200, 0x00020000 and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
// 0x00080000 each indicate a cancelled suspend request so they don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
// count as wait failures either.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
#define DEBUG_FALSE_BITS (0x00000010 | 0x00200000)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
class TraceSuspendDebugBits : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  JavaThread * jt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  bool         is_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  bool         called_by_wait;  // meaningful when !is_wait
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  uint32_t *   bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  TraceSuspendDebugBits(JavaThread *_jt, bool _is_wait, bool _called_by_wait,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
                        uint32_t *_bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    jt             = _jt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
    is_wait        = _is_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    called_by_wait = _called_by_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    bits           = _bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  ~TraceSuspendDebugBits() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    if (!is_wait) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
#if 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
      // By default, don't trace bits for is_ext_suspend_completed() calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      // That trace is very chatty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
      if (!called_by_wait) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
        // If tracing for is_ext_suspend_completed() is enabled, then only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
        // trace calls to it from wait_for_ext_suspend_completion()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    if (AssertOnSuspendWaitFailure || TraceSuspendWaitFailures) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
      if (bits != NULL && (*bits & DEBUG_FALSE_BITS) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
        MutexLocker ml(Threads_lock);  // needed for get_thread_name()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
        tty->print_cr(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
            "Failed wait_for_ext_suspend_completion(thread=%s, debug_bits=%x)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
            jt->get_thread_name(), *bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
        guarantee(!AssertOnSuspendWaitFailure, "external suspend wait failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
#undef DEBUG_FALSE_BITS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
bool JavaThread::is_ext_suspend_completed(bool called_by_wait, int delay, uint32_t *bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  TraceSuspendDebugBits tsdb(this, false /* !is_wait */, called_by_wait, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  bool did_trans_retry = false;  // only do thread_in_native_trans retry once
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  bool do_trans_retry;           // flag to force the retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  *bits |= 0x00000001;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    do_trans_retry = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    if (is_exiting()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
      // Thread is in the process of exiting. This is always checked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
      // first to reduce the risk of dereferencing a freed JavaThread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
      *bits |= 0x00000100;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
      // Suspend request is cancelled. This is always checked before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
      // is_ext_suspended() to reduce the risk of a rogue resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
      // confusing the thread that made the suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
      *bits |= 0x00000200;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    if (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
      // thread is suspended
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
      *bits |= 0x00000400;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    // Now that we no longer do hard suspends of threads running
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    // native code, the target thread can be changing thread state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    // while we are in this routine:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    //   _thread_in_native -> _thread_in_native_trans -> _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    // We save a copy of the thread state as observed at this moment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    // and make our decision about suspend completeness based on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    // copy. This closes the race where the thread state is seen as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    // _thread_in_native_trans in the if-thread_blocked check, but is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
    // seen as _thread_blocked in if-thread_in_native_trans check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    JavaThreadState save_state = thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
    if (save_state == _thread_blocked && is_suspend_equivalent()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
      // If the thread's state is _thread_blocked and this blocking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
      // condition is known to be equivalent to a suspend, then we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
      // consider the thread to be externally suspended. This means that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
      // the code that sets _thread_blocked has been modified to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
      // self-suspension if the blocking condition releases. We also
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
      // used to check for CONDVAR_WAIT here, but that is now covered by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
      // the _thread_blocked with self-suspension check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
      // Return true since we wouldn't be here unless there was still an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
      // external suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
      *bits |= 0x00001000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
    } else if (save_state == _thread_in_native && frame_anchor()->walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
      // Threads running native code will self-suspend on native==>VM/Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      // transitions. If its stack is walkable (should always be the case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
      // unless this function is called before the actual java_suspend()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
      // call), then the wait is done.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
      *bits |= 0x00002000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    } else if (!called_by_wait && !did_trans_retry &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
               save_state == _thread_in_native_trans &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
               frame_anchor()->walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
      // The thread is transitioning from thread_in_native to another
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      // thread state. check_safepoint_and_suspend_for_native_trans()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
      // will force the thread to self-suspend. If it hasn't gotten
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
      // there yet we may have caught the thread in-between the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
      // code check above and the self-suspend. Lucky us. If we were
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
      // called by wait_for_ext_suspend_completion(), then it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
      // will be doing the retries so we don't have to.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      // Since we use the saved thread state in the if-statement above,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
      // there is a chance that the thread has already transitioned to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
      // _thread_blocked by the time we get here. In that case, we will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
      // make a single unnecessary pass through the logic below. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
      // doesn't hurt anything since we still do the trans retry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
      *bits |= 0x00004000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
      // Once the thread leaves thread_in_native_trans for another
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
      // thread state, we break out of this retry loop. We shouldn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
      // need this flag to prevent us from getting back here, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
      // sometimes paranoia is good.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
      did_trans_retry = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
      // We wait for the thread to transition to a more usable state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
      for (int i = 1; i <= SuspendRetryCount; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
        // We used to do an "os::yield_all(i)" call here with the intention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
        // that yielding would increase on each retry. However, the parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
        // is ignored on Linux which means the yield didn't scale up. Waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
        // on the SR_lock below provides a much more predictable scale up for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
        // the delay. It also provides a simple/direct point to check for any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
        // safepoint requests from the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
        // temporarily drops SR_lock while doing wait with safepoint check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
        // (if we're a JavaThread - the WatcherThread can also call this)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
        // and increase delay with each retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
        SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
        // check the actual thread state instead of what we saved above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
        if (thread_state() != _thread_in_native_trans) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
          // the thread has transitioned to another thread state so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
          // try all the checks (except this one) one more time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
          do_trans_retry = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
      } // end retry loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  } while (do_trans_retry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  *bits |= 0x00000010;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
// Wait for an external suspend request to complete (or be cancelled).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
// Returns true if the thread is externally suspended and false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
bool JavaThread::wait_for_ext_suspend_completion(int retries, int delay,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
       uint32_t *bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  TraceSuspendDebugBits tsdb(this, true /* is_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
                             false /* !called_by_wait */, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  // local flag copies to minimize SR_lock hold time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  bool is_suspended;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  bool pending;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  uint32_t reset_bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  // set a marker so is_ext_suspend_completed() knows we are the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  *bits |= 0x00010000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  // We use reset_bits to reinitialize the bits value at the top of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  // each retry loop. This allows the caller to make use of any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // unused bits for their own marking purposes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  reset_bits = *bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
                                            delay, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
    pending = is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  // must release SR_lock to allow suspension to complete
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  if (!pending) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    // A cancelled suspend request is the only false return from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    // is_ext_suspend_completed() that keeps us from entering the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    // retry loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    *bits |= 0x00020000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  if (is_suspended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    *bits |= 0x00040000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  for (int i = 1; i <= retries; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    *bits = reset_bits;  // reinit to only track last retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    // We used to do an "os::yield_all(i)" call here with the intention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    // that yielding would increase on each retry. However, the parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    // is ignored on Linux which means the yield didn't scale up. Waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
    // on the SR_lock below provides a much more predictable scale up for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    // the delay. It also provides a simple/direct point to check for any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
    // safepoint requests from the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
      MutexLocker ml(SR_lock());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
      // wait with safepoint check (if we're a JavaThread - the WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
      // can also call this)  and increase delay with each retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
      SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
                                              delay, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
      // It is possible for the external suspend request to be cancelled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
      // (by a resume) before the actual suspend operation is completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
      // Refresh our local copy to see if we still need to wait.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
      pending = is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
    if (!pending) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
      // A cancelled suspend request is the only false return from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
      // is_ext_suspend_completed() that keeps us from staying in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
      // retry loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
      *bits |= 0x00080000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
    if (is_suspended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
      *bits |= 0x00100000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  } // end retry loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  // thread did not suspend after all our retries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  *bits |= 0x00200000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
void JavaThread::record_jump(address target, address instr, const char* file, int line) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  // This should not need to be atomic as the only way for simultaneous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  // updates is via interrupts. Even then this should be rare or non-existant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  // and we don't care that much anyway.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  int index = _jmp_ring_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  _jmp_ring_index = (index + 1 ) & (jump_ring_buffer_size - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  _jmp_ring[index]._target = (intptr_t) target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  _jmp_ring[index]._instruction = (intptr_t) instr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  _jmp_ring[index]._file = file;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  _jmp_ring[index]._line = line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
#endif /* PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
// Called by flat profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
// Callers have already called wait_for_ext_suspend_completion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
// The assertion for that is currently too complex to put here:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
bool JavaThread::profile_last_Java_frame(frame* _fr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  bool gotframe = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  // self suspension saves needed state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  if (has_last_Java_frame() && _anchor.walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
     *_fr = pd_last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
     gotframe = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  return gotframe;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
void Thread::interrupt(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  trace("interrupt", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  os::interrupt(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
bool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  trace("is_interrupted", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  // Note:  If clear_interrupted==false, this simply fetches and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  // returns the value of the field osthread()->interrupted().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  return os::is_interrupted(thread, clear_interrupted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
// GC Support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  jint thread_parity = _oops_do_parity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  if (thread_parity != strong_roots_parity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10546
diff changeset
   813
    if (res == thread_parity) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10546
diff changeset
   814
      return true;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10546
diff changeset
   815
    } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
      guarantee(res == strong_roots_parity, "Or else what?");
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
   817
      assert(SharedHeap::heap()->workers()->active_workers() > 0,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
   818
         "Should only fail when parallel.");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  }
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
   822
  assert(SharedHeap::heap()->workers()->active_workers() > 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
         "Should only fail when parallel.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
   827
void Thread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  active_handles()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  // Do oop for ThreadShadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  f->do_oop((oop*)&_pending_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  handle_area()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   834
void Thread::nmethods_do(CodeBlobClosure* cf) {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   835
  // no nmethods in a generic thread...
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   838
void Thread::metadata_do(void f(Metadata*)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   839
  if (metadata_handles() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   840
    for (int i = 0; i< metadata_handles()->length(); i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   841
      f(metadata_handles()->at(i));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   842
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   843
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   844
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   845
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
void Thread::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // get_priority assumes osthread initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  if (osthread() != NULL) {
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
   849
    int os_prio;
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
   850
    if (os::get_native_priority(this, &os_prio) == OS_OK) {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
   851
      st->print("os_prio=%d ", os_prio);
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
   852
    }
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
   853
    st->print("tid=" INTPTR_FORMAT " ", this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
    osthread()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  debug_only(if (WizardMode) print_owned_locks_on(st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
// Thread::print_on_error() is called by fatal error handler. Don't use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
// any lock or allocate memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
void Thread::print_on_error(outputStream* st, char* buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  if      (is_VM_thread())                  st->print("VMThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  else if (is_Compiler_thread())            st->print("CompilerThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  else if (is_Java_thread())                st->print("JavaThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  else if (is_GC_task_thread())             st->print("GCTaskThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
  else if (is_Watcher_thread())             st->print("WatcherThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  else if (is_ConcurrentGC_thread())        st->print("ConcurrentGCThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  else st->print("Thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  st->print(" [stack: " PTR_FORMAT "," PTR_FORMAT "]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
            _stack_base - _stack_size, _stack_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  if (osthread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
    st->print(" [id=%d]", osthread()->thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
void Thread::print_owned_locks_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  Monitor *cur = _owned_locks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  if (cur == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    st->print(" (no locks) ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
    st->print_cr(" Locks owned:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
    while(cur) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
      cur->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
      cur = cur->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
static int ref_use_count  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
bool Thread::owns_locks_but_compiled_lock() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    if (cur != Compile_lock) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
// The flag: potential_vm_operation notifies if this particular safepoint state could potential
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
// invoke the vm-thread (i.e., and oop allocation). In that case, we also have to make sure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
// no threads which allow_vm_block's are held
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
void Thread::check_for_valid_safepoint_state(bool potential_vm_operation) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
    // Check if current thread is allowed to block at a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
    if (!(_allow_safepoint_count == 0))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
      fatal("Possible safepoint reached by thread that does not allow it");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    if (is_Java_thread() && ((JavaThread*)this)->thread_state() != _thread_in_vm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
      fatal("LEAF method calling lock?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    if (potential_vm_operation && is_Java_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
        && !Universe::is_bootstrapping()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
      // Make sure we do not hold any locks that the VM thread also uses.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
      // This could potentially lead to deadlocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
      for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
        // Threads_lock is special, since the safepoint synchronization will not start before this is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
        // acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
        // since it is used to transfer control between JavaThreads and the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
        // Do not *exclude* any locks unless you are absolutly sure it is correct. Ask someone else first!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
        if ( (cur->allow_vm_block() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
              cur != Threads_lock &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
              cur != Compile_lock &&               // Temporary: should not be necessary when we get spearate compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
              cur != VMOperationRequest_lock &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
              cur != VMOperationQueue_lock) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
              cur->rank() == Mutex::special) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
          warning("Thread holding lock at safepoint that vm can block on: %s", cur->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
    if (GCALotAtAllSafepoints) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
      // We could enter a safepoint here and thus have a gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
      InterfaceSupport::check_gc_alot();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
bool Thread::is_in_stack(address adr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  assert(Thread::current() == this, "is_in_stack can only be called from current thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  address end = os::current_stack_pointer();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   949
  // Allow non Java threads to call this without stack_base
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   950
  if (_stack_base == NULL) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  if (stack_base() >= adr && adr >= end) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
18938
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   957
bool Thread::is_in_usable_stack(address adr) const {
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   958
  size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackYellowPages + StackRedPages) * os::vm_page_size() : 0;
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   959
  size_t usable_stack_size = _stack_size - stack_guard_size;
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   960
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   961
  return ((adr < stack_base()) && (adr >= stack_base() - usable_stack_size));
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   962
}
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   963
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18931
diff changeset
   964
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
// We had to move these methods here, because vm threads get into ObjectSynchronizer::enter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
// However, there is a note in JavaThread::is_lock_owned() about the VM threads not being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
// used for compilation in the future. If that change is made, the need for these methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
// should be revisited, and they should be removed if possible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
bool Thread::is_lock_owned(address adr) const {
6183
4c74cfe14f20 6975078: assert(allocated_on_res_area() || allocated_on_C_heap() || allocated_on_arena()
kvn
parents: 5888
diff changeset
   971
  return on_local_stack(adr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
bool Thread::set_as_starting_thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
 // NOTE: this must be called inside the main thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  return os::create_main_thread((JavaThread*)this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   979
static void initialize_class(Symbol* class_name, TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   980
  Klass* klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   981
  InstanceKlass::cast(klass)->initialize(CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
// Creates the initial ThreadGroup
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
static Handle create_initial_thread_group(TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
   987
  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ThreadGroup(), true, CHECK_NH);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  Handle system_instance = klass->allocate_instance_handle(CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
                            system_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
                            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   996
                            vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   997
                            vmSymbols::void_method_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
                            CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  Universe::set_system_thread_group(system_instance());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  Handle main_instance = klass->allocate_instance_handle(CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
    Handle string = java_lang_String::create_from_str("main", CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
                            main_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
                            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1009
                            vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1010
                            vmSymbols::threadgroup_string_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
                            system_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
                            string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
                            CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  return main_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
// Creates the initial Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1020
  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  java_lang_Thread::set_thread(thread_oop(), thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  java_lang_Thread::set_priority(thread_oop(), NormPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  thread->set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  Handle string = java_lang_String::create_from_str("main", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  JavaCalls::call_special(&result, thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
                                   klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1033
                                   vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1034
                                   vmSymbols::threadgroup_string_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
                                   thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
                                   string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
                                   CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  return thread_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
static void call_initializeSystemClass(TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1042
  Klass* k =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  JavaValue result(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1046
  JavaCalls::call_static(&result, klass, vmSymbols::initializeSystemClass_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1047
                                         vmSymbols::void_method_signature(), CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1050
char java_runtime_name[128] = "";
14289
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1051
char java_runtime_version[128] = "";
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1052
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1053
// extract the JRE name from sun.misc.Version.java_runtime_name
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1054
static const char* get_java_runtime_name(TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1055
  Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1056
                                      Handle(), Handle(), CHECK_AND_CLEAR_NULL);
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1057
  fieldDescriptor fd;
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1058
  bool found = k != NULL &&
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1059
               InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(),
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1060
                                                        vmSymbols::string_signature(), &fd);
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1061
  if (found) {
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1062
    oop name_oop = k->java_mirror()->obj_field(fd.offset());
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1063
    if (name_oop == NULL)
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1064
      return NULL;
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1065
    const char* name = java_lang_String::as_utf8_string(name_oop,
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1066
                                                        java_runtime_name,
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1067
                                                        sizeof(java_runtime_name));
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1068
    return name;
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1069
  } else {
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1070
    return NULL;
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1071
  }
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1072
}
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12373
diff changeset
  1073
14289
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1074
// extract the JRE version from sun.misc.Version.java_runtime_version
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1075
static const char* get_java_runtime_version(TRAPS) {
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1076
  Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1077
                                      Handle(), Handle(), CHECK_AND_CLEAR_NULL);
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1078
  fieldDescriptor fd;
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1079
  bool found = k != NULL &&
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1080
               InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_version_name(),
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1081
                                                        vmSymbols::string_signature(), &fd);
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1082
  if (found) {
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1083
    oop name_oop = k->java_mirror()->obj_field(fd.offset());
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1084
    if (name_oop == NULL)
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1085
      return NULL;
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1086
    const char* name = java_lang_String::as_utf8_string(name_oop,
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1087
                                                        java_runtime_version,
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1088
                                                        sizeof(java_runtime_version));
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1089
    return name;
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1090
  } else {
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1091
    return NULL;
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1092
  }
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1093
}
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 14120
diff changeset
  1094
7900
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1095
// General purpose hook into Java code, run once when the VM is initialized.
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1096
// The Java library method itself may be changed independently from the VM.
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1097
static void call_postVMInitHook(TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1098
  Klass* k = SystemDictionary::PostVMInitHook_klass();
7900
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1099
  instanceKlassHandle klass (THREAD, k);
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1100
  if (klass.not_null()) {
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1101
    JavaValue result(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1102
    JavaCalls::call_static(&result, klass, vmSymbols::run_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1103
                                           vmSymbols::void_method_signature(),
7900
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1104
                                           CHECK);
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1105
  }
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1106
}
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  1107
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
static void reset_vm_info_property(TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  // the vm info string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  const char *vm_info = VM_Version::vm_info_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  // java.lang.System class
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1114
  Klass* k =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  // setProperty arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  Handle key_str    = java_lang_String::create_from_str("java.vm.info", CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  Handle value_str  = java_lang_String::create_from_str(vm_info, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  // return value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
  JavaValue r(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  // public static String setProperty(String key, String value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  JavaCalls::call_static(&r,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
                         klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1127
                         vmSymbols::setProperty_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1128
                         vmSymbols::string_string_string_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
                         key_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
                         value_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
                         CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  assert(thread_group.not_null(), "thread group should be specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  assert(threadObj() == NULL, "should only create Java thread object once");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  1139
  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  java_lang_Thread::set_thread(thread_oop(), this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  java_lang_Thread::set_priority(thread_oop(), NormPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  if (thread_name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
    Handle name = java_lang_String::create_from_str(thread_name, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
    // Thread gets assigned specified name and null target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
                            thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
                            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1154
                            vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1155
                            vmSymbols::threadgroup_string_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
                            thread_group, // Argument 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
                            name,         // Argument 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
                            THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
    // Thread gets assigned name "Thread-nnn" and null target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
    // (java.lang.Thread doesn't have a constructor taking only a ThreadGroup argument)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
                            thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
                            klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1165
                            vmSymbols::object_initializer_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1166
                            vmSymbols::threadgroup_runnable_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
                            thread_group, // Argument 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
                            Handle(),     // Argument 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
                            THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  if (daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
      java_lang_Thread::set_daemon(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1181
  KlassHandle group(this, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  Handle threadObj(this, this->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
                         thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
                         group,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1187
                         vmSymbols::add_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1188
                         vmSymbols::thread_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
                         threadObj,          // Arg 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
                         THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
// NamedThread --  non-JavaThread subclasses with multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
// uniquely named instances should derive from this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
NamedThread::NamedThread() : Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  _name = NULL;
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  1199
  _processed_thread = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
NamedThread::~NamedThread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  if (_name != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1204
    FREE_C_HEAP_ARRAY(char, _name, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    _name = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
void NamedThread::set_name(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  guarantee(_name == NULL, "Only get to set name once.");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1211
  _name = NEW_C_HEAP_ARRAY(char, max_name_len, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  guarantee(_name != NULL, "alloc failure");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  jio_vsnprintf(_name, max_name_len, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
// ======= WatcherThread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
// The watcher thread exists to simulate timer interrupts.  It should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
// be replaced by an abstraction over whatever native support for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
// timer interrupts exists on the platform.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
WatcherThread* WatcherThread::_watcher_thread   = NULL;
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1226
bool WatcherThread::_startable = false;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1227
volatile bool  WatcherThread::_should_terminate = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
18943
7d0ef675e808 8020701: Avoid crashes in WatcherThread
rbackman
parents: 18938
diff changeset
  1229
WatcherThread::WatcherThread() : Thread(), _crash_protection(NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  assert(watcher_thread() == NULL, "we can only allocate one WatcherThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  if (os::create_thread(this, os::watcher_thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
    _watcher_thread = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
    // Set the watcher thread to the highest OS priority which should not be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
    // used, unless a Java thread with priority java.lang.Thread.MAX_PRIORITY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
    // is created. The only normal thread using this priority is the reference
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
    // handler thread, which runs for very short intervals only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
    // If the VMThread's priority is not lower than the WatcherThread profiling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    // will be inaccurate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
    os::set_priority(this, MaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
    if (!DisableStartThread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
      os::start_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1247
int WatcherThread::sleep() const {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1248
  MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1249
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1250
  // remaining will be zero if there are no tasks,
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1251
  // causing the WatcherThread to sleep until a task is
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1252
  // enrolled
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1253
  int remaining = PeriodicTask::time_to_wait();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1254
  int time_slept = 0;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1255
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1256
  // we expect this to timeout - we only ever get unparked when
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1257
  // we should terminate or when a new task has been enrolled
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1258
  OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1259
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1260
  jlong time_before_loop = os::javaTimeNanos();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1261
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1262
  for (;;) {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1263
    bool timedout = PeriodicTask_lock->wait(Mutex::_no_safepoint_check_flag, remaining);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1264
    jlong now = os::javaTimeNanos();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1265
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1266
    if (remaining == 0) {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1267
        // if we didn't have any tasks we could have waited for a long time
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1268
        // consider the time_slept zero and reset time_before_loop
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1269
        time_slept = 0;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1270
        time_before_loop = now;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1271
    } else {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1272
        // need to recalulate since we might have new tasks in _tasks
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1273
        time_slept = (int) ((now - time_before_loop) / 1000000);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1274
    }
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1275
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1276
    // Change to task list or spurious wakeup of some kind
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1277
    if (timedout || _should_terminate) {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1278
        break;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1279
    }
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1280
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1281
    remaining = PeriodicTask::time_to_wait();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1282
    if (remaining == 0) {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1283
        // Last task was just disenrolled so loop around and wait until
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1284
        // another task gets enrolled
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1285
        continue;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1286
    }
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1287
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1288
    remaining -= time_slept;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1289
    if (remaining <= 0)
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1290
      break;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1291
  }
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1292
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1293
  return time_slept;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1294
}
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1295
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
void WatcherThread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  assert(this == watcher_thread(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  this->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
  this->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  this->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
  while(!_should_terminate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    assert(watcher_thread() == Thread::current(),  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
    assert(watcher_thread() == this,  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
    // Calculate how long it'll be until the next PeriodicTask work
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
    // should be done, and sleep that amount of time.
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1308
    int time_waited = sleep();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
    if (is_error_reported()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
      // A fatal error has happened, the error handler(VMError::report_and_die)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
      // should abort JVM after creating an error log file. However in some
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
      // rare cases, the error handler itself might deadlock. Here we try to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
      // kill JVM if the fatal error handler fails to abort in 2 minutes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
      // This code is in WatcherThread because WatcherThread wakes up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
      // periodically so the fatal error handler doesn't need to do anything;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
      // also because the WatcherThread is less likely to crash than other
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
      // threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
      for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
        if (!ShowMessageBoxOnError
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
         && (OnError == NULL || OnError[0] == '\0')
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
         && Arguments::abort_hook() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
             os::sleep(this, 2 * 60 * 1000, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
             fdStream err(defaultStream::output_fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
             err.print_raw_cr("# [ timer expired, abort... ]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
             // skip atexit/vm_exit/vm_abort hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
             os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
        // Wake up 5 seconds later, the fatal handler may reset OnError or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
        // ShowMessageBoxOnError when it is ready to abort.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
        os::sleep(this, 5 * 1000, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1338
    PeriodicTask::real_time_tick(time_waited);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  // Signal that it is terminated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
    MutexLockerEx mu(Terminator_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
    _watcher_thread = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
    Terminator_lock->notify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
  // Thread destructor usually does this..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  ThreadLocalStorage::set_thread(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
void WatcherThread::start() {
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1353
  assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required");
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1354
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1355
  if (watcher_thread() == NULL && _startable) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
    _should_terminate = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
    // Create the single instance of WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
    new WatcherThread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1362
void WatcherThread::make_startable() {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1363
  assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required");
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1364
  _startable = true;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1365
}
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1366
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
void WatcherThread::stop() {
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1368
  {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1369
    MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1370
    _should_terminate = true;
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1371
    OrderAccess::fence();  // ensure WatcherThread sees update in main loop
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1372
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1373
    WatcherThread* watcher = watcher_thread();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1374
    if (watcher != NULL)
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1375
      watcher->unpark();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1376
  }
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1377
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
  // it is ok to take late safepoints here, if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  MutexLocker mu(Terminator_lock);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1380
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  while(watcher_thread() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
    // This wait should make safepoint checks, wait without a timeout,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
    // and wait as a suspend-equivalent condition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
    // Note: If the FlatProfiler is running, then this thread is waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
    // for the WatcherThread to terminate and the WatcherThread, via the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
    // FlatProfiler task, is waiting for the external suspend request on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
    // this thread to complete. wait_for_ext_suspend_completion() will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
    // eventually timeout, but that takes time. Making this wait a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
    // suspend-equivalent condition solves that timeout problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
    Terminator_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
                          Mutex::_as_suspend_equivalent_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1397
void WatcherThread::unpark() {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1398
  MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1399
  PeriodicTask_lock->notify();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1400
}
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  1401
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
void WatcherThread::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  st->print("\"%s\" ", name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  Thread::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
// ======= JavaThread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
// A JavaThread is a normal Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
void JavaThread::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  // Initialize fields
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1414
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1415
  // Set the claimed par_id to -1 (ie not claiming any par_ids)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1416
  set_claimed_par_id(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1417
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  set_saved_exception_pc(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
  set_threadObj(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  _anchor.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
  set_entry_point(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
  set_jni_functions(jni_functions());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
  set_callee_target(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
  set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  set_vm_result_2(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  set_vframe_array_head(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
  set_vframe_array_last(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
  set_deferred_locals(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
  set_deopt_mark(NULL);
6740
2bc601284215 6986270: guarantee(*bcp != Bytecodes::_monitorenter || exec_mode != Deoptimization::Unpack_exception) fails
iveresov
parents: 6273
diff changeset
  1430
  set_deopt_nmethod(NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
  clear_must_deopt_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
  set_monitor_chunks(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  set_next(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
  set_thread_state(_thread_new);
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  1435
#if INCLUDE_NMT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1436
  set_recorder(NULL);
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  1437
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
  _terminated = _not_terminated;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  _privileged_stack_top = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  _array_for_gc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  _suspend_equivalent = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  _in_deopt_handler = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  _doing_unsafe_access = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
  _exception_oop = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  _exception_pc  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
  _exception_handler_pc = 0;
7104
0c8b519af363 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 6769
diff changeset
  1448
  _is_method_handle_return = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  _jvmti_thread_state= NULL;
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4637
diff changeset
  1450
  _should_post_on_exceptions_flag = JNI_FALSE;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  _jvmti_get_loaded_classes_closure = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  _interp_only_mode    = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  _special_runtime_exit_condition = _no_async_condition;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  _pending_async_exception = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
  _is_compiling = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
  _thread_stat = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
  _thread_stat = new ThreadStatistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
  _blocked_on_compilation = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
  _jni_active_critical = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  _do_not_unlock_if_synchronized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  _cached_monitor_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  _parker = Parker::Allocate(this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  _jmp_ring_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  for (int ji = 0 ; ji < jump_ring_buffer_size ; ji++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
    record_jump(NULL, NULL, NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
#endif /* PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  set_thread_profiler(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  if (FlatProfiler::is_active()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
    // This is where we would decide to either give each thread it's own profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
    // or use one global one from FlatProfiler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
    // or up to some count of the number of profiled threads, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
    ThreadProfiler* pp = new ThreadProfiler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
    pp->engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
    set_thread_profiler(pp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
  // Setup safepoint state info for this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
  ThreadSafepointState::create(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  debug_only(_java_call_counter = 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  // JVMTI PopFrame support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
  _popframe_condition = popframe_inactive;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  _popframe_preserved_args = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  _popframe_preserved_args_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  pd_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1494
#if INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1495
SATBMarkQueueSet JavaThread::_satb_mark_queue_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1496
DirtyCardQueueSet JavaThread::_dirty_card_queue_set;
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1497
#endif // INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1498
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1499
JavaThread::JavaThread(bool is_attaching_via_jni) :
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1500
  Thread()
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1501
#if INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1502
  , _satb_mark_queue(&_satb_mark_queue_set),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1503
  _dirty_card_queue(&_dirty_card_queue_set)
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1504
#endif // INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1505
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
  initialize();
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1507
  if (is_attaching_via_jni) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1508
    _jni_attach_state = _attaching_via_jni;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1509
  } else {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1510
    _jni_attach_state = _not_attaching_via_jni;
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1511
  }
15492
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1512
  assert(deferred_card_mark().is_empty(), "Default MemRegion ctor");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1513
  _safepoint_visible = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
bool JavaThread::reguard_stack(address cur_sp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  if (_stack_guard_state != stack_guard_yellow_disabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
    return true; // Stack already guarded or guard pages not needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  if (register_stack_overflow()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
    // For those architectures which have separate register and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
    // memory stacks, we must check the register stack to see if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
    // it has overflowed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  // Java code never executes within the yellow zone: the latter is only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  // there to provoke an exception during stack banging.  If java code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  // is executing there, either StackShadowPages should be larger, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  // some exception code in c1, c2 or the interpreter isn't unwinding
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
  // when it should.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
  guarantee(cur_sp > stack_yellow_zone_base(), "not enough space to reguard - increase StackShadowPages");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
  enable_stack_yellow_zone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
bool JavaThread::reguard_stack(void) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  return reguard_stack(os::current_stack_pointer());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
void JavaThread::block_if_vm_exited() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
  if (_terminated == _vm_exited) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
    // _vm_exited is set at safepoint, and Threads_lock is never released
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
    // we will block here forever
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
    Threads_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
// Remove this ifdef when C1 is ported to the compiler interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
static void compiler_thread_entry(JavaThread* thread, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1557
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1558
  Thread()
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1559
#if INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1560
  , _satb_mark_queue(&_satb_mark_queue_set),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1561
  _dirty_card_queue(&_dirty_card_queue_set)
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1562
#endif // INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1563
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  if (TraceThreadEvents) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    tty->print_cr("creating thread %p", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
  initialize();
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1568
  _jni_attach_state = _not_attaching_via_jni;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
  set_entry_point(entry_point);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
  // Create the native thread itself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
  // %note runtime_23
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
  os::ThreadType thr_type = os::java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
  thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
                                                     os::java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  os::create_thread(this, thr_type, stack_sz);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1576
  _safepoint_visible = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
  // The _osthread may be NULL here because we ran out of memory (too many threads active).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
  // We need to throw and OutOfMemoryError - however we cannot do this here because the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
  // may hold a lock and all locks must be unlocked before throwing the exception (throwing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  // the exception consists of creating the exception object & initializing it, initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  // will leave the VM via a JavaCall and then all locks must be unlocked).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  // The thread is still suspended when we reach here. Thread must be explicit started
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  // by creator! Furthermore, the thread must also explicitly be added to the Threads list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  // by calling Threads:add. The reason why this is not done here, is because the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  // object must be fully initialized (take a look at JVM_Start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
JavaThread::~JavaThread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  if (TraceThreadEvents) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
      tty->print_cr("terminate thread %p", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  1594
  // By now, this thread should already be invisible to safepoint,
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  1595
  // and its per-thread recorder also collected.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1596
  assert(!is_safepoint_visible(), "wrong state");
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  1597
#if INCLUDE_NMT
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  1598
  assert(get_recorder() == NULL, "Already collected");
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  1599
#endif // INCLUDE_NMT
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  1600
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
  // JSR166 -- return the parker to the free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
  Parker::Release(_parker);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
  _parker = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
  // Free any remaining  previous UnrollBlock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  vframeArray* old_array = vframe_array_last();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
  if (old_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
    Deoptimization::UnrollBlock* old_info = old_array->unroll_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
    old_array->set_unroll_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
    delete old_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
    delete old_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
  GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = deferred_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
  if (deferred != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
    // This can only happen if thread is destroyed before deoptimization occurs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
    assert(deferred->length() != 0, "empty array!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
      jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
      deferred->remove_at(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
      // individual jvmtiDeferredLocalVariableSet are CHeapObj's
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
      delete dlv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
    } while (deferred->length() != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
    delete deferred;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
  // All Java related clean up happens in exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  ThreadSafepointState::destroy(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  if (_thread_profiler != NULL) delete _thread_profiler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
  if (_thread_stat != NULL) delete _thread_stat;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
// The first routine called by a new Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
void JavaThread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  // initialize thread-local alloc buffer related fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
  this->initialize_tlab();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
  // used to test validitity of stack trace backs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
  this->record_base_of_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
  // Record real stack base and size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
  this->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
  // Initialize thread local storage; set before calling MutexLocker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
  this->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  this->create_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1651
  this->cache_global_variables();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1652
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
  // Thread is now sufficient initialized to be handled by the safepoint code as being
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  // in the VM. Change thread state from _thread_new to _thread_in_vm
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
  ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
  assert(JavaThread::current() == this, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
  assert(!Thread::current()->owns_locks(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  DTRACE_THREAD_PROBE(start, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  // This operation might block. We call that after all safepoint checks for a new thread has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  // been completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  this->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
  if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
    JvmtiExport::post_thread_start(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1670
  EventThreadStart event;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1671
  if (event.should_commit()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1672
     event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1673
     event.commit();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1674
  }
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1675
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
  // We call another function to do the rest so we are sure that the stack addresses used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
  // from there will be lower than the stack base just computed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
  thread_main_inner();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
  // Note, thread is no longer valid at this point!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
void JavaThread::thread_main_inner() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
  assert(JavaThread::current() == this, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  assert(this->threadObj() != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1688
  // Execute thread entry point unless this thread has a pending exception
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1689
  // or has been stopped before starting.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
  // Note: Due to JVM_StopThread we can have pending exceptions already!
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1691
  if (!this->has_pending_exception() &&
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1692
      !java_lang_Thread::is_stillborn(this->threadObj())) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1693
    {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1694
      ResourceMark rm(this);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1695
      this->set_native_thread_name(this->get_thread_name());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1696
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
    HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
    this->entry_point()(this, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
  DTRACE_THREAD_PROBE(stop, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
  this->exit(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
  delete this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
static void ensure_join(JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
  // We do not need to grap the Threads_lock, since we are operating on ourself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
  Handle threadObj(thread, thread->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  assert(threadObj.not_null(), "java thread object must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  ObjectLocker lock(threadObj, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
  // Ignore pending exception (ThreadDeath), since we are exiting anyway
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  // Thread is exiting. So set thread_status field in  java.lang.Thread class to TERMINATED.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
  java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1717
  // Clear the native thread instance - this makes isAlive return false and allows the join()
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7900
diff changeset
  1718
  // to complete once we've done the notify_all below
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  java_lang_Thread::set_thread(threadObj(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
  lock.notify_all(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  // Ignore pending exception (ThreadDeath), since we are exiting anyway
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
  thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1725
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
// For any new cleanup additions, please check to see if they need to be applied to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
// cleanup_failed_attach_current_thread as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
  assert(this == JavaThread::current(),  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
  HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
  Handle uncaught_exception(this, this->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  this->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
  Handle threadObj(this, this->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
  assert(threadObj.not_null(), "Java thread object should be created");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
  if (get_thread_profiler() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
    get_thread_profiler()->disengage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
    get_thread_profiler()->print(get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  // FIXIT: This code should be moved into else part, when reliable 1.2/1.3 check is in place
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
  // FIXIT: The is_null check is only so it works better on JDK1.2 VM's. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
  // has to be fixed by a runtime query method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
  if (!destroy_vm || JDK_Version::is_jdk12x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
    // JSR-166: change call from from ThreadGroup.uncaughtException to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
    // java.lang.Thread.dispatchUncaughtException
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
    if (uncaught_exception.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
      Handle group(this, java_lang_Thread::threadGroup(threadObj()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
        EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
        // Check if the method Thread.dispatchUncaughtException() exists. If so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
        // call it.  Otherwise we have an older library without the JSR-166 changes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
        // so call ThreadGroup.uncaughtException()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
        KlassHandle recvrKlass(THREAD, threadObj->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
        CallInfo callinfo;
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1764
        KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
        LinkResolver::resolve_virtual_call(callinfo, threadObj, recvrKlass, thread_klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1766
                                           vmSymbols::dispatchUncaughtException_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1767
                                           vmSymbols::throwable_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
                                           KlassHandle(), false, false, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
        methodHandle method = callinfo.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
        if (method.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
          JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
                                  threadObj, thread_klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1775
                                  vmSymbols::dispatchUncaughtException_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1776
                                  vmSymbols::throwable_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
                                  uncaught_exception,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
                                  THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
        } else {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1780
          KlassHandle thread_group(THREAD, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
          JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
                                  group, thread_group,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1784
                                  vmSymbols::uncaughtException_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1785
                                  vmSymbols::thread_throwable_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
                                  threadObj,           // Arg 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
                                  uncaught_exception,  // Arg 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
                                  THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
        }
8115
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1790
        if (HAS_PENDING_EXCEPTION) {
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1791
          ResourceMark rm(this);
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1792
          jio_fprintf(defaultStream::error_stream(),
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1793
                "\nException: %s thrown from the UncaughtExceptionHandler"
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1794
                " in thread \"%s\"\n",
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14390
diff changeset
  1795
                pending_exception()->klass()->external_name(),
8115
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1796
                get_thread_name());
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1797
          CLEAR_PENDING_EXCEPTION;
1b3ccddac0ab 6472925: OutOfMemoryError fails to generate stack trace as it now ought
coleenp
parents: 8076
diff changeset
  1798
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1802
    // Called before the java thread exit since we want to read info
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1803
    // from java_lang_Thread object
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1804
    EventThreadEnd event;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1805
    if (event.should_commit()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1806
        event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1807
        event.commit();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  1808
    }
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1809
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1810
    // Call after last event on thread
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1811
    EVENT_THREAD_EXIT(this);
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  1812
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
    // Call Thread.exit(). We try 3 times in case we got another Thread.stop during
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
    // the execution of the method. If that is not enough, then we don't really care. Thread.stop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
    // is deprecated anyhow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
    { int count = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
      while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
        EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
        JavaValue result(T_VOID);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1820
        KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
        JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
                              threadObj, thread_klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1823
                              vmSymbols::exit_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1824
                              vmSymbols::void_method_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
                              THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
    // notify JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
    if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
      JvmtiExport::post_thread_end(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
    // We have notified the agents that we are exiting, before we go on,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
    // we must check for a pending external suspend request and honor it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
    // in order to not surprise the thread that made the suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
    while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
        MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
        if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
          set_terminated(_thread_exiting);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
          ThreadService::current_thread_exiting(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
        // Implied else:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
        // Things get a little tricky here. We have a pending external
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
        // suspend request, but we are holding the SR_lock so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
        // can't just self-suspend. So we temporarily drop the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
        // and then self-suspend.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
      ThreadBlockInVM tbivm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
      java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
      // We're done with this suspend request, but we have to loop around
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
      // and check again. Eventually we will get SR_lock without a pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
      // external suspend request and will be able to mark ourselves as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
      // exiting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
    // no more external suspends are allowed at this point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    // before_exit() has already posted JVMTI THREAD_END events
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  // Notify waiters on thread object. This has to be done after exit() is called
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
  // on the thread (if the thread is the last thread in a daemon ThreadGroup the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
  // group should have the destroyed bit set before waiters are notified).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  ensure_join(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  assert(!this->has_pending_exception(), "ensure_join should have cleared");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
  // 6282335 JNI DetachCurrentThread spec states that all Java monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  // held by this thread must be released.  A detach operation must only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  // get here if there are no Java frames on the stack.  Therefore, any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  // owned monitors at this point MUST be JNI-acquired monitors which are
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
  // pre-inflated and in the monitor cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
  // ensure_join() ignores IllegalThreadStateExceptions, and so does this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  if (exit_type == jni_detach && JNIDetachReleasesMonitors) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
    assert(!this->has_last_Java_frame(), "detaching with Java frames?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
    ObjectSynchronizer::release_monitors_owned_by_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
    assert(!this->has_pending_exception(), "release_monitors should have cleared");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
  // These things needs to be done while we are still a Java Thread. Make sure that thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  // is in a consistent state, in case GC happens
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  assert(_privileged_stack_top == NULL, "must be NULL when we get here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  if (active_handles() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
    JNIHandleBlock* block = active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
    set_active_handles(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
    JNIHandleBlock::release_block(block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
  if (free_handle_block() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
    JNIHandleBlock* block = free_handle_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
    set_free_handle_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
    JNIHandleBlock::release_block(block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  // These have to be removed while this is still a valid thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
  remove_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  if (UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
    tlab().make_parsable(true);  // retire TLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
7897
201a8b00ec91 6814943: getcpool001 catches more than one JvmtiThreadState problem
kamg
parents: 7724
diff changeset
  1908
  if (JvmtiEnv::environments_might_exist()) {
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1909
    JvmtiExport::cleanup_thread(this);
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1910
  }
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1911
15492
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1912
  // We must flush any deferred card marks before removing a thread from
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1913
  // the list of active threads.
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1914
  Universe::heap()->flush_deferred_store_barrier(this);
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1915
  assert(deferred_card_mark().is_empty(), "Should have been flushed");
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1916
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1917
#if INCLUDE_ALL_GCS
15492
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1918
  // We must flush the G1-related buffers before removing a thread
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1919
  // from the list of active threads. We must do this after any deferred
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1920
  // card marks have been flushed (above) so that any entries that are
7d3684b41115 8001384: G1: assert(!is_null(v)) failed: narrow oop value can never be zero
johnc
parents: 15221
diff changeset
  1921
  // added to the thread's dirty card queue as a result are not lost.
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1922
  if (UseG1GC) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1923
    flush_barrier_queues();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1924
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1925
#endif // INCLUDE_ALL_GCS
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1926
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  // Remove from list of active threads list, and notify VM thread if we are the last non-daemon thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
  Threads::remove(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1931
#if INCLUDE_ALL_GCS
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1932
// Flush G1-related queues.
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1933
void JavaThread::flush_barrier_queues() {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1934
  satb_mark_queue().flush();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1935
  dirty_card_queue().flush();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1936
}
6768
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1937
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1938
void JavaThread::initialize_queues() {
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1939
  assert(!SafepointSynchronize::is_at_safepoint(),
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1940
         "we should not be at a safepoint");
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1941
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1942
  ObjPtrQueue& satb_queue = satb_mark_queue();
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1943
  SATBMarkQueueSet& satb_queue_set = satb_mark_queue_set();
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1944
  // The SATB queue should have been constructed with its active
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1945
  // field set to false.
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1946
  assert(!satb_queue.is_active(), "SATB queue should not be active");
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1947
  assert(satb_queue.is_empty(), "SATB queue should be empty");
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1948
  // If we are creating the thread during a marking cycle, we should
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1949
  // set the active field of the SATB queue to true.
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1950
  if (satb_queue_set.is_active()) {
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1951
    satb_queue.set_active(true);
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1952
  }
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1953
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1954
  DirtyCardQueue& dirty_queue = dirty_card_queue();
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1955
  // The dirty card queue should have been constructed with its
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1956
  // active field set to true.
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1957
  assert(dirty_queue.is_active(), "dirty card queue should be active");
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1958
}
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1959
#endif // INCLUDE_ALL_GCS
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1960
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
void JavaThread::cleanup_failed_attach_current_thread() {
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1962
  if (get_thread_profiler() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1963
    get_thread_profiler()->disengage();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1964
    ResourceMark rm;
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1965
    get_thread_profiler()->print(get_thread_name());
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1966
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1967
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1968
  if (active_handles() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1969
    JNIHandleBlock* block = active_handles();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1970
    set_active_handles(NULL);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1971
    JNIHandleBlock::release_block(block);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1972
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1973
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1974
  if (free_handle_block() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1975
    JNIHandleBlock* block = free_handle_block();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1976
    set_free_handle_block(NULL);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1977
    JNIHandleBlock::release_block(block);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1978
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1979
5041
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4761
diff changeset
  1980
  // These have to be removed while this is still a valid thread.
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4761
diff changeset
  1981
  remove_stack_guard_pages();
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4761
diff changeset
  1982
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1983
  if (UseTLAB) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1984
    tlab().make_parsable(true);  // retire TLAB, if any
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1985
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1986
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1987
#if INCLUDE_ALL_GCS
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1988
  if (UseG1GC) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1989
    flush_barrier_queues();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1990
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  1991
#endif // INCLUDE_ALL_GCS
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1992
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1993
  Threads::remove(this);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1994
  delete this;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1998
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1999
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
JavaThread* JavaThread::active() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  Thread* thread = ThreadLocalStorage::thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  assert(thread != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  if (thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
    return (JavaThread*) thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
    assert(thread->is_VM_thread(), "this must be a vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
    VM_Operation* op = ((VMThread*) thread)->vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
    JavaThread *ret=op == NULL ? NULL : (JavaThread *)op->calling_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
    assert(ret->is_Java_thread(), "must be a Java thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
bool JavaThread::is_lock_owned(address adr) const {
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  2015
  if (Thread::is_lock_owned(adr)) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
  for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
    if (chunk->contains(adr)) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
void JavaThread::add_monitor_chunk(MonitorChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  chunk->set_next(monitor_chunks());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
  set_monitor_chunks(chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
void JavaThread::remove_monitor_chunk(MonitorChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  guarantee(monitor_chunks() != NULL, "must be non empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  if (monitor_chunks() == chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
    set_monitor_chunks(chunk->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
    MonitorChunk* prev = monitor_chunks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
    while (prev->next() != chunk) prev = prev->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
    prev->set_next(chunk->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
// JVM support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
// Note: this function shouldn't block if it's called in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
// _thread_in_native_trans state (such as from
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
// check_special_condition_for_native_trans()).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
void JavaThread::check_and_handle_async_exceptions(bool check_unsafe_error) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  if (has_last_Java_frame() && has_async_condition()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
    // If we are at a polling page safepoint (not a poll return)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
    // then we must defer async exception because live registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
    // will be clobbered by the exception path. Poll return is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
    // ok because the call we a returning from already collides
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
    // with exception handling registers and so there is no issue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
    // (The exception handling path kills call result registers but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
    //  this is ok since the exception kills the result anyway).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
    if (is_at_poll_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
      // if the code we are returning to has deoptimized we must defer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
      // the exception otherwise live registers get clobbered on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
      // exception path before deoptimization is able to retrieve them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
      RegisterMap map(this, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
      frame caller_fr = last_frame().sender(&map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
      assert(caller_fr.is_compiled_frame(), "what?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
      if (caller_fr.is_deoptimized_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
        if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
          ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
          tty->print_cr("deferred async exception at compiled safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  JavaThread::AsyncRequests condition = clear_special_runtime_exit_condition();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  if (condition == _no_async_condition) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
    // Conditions have changed since has_special_runtime_exit_condition()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
    // was called:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
    // - if we were here only because of an external suspend request,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
    //   then that was taken care of above (or cancelled) so we are done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
    // - if we were here because of another async request, then it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
    //   been cleared between the has_special_runtime_exit_condition()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
    //   and now so again we are done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
  // Check for pending async. exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
  if (_pending_async_exception != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
    // Only overwrite an already pending exception, if it is not a threadDeath.
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  2090
    if (!has_pending_exception() || !pending_exception()->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
      // We cannot call Exceptions::_throw(...) here because we cannot block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
      set_pending_exception(_pending_async_exception, __FILE__, __LINE__);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
      if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
        tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
        if (has_last_Java_frame() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
          frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
          tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
        }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2102
        tty->print_cr(" of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
      _pending_async_exception = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
      clear_has_async_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
  if (check_unsafe_error &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
      condition == _async_unsafe_access_error && !has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
    condition = _no_async_condition;  // done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
    switch (thread_state()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
    case _thread_in_vm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
        THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
    case _thread_in_native:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
        ThreadInVMfromNative tiv(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
        THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
    case _thread_in_Java:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
        ThreadInVMfromJava tiv(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
        THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in a recent unsafe memory access operation in compiled Java code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  assert(condition == _no_async_condition || has_pending_exception() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
         (!check_unsafe_error && condition == _async_unsafe_access_error),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
         "must have handled the async condition, if no exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
  // Check for pending external suspend. Internal suspend requests do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
  // not use handle_special_runtime_exit_condition().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
  // If JNIEnv proxies are allowed, don't self-suspend if the target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
  // thread is not the current thread. In older versions of jdbx, jdbx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
  // threads could call into the VM with another thread's JNIEnv so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  // can be here operating on behalf of a suspended thread (4432884).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
  bool do_self_suspend = is_external_suspend_with_lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
  if (do_self_suspend && (!AllowJNIEnvProxy || this == JavaThread::current())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
    // Because thread is external suspended the safepoint code will count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
    // thread as at a safepoint. This can be odd because we can be here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
    // as _thread_in_Java which would normally transition to _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
    // at a safepoint. We would like to mark the thread as _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
    // before calling java_suspend_self like all other callers of it but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
    // we must then observe proper safepoint protocol. (We can't leave
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
    // _thread_blocked with a safepoint in progress). However we can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
    // here as _thread_in_native_trans so we can't use a normal transition
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
    // constructor/destructor pair because they assert on that type of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
    // transition. We could do something like:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
    // JavaThreadState state = thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
    // set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
    // {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
    //   ThreadBlockInVM tbivm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
    //   java_suspend_self()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
    // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
    // set_thread_state(_thread_in_vm_trans);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
    // if (safepoint) block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
    // set_thread_state(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
    // but that is pretty messy. Instead we just go with the way the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
    // code has worked before and note that this is the only path to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
    // java_suspend_self that doesn't put the thread in _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
    // mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
    frame_anchor()->make_walkable(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
    java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
    // We might be here for reasons in addition to the self-suspend request
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
    // so check for other async requests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
  if (check_asyncs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
    check_and_handle_async_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
void JavaThread::send_thread_stop(oop java_throwable)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
  assert(Thread::current()->is_VM_thread(), "should be in the vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
  assert(Threads_lock->is_locked(), "Threads_lock should be locked by safepoint code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
  assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
  // Do not throw asynchronous exceptions against the compiler thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
  // (the compiler thread should not be a Java thread -- fix in 1.4.2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
  if (is_Compiler_thread()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
    // Actually throw the Throwable against the target Thread - however
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
    // only if there is no thread death exception installed already.
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  2201
    if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
      // If the topmost frame is a runtime stub, then we are calling into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
      // OptoRuntime from compiled code. Some runtime stubs (new, monitor_exit..)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
      // must deoptimize the caller before continuing, as the compiled  exception handler table
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
      // may not be valid
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
      if (has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
        frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
        if (f.is_runtime_frame() || f.is_safepoint_blob_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
          // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
          RegisterMap reg_map(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
          frame compiled_frame = f.sender(&reg_map);
14835
70896cb93c35 8004741: Missing compiled exception handle table entry for multidimensional array allocation
kvn
parents: 14633
diff changeset
  2212
          if (!StressCompiledExceptionHandlers && compiled_frame.can_be_deoptimized()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
            Deoptimization::deoptimize(this, compiled_frame, &reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
      // Set async. pending exception in thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
      set_pending_async_exception(java_throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
      if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
       ResourceMark rm;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2223
       tty->print_cr("Pending Async. exception installed of type: %s", InstanceKlass::cast(_pending_async_exception->klass())->external_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
      // for AbortVMOnException flag
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2226
      NOT_PRODUCT(Exceptions::debug_check_abort(InstanceKlass::cast(_pending_async_exception->klass())->external_name()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
  // Interrupt thread so it will wake up from a potential wait()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
  Thread::interrupt(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
// External suspension mechanism.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
// Tell the VM to suspend a thread when ever it knows that it does not hold on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
// to any VM_locks and it is at a transition
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
// Self-suspension will happen on the transition out of the vm.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
// Catch "this" coming in from JNIEnv pointers when the thread has been freed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
// Guarantees on return:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
//   + Target thread will not execute any new bytecode (that's why we need to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
//     force a safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
//   + Target thread will not enter any new monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
void JavaThread::java_suspend() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
  { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
    if (!Threads::includes(this) || is_exiting() || this->threadObj() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
       return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
  { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
    if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
      // a racing resume has cancelled us; bail out now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
    // suspend is done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
    uint32_t debug_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
    // Warning: is_ext_suspend_completed() may temporarily drop the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
    // SR_lock to allow the thread to reach a stable thread state if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
    // it is currently in a transient thread state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
    if (is_ext_suspend_completed(false /* !called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
                                 SuspendRetryDelay, &debug_bits) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
  VM_ForceSafepoint vm_suspend;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  VMThread::execute(&vm_suspend);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
// Part II of external suspension.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
// A JavaThread self suspends when it detects a pending external suspend
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
// request. This is usually on transitions. It is also done in places
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
// where continuing to the next transition would surprise the caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
// e.g., monitor entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
// Returns the number of times that the thread self-suspended.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
// Note: DO NOT call java_suspend_self() when you just want to block current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
//       thread. java_suspend_self() is the second stage of cooperative
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
//       suspension for external suspend requests and should only be used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
//       to complete an external suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
int JavaThread::java_suspend_self() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  int ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  // we are in the process of exiting so don't suspend
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
  if (is_exiting()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
     clear_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
     return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  assert(_anchor.walkable() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
    (is_Java_thread() && !((JavaThread*)this)->has_last_Java_frame()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
    "must have walkable stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
3826
67b89f5a5cac 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 3261
diff changeset
  2303
  assert(!this->is_ext_suspended(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
    "a thread trying to self-suspend should not already be suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
  if (this->is_suspend_equivalent()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
    // If we are self-suspending as a result of the lifting of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
    // suspend equivalent condition, then the suspend_equivalent
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
    // flag is not cleared until we set the ext_suspended flag so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
    // that wait_for_ext_suspend_completion() returns consistent
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
    // results.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
    this->clear_suspend_equivalent();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
  // A racing resume may have cancelled us before we grabbed SR_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
  // above. Or another external suspend request could be waiting for us
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
  // by the time we return from SR_lock()->wait(). The thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  // that requested the suspension may already be trying to walk our
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
  // stack and if we return now, we can change the stack out from under
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
  // it. This would be a "bad thing (TM)" and cause the stack walker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  // to crash. We stay self-suspended until there are no more pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
  // external suspend requests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  while (is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
    ret++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
    this->set_ext_suspended();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
    // _ext_suspended flag is cleared by java_resume()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
    while (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
      this->SR_lock()->wait(Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
// verify the JavaThread has not yet been published in the Threads::list, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
// hence doesn't need protection from concurrent access at this stage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
void JavaThread::verify_not_published() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
  if (!Threads_lock->owned_by_self()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
   MutexLockerEx ml(Threads_lock,  Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
   assert( !Threads::includes(this),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
           "java thread shouldn't have been published yet!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
   assert( !Threads::includes(this),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
           "java thread shouldn't have been published yet!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
// Slow path when the native==>VM/Java barriers detect a safepoint is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
// progress or when _suspend_flags is non-zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
// Current thread needs to self-suspend if there is a suspend request and/or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
// block if a safepoint is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
// Async exception ISN'T checked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
// Note only the ThreadInVMfromNative transition can call this function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
// directly and when thread state is _thread_in_native_trans
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
  assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
  JavaThread *curJT = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
  bool do_self_suspend = thread->is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
  assert(!curJT->has_last_Java_frame() || curJT->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
  // If JNIEnv proxies are allowed, don't self-suspend if the target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
  // thread is not the current thread. In older versions of jdbx, jdbx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
  // threads could call into the VM with another thread's JNIEnv so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
  // can be here operating on behalf of a suspended thread (4432884).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
  if (do_self_suspend && (!AllowJNIEnvProxy || curJT == thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
    JavaThreadState state = thread->thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
    // We mark this thread_blocked state as a suspend-equivalent so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
    // that a caller to is_ext_suspend_completed() won't be confused.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
    // The suspend-equivalent state is cleared by java_suspend_self().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
    thread->set_suspend_equivalent();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
    // If the safepoint code sees the _thread_in_native_trans state, it will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
    // wait until the thread changes to other thread state. There is no
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
    // guarantee on how soon we can obtain the SR_lock and complete the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
    // self-suspend request. It would be a bad idea to let safepoint wait for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
    // too long. Temporarily change the state to _thread_blocked to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
    // let the VM thread know that this thread is ready for GC. The problem
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
    // of changing thread state is that safepoint could happen just after
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
    // java_suspend_self() returns after being resumed, and VM thread will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
    // see the _thread_blocked state. We must check for safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
    // after restoring the state and make sure we won't leave while a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
    // is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
    thread->set_thread_state(_thread_blocked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
    thread->java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
    thread->set_thread_state(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
    // Make sure new state is seen by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
    if (os::is_MP()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
      if (UseMembar) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
        // Force a fence between the write above and read below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
        OrderAccess::fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
        // Must use this rather than serialization page in particular on Windows
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
        InterfaceSupport::serialize_memory(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
  if (SafepointSynchronize::do_call_back()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
    // If we are safepointing, then block the caller which may not be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
    // the same as the target thread (see above).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
    SafepointSynchronize::block(curJT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
  if (thread->is_deopt_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
    thread->clear_deopt_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
    RegisterMap map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
    frame f = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
    while ( f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
      f = f.sender(&map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
    if (f.id() == thread->must_deopt_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
      thread->clear_must_deopt_id();
6269
10e06287c0b0 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 6184
diff changeset
  2420
      f.deoptimize(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
      fatal("missed deoptimization!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
// Slow path when the native==>VM/Java barriers detect a safepoint is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
// progress or when _suspend_flags is non-zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
// Current thread needs to self-suspend if there is a suspend request and/or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
// block if a safepoint is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
// Also check for pending async exception (not including unsafe access error).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
// Note only the native==>VM/Java barriers can call this function and when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
// thread state is _thread_in_native_trans.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
void JavaThread::check_special_condition_for_native_trans(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
  check_safepoint_and_suspend_for_native_trans(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
  if (thread->has_async_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
    // We are in _thread_in_native_trans state, don't handle unsafe
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
    // access error since that may block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
    thread->check_and_handle_async_exceptions(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2444
// This is a variant of the normal
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2445
// check_special_condition_for_native_trans with slightly different
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2446
// semantics for use by critical native wrappers.  It does all the
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2447
// normal checks but also performs the transition back into
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2448
// thread_in_Java state.  This is required so that critical natives
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2449
// can potentially block and perform a GC if they are the last thread
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2450
// exiting the GC_locker.
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2451
void JavaThread::check_special_condition_for_native_trans_and_transition(JavaThread *thread) {
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2452
  check_special_condition_for_native_trans(thread);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2453
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2454
  // Finish the transition
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2455
  thread->set_thread_state(_thread_in_Java);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2456
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2457
  if (thread->do_critical_native_unlock()) {
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2458
    ThreadInVMfromJavaNoAsyncException tiv(thread);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2459
    GC_locker::unlock_critical(thread);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2460
    thread->clear_critical_native_unlock();
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2461
  }
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2462
}
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11636
diff changeset
  2463
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
// We need to guarantee the Threads_lock here, since resumes are not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
// allowed during safepoint synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
// Can only resume from an external suspension
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
void JavaThread::java_resume() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
  // Sanity check: thread is gone, has started exiting or the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
  // was not externally suspended.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
  if (!Threads::includes(this) || is_exiting() || !is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
  MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
  clear_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
  if (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
    clear_ext_suspended();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
    SR_lock()->notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
void JavaThread::create_stack_guard_pages() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  if (! os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
  address low_addr = stack_base() - stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
  size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
  int allocate = os::allocate_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
  // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 5041
diff changeset
  2494
  if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
    warning("Attempt to allocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
  if (os::guard_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
    _stack_guard_state = stack_guard_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
    warning("Attempt to protect stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
    if (os::uncommit_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
      warning("Attempt to deallocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
void JavaThread::remove_stack_guard_pages() {
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  2510
  assert(Thread::current() == this, "from different thread");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
  if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
  address low_addr = stack_base() - stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
  size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
  if (os::allocate_stack_guard_pages()) {
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 5041
diff changeset
  2516
    if (os::remove_stack_guard_pages((char *) low_addr, len)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
      _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
      warning("Attempt to deallocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
    if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
    if (os::unguard_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
      _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
        warning("Attempt to unprotect stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
void JavaThread::enable_stack_yellow_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
  assert(_stack_guard_state != stack_guard_enabled, "already enabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
  address base = stack_yellow_zone_base() - stack_yellow_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
  guarantee(base < stack_base(),"Error calculating stack yellow zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
  guarantee(base < os::current_stack_pointer(),"Error calculating stack yellow zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
  if (os::guard_memory((char *) base, stack_yellow_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
    _stack_guard_state = stack_guard_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
    warning("Attempt to guard stack yellow zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
  enable_register_stack_guard();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
void JavaThread::disable_stack_yellow_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
  assert(_stack_guard_state != stack_guard_yellow_disabled, "already disabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
  // Simply return if called for a thread that does not use guard pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
  if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
  address base = stack_yellow_zone_base() - stack_yellow_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
  if (os::unguard_memory((char *)base, stack_yellow_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
    _stack_guard_state = stack_guard_yellow_disabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
    warning("Attempt to unguard stack yellow zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
  disable_register_stack_guard();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
void JavaThread::enable_stack_red_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
  address base = stack_red_zone_base() - stack_red_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
  guarantee(base < stack_base(),"Error calculating stack red zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
  guarantee(base < os::current_stack_pointer(),"Error calculating stack red zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
  if(!os::guard_memory((char *) base, stack_red_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
    warning("Attempt to guard stack red zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
void JavaThread::disable_stack_red_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
  address base = stack_red_zone_base() - stack_red_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
  if (!os::unguard_memory((char *)base, stack_red_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
    warning("Attempt to unguard stack red zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
void JavaThread::frames_do(void f(frame*, const RegisterMap* map)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  // ignore is there is no stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
  // traverse the stack frames. Starts from top frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
    frame* fr = fst.current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
    f(fr, fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
// Deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
// Function for testing deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
void JavaThread::deoptimize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
  // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
  StackFrameStream fst(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
  bool deopt = false;           // Dump stack only if a deopt actually happens.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
  bool only_at = strlen(DeoptimizeOnlyAt) > 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
  // Iterate over all frames in the thread and deoptimize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
  for(; !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
    if(fst.current()->can_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
      if (only_at) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
        // Deoptimize only at particular bcis.  DeoptimizeOnlyAt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
        // consists of comma or carriage return separated numbers so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
        // search for the current bci in that string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
        address pc = fst.current()->pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
        nmethod* nm =  (nmethod*) fst.current()->cb();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
        ScopeDesc* sd = nm->scope_desc_at( pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
        char buffer[8];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
        jio_snprintf(buffer, sizeof(buffer), "%d", sd->bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
        size_t len = strlen(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
        const char * found = strstr(DeoptimizeOnlyAt, buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
        while (found != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
          if ((found[len] == ',' || found[len] == '\n' || found[len] == '\0') &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
              (found == DeoptimizeOnlyAt || found[-1] == ',' || found[-1] == '\n')) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
            // Check that the bci found is bracketed by terminators.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
          found = strstr(found + 1, buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
        if (!found) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
      if (DebugDeoptimization && !deopt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
        deopt = true; // One-time only print before deopt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
        tty->print_cr("[BEFORE Deoptimization]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
        trace_frames();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
        trace_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
      Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
  if (DebugDeoptimization && deopt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
    tty->print_cr("[AFTER Deoptimization]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
    trace_frames();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
// Make zombies
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
void JavaThread::make_zombies() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
    if (fst.current()->can_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
      // it is a Java nmethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
      nmethod* nm = CodeCache::find_nmethod(fst.current()->pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
      nm->make_not_entrant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
void JavaThread::deoptimized_wrt_marked_nmethods() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
  // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  StackFrameStream fst(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
  for(; !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
    if (fst.current()->should_be_deoptimized()) {
13964
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2676
      if (LogCompilation && xtty != NULL) {
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2677
        nmethod* nm = fst.current()->cb()->as_nmethod_or_null();
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2678
        xtty->elem("deoptimized thread='" UINTX_FORMAT "' compile_id='%d'",
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2679
                   this->name(), nm != NULL ? nm->compile_id() : -1);
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2680
      }
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13860
diff changeset
  2681
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
      Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
// GC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
static void frame_gc_epilogue(frame* f, const RegisterMap* map) { f->gc_epilogue(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
void JavaThread::gc_epilogue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  frames_do(frame_gc_epilogue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
static void frame_gc_prologue(frame* f, const RegisterMap* map) { f->gc_prologue(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
void JavaThread::gc_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
  frames_do(frame_gc_prologue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2702
// If the caller is a NamedThread, then remember, in the current scope,
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2703
// the given JavaThread in its _processed_thread field.
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2704
class RememberProcessedThread: public StackObj {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2705
  NamedThread* _cur_thr;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2706
public:
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2707
  RememberProcessedThread(JavaThread* jthr) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2708
    Thread* thread = Thread::current();
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2709
    if (thread->is_Named_thread()) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2710
      _cur_thr = (NamedThread *)thread;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2711
      _cur_thr->set_processed_thread(jthr);
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2712
    } else {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2713
      _cur_thr = NULL;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2714
    }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2715
  }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2716
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2717
  ~RememberProcessedThread() {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2718
    if (_cur_thr) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2719
      _cur_thr->set_processed_thread(NULL);
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2720
    }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2721
  }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2722
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  2724
void JavaThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4573
diff changeset
  2725
  // Verify that the deferred card marks have been flushed.
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4573
diff changeset
  2726
  assert(deferred_card_mark().is_empty(), "Should be empty during GC");
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3916
diff changeset
  2727
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
  // The ThreadProfiler oops_do is done from FlatProfiler::oops_do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
  // since there may be more than one thread using each ThreadProfiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
  // Traverse the GCHandles
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  2732
  Thread::oops_do(f, cld_f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
  assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
          (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
  if (has_last_Java_frame()) {
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2738
    // Record JavaThread to GC thread
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2739
    RememberProcessedThread rpt(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
    // Traverse the privileged stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
    if (_privileged_stack_top != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
      _privileged_stack_top->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
    // traverse the registered growable array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
    if (_array_for_gc != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
      for (int index = 0; index < _array_for_gc->length(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
        f->do_oop(_array_for_gc->adr_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
    // Traverse the monitor chunks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
    for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
      chunk->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
    // Traverse the execution stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
    for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  2760
      fst.current()->oops_do(f, cld_f, cf, fst.register_map());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
  // callee_target is never live across a gc point so NULL it here should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
  // it still contain a methdOop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  set_callee_target(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
  assert(vframe_array_head() == NULL, "deopt in progress at a safepoint!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  // If we have deferred set_locals there might be oops waiting to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
  // written
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
  GrowableArray<jvmtiDeferredLocalVariableSet*>* list = deferred_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
  if (list != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
    for (int i = 0; i < list->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
      list->at(i)->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
  // Traverse instance variables at the end since the GC may be moving things
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
  // around using this function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
  f->do_oop((oop*) &_threadObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
  f->do_oop((oop*) &_vm_result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
  f->do_oop((oop*) &_exception_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
  f->do_oop((oop*) &_pending_async_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
  if (jvmti_thread_state() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
    jvmti_thread_state()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2791
void JavaThread::nmethods_do(CodeBlobClosure* cf) {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2792
  Thread::nmethods_do(cf);  // (super method is a no-op)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
  assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
          (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
  if (has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
    // Traverse the execution stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
    for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2800
      fst.current()->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2805
void JavaThread::metadata_do(void f(Metadata*)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2806
  Thread::metadata_do(f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2807
  if (has_last_Java_frame()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2808
    // Traverse the execution stack to call f() on the methods in the stack
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2809
    for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2810
      fst.current()->metadata_do(f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2811
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2812
  } else if (is_Compiler_thread()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2813
    // need to walk ciMetadata in current compile tasks to keep alive.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2814
    CompilerThread* ct = (CompilerThread*)this;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2815
    if (ct->env() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2816
      ct->env()->metadata_do(f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2817
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2818
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2819
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  2820
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
// Printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
const char* _get_thread_state_name(JavaThreadState _thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
  switch (_thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
  case _thread_uninitialized:     return "_thread_uninitialized";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
  case _thread_new:               return "_thread_new";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
  case _thread_new_trans:         return "_thread_new_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
  case _thread_in_native:         return "_thread_in_native";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
  case _thread_in_native_trans:   return "_thread_in_native_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
  case _thread_in_vm:             return "_thread_in_vm";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
  case _thread_in_vm_trans:       return "_thread_in_vm_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
  case _thread_in_Java:           return "_thread_in_Java";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
  case _thread_in_Java_trans:     return "_thread_in_Java_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
  case _thread_blocked:           return "_thread_blocked";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
  case _thread_blocked_trans:     return "_thread_blocked_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
  default:                        return "unknown thread state";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
void JavaThread::print_thread_state_on(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
  st->print_cr("   JavaThread state: %s", _get_thread_state_name(_thread_state));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
void JavaThread::print_thread_state() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
  print_thread_state_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
// Called by Threads::print() for VM_PrintThreads operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
void JavaThread::print_on(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
  st->print("\"%s\" ", get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
  oop thread_oop = threadObj();
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  2852
  if (thread_oop != NULL) {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  2853
    st->print("#" INT64_FORMAT " ", java_lang_Thread::thread_id(thread_oop));
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  2854
    if (java_lang_Thread::is_daemon(thread_oop))  st->print("daemon ");
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  2855
    st->print("prio=%d ", java_lang_Thread::priority(thread_oop));
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  2856
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
  Thread::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
  // print guess for valid stack memory region (assume 4K pages); helps lock debugging
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  2859
  st->print_cr("[" INTPTR_FORMAT "]", (intptr_t)last_Java_sp() & ~right_n_bits(12));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
  if (thread_oop != NULL && JDK_Version::is_gte_jdk15x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
    st->print_cr("   java.lang.Thread.State: %s", java_lang_Thread::thread_status_name(thread_oop));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
  print_thread_state_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
  _safepoint_state->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
// Called by fatal error handler. The difference between this and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
// JavaThread::print() is that we can't grab lock or allocate memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
void JavaThread::print_on_error(outputStream* st, char *buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
  st->print("JavaThread \"%s\"",  get_thread_name_string(buf, buflen));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
     if (java_lang_Thread::is_daemon(thread_obj)) st->print(" daemon");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
  st->print(" [");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
  st->print("%s", _get_thread_state_name(_thread_state));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
  if (osthread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
    st->print(", id=%d", osthread()->thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
  st->print(", stack(" PTR_FORMAT "," PTR_FORMAT ")",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
            _stack_base - _stack_size, _stack_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
  st->print("]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
// Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2889
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
void JavaThread::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
  // Verify oops in the thread.
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  2894
  oops_do(&VerifyOopClosure::verify_oop, NULL, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
  // Verify the stack frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
  frames_do(frame_verify);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
// CR 6300358 (sub-CR 2137150)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
// Most callers of this method assume that it can't return NULL but a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
// thread may not have a name whilst it is in the process of attaching to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
// the VM - see CR 6412693, and there are places where a JavaThread can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
// seen prior to having it's threadObj set (eg JNI attaching threads and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
// if vm exit occurs during initialization). These cases can all be accounted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
// for such that this method never returns NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
const char* JavaThread::get_thread_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
  // early safepoints can hit while current thread does not yet have TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
  if (!SafepointSynchronize::is_at_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
    Thread *cur = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
    if (!(cur->is_Java_thread() && cur == this)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
      // Current JavaThreads are allowed to get their own name without
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
      // the Threads_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
      assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
    return get_thread_name_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
// Returns a non-NULL representation of this thread's name, or a suitable
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
// descriptive string if there is no set name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
const char* JavaThread::get_thread_name_string(char* buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
  const char* name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
    typeArrayOop name = java_lang_Thread::name(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
    if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
      if (buf == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
        name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
      else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
        name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length(), buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
    }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2937
    else if (is_attaching_via_jni()) { // workaround for 6412693 - see 6404306
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
      name_str = "<no-name - thread is attaching>";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
      name_str = Thread::name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
    name_str = Thread::name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
  assert(name_str != NULL, "unexpected NULL thread name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
  return name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
const char* JavaThread::get_threadgroup_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
  debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
    oop thread_group = java_lang_Thread::threadGroup(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
    if (thread_group != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
      typeArrayOop name = java_lang_ThreadGroup::name(thread_group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
      // ThreadGroup.name can be null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
      if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
        const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
        return str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
const char* JavaThread::get_parent_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
  debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
    oop thread_group = java_lang_Thread::threadGroup(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
    if (thread_group != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
      oop parent = java_lang_ThreadGroup::parent(thread_group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
      if (parent != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
        typeArrayOop name = java_lang_ThreadGroup::name(parent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
        // ThreadGroup.name can be null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
        if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
          const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
          return str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
ThreadPriority JavaThread::java_priority() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
  oop thr_oop = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
  if (thr_oop == NULL) return NormPriority; // Bootstrapping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
  ThreadPriority priority = java_lang_Thread::priority(thr_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
  assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
  return priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
void JavaThread::prepare(jobject jni_thread, ThreadPriority prio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
  assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
  // Link Java Thread object <-> C++ Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
  // Get the C++ thread object (an oop) from the JNI handle (a jthread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
  // and put it into a new Handle.  The Handle "thread_oop" can then
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
  // be used to pass the C++ thread object to other methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
  // Set the Java level thread object (jthread) field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
  // new thread (a JavaThread *) to C++ thread object using the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
  // "thread_oop" handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
  // Set the thread field (a JavaThread *) of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
  // oop representing the java_lang_Thread to the new thread (a JavaThread *).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
  Handle thread_oop(Thread::current(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
                    JNIHandles::resolve_non_null(jni_thread));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3015
  assert(InstanceKlass::cast(thread_oop->klass())->is_linked(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
    "must be initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
  set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
  java_lang_Thread::set_thread(thread_oop(), this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
  if (prio == NoPriority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
    prio = java_lang_Thread::priority(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
    assert(prio != NoPriority, "A valid priority should be present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
  // Push the Java priority down to the native thread; needs Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
  Thread::set_priority(this, prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
  // Add the new thread to the Threads list and set it in motion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
  // We must have threads lock in order to call Threads::add.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
  // It is crucial that we do not block before the thread is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
  // added to the Threads list for if a GC happens, then the java_thread oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
  // will not be visited by GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  Threads::add(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
oop JavaThread::current_park_blocker() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  // Support for JSR-166 locks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
  oop thread_oop = threadObj();
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3039
  if (thread_oop != NULL &&
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3040
      JDK_Version::current().supports_thread_park_blocker()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
    return java_lang_Thread::park_blocker(thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
void JavaThread::print_stack_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
  HandleMark   hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
  RegisterMap reg_map(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
  vframe* start_vf = last_java_vframe(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
  int count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
  for (vframe* f = start_vf; f; f = f->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
    if (f->is_java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
      javaVFrame* jvf = javaVFrame::cast(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
      java_lang_Throwable::print_stack_element(st, jvf->method(), jvf->bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
      // Print out lock information
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
      if (JavaMonitorsInStackTrace) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
        jvf->print_lock_info_on(st, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
      // Ignore non-Java frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
    // Bail-out case for too deep stacks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
    count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
    if (MaxJavaStackTraceDepth == count) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
// JVMTI PopFrame support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
  assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
  if (in_bytes(size_in_bytes) != 0) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3079
    _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes), mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3080
    _popframe_preserved_args_size = in_bytes(size_in_bytes);
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5707
diff changeset
  3081
    Copy::conjoint_jbytes(start, _popframe_preserved_args, _popframe_preserved_args_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
void* JavaThread::popframe_preserved_args() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
  return _popframe_preserved_args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
ByteSize JavaThread::popframe_preserved_args_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
  return in_ByteSize(_popframe_preserved_args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
WordSize JavaThread::popframe_preserved_args_size_in_words() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
  int sz = in_bytes(popframe_preserved_args_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
  assert(sz % wordSize == 0, "argument size must be multiple of wordSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
  return in_WordSize(sz / wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
void JavaThread::popframe_free_preserved_args() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
  assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3101
  FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
  _popframe_preserved_args = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
  _popframe_preserved_args_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3108
void JavaThread::trace_frames() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
  tty->print_cr("[Describe stack]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
  int frame_no = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
    tty->print("  %d. ", frame_no++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
    fst.current()->print_value_on(tty,this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3118
class PrintAndVerifyOopClosure: public OopClosure {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3119
 protected:
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3120
  template <class T> inline void do_oop_work(T* p) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3121
    oop obj = oopDesc::load_decode_heap_oop(p);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3122
    if (obj == NULL) return;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3123
    tty->print(INTPTR_FORMAT ": ", p);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3124
    if (obj->is_oop_or_null()) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3125
      if (obj->is_objArray()) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3126
        tty->print_cr("valid objArray: " INTPTR_FORMAT, (oopDesc*) obj);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3127
      } else {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3128
        obj->print();
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3129
      }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3130
    } else {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3131
      tty->print_cr("invalid oop: " INTPTR_FORMAT, (oopDesc*) obj);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3132
    }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3133
    tty->cr();
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3134
  }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3135
 public:
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3136
  virtual void do_oop(oop* p) { do_oop_work(p); }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3137
  virtual void do_oop(narrowOop* p)  { do_oop_work(p); }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3138
};
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3139
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3140
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3141
static void oops_print(frame* f, const RegisterMap *map) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3142
  PrintAndVerifyOopClosure print;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3143
  f->print_value();
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  3144
  f->oops_do(&print, NULL, NULL, (RegisterMap*)map);
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3145
}
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3146
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3147
// Print our all the locations that contain oops and whether they are
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3148
// valid or not.  This useful when trying to find the oldest frame
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3149
// where an oop has gone bad since the frame walk is from youngest to
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3150
// oldest.
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3151
void JavaThread::trace_oops() {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3152
  tty->print_cr("[Trace oops]");
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3153
  frames_do(oops_print);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3154
}
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10508
diff changeset
  3155
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
9946
b3d5b50e2289 7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents: 9942
diff changeset
  3157
#ifdef ASSERT
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3158
// Print or validate the layout of stack frames
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3159
void JavaThread::print_frame_layout(int depth, bool validate_only) {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3160
  ResourceMark rm;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3161
  PRESERVE_EXCEPTION_MARK;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3162
  FrameValues values;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3163
  int frame_no = 0;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3164
  for(StackFrameStream fst(this, false); !fst.is_done(); fst.next()) {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3165
    fst.current()->describe(values, ++frame_no);
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3166
    if (depth == frame_no) break;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3167
  }
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3168
  if (validate_only) {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3169
    values.validate();
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3170
  } else {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3171
    tty->print_cr("[Describe stack layout]");
10966
0c9ed2dfc6a2 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 10740
diff changeset
  3172
    values.print(this);
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3173
  }
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3174
}
9946
b3d5b50e2289 7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents: 9942
diff changeset
  3175
#endif
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8883
diff changeset
  3176
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3177
void JavaThread::trace_stack_from(vframe* start_vf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3178
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
  int vframe_no = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  for (vframe* f = start_vf; f; f = f->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
    if (f->is_java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
      javaVFrame::cast(f)->print_activation(vframe_no++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
      f->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
    if (vframe_no > StackPrintLimit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
      tty->print_cr("...<more frames>...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
void JavaThread::trace_stack() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
  HandleMark   hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
  RegisterMap reg_map(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
  trace_stack_from(last_java_vframe(&reg_map));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
javaVFrame* JavaThread::last_java_vframe(RegisterMap *reg_map) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
  assert(reg_map != NULL, "a map must be given");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
  frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
  for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
    if (vf->is_java_frame()) return javaVFrame::cast(vf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3216
Klass* JavaThread::security_get_caller_class(int depth) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
  vframeStream vfst(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
  vfst.security_get_caller_frame(depth);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
  if (!vfst.at_end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
    return vfst.method()->method_holder();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
static void compiler_thread_entry(JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
  assert(thread->is_Compiler_thread(), "must be compiler thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
  CompileBroker::compiler_thread_loop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
// Create a CompilerThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
CompilerThread::CompilerThread(CompileQueue* queue, CompilerCounters* counters)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
: JavaThread(&compiler_thread_entry) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
  _env   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  _log   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
  _task  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
  _queue = queue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  _counters = counters;
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  3238
  _buffer_blob = NULL;
9942
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3239
  _scanned_nmethod = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
  _ideal_graph_printer = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  3246
void CompilerThread::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  3247
  JavaThread::oops_do(f, cld_f, cf);
9942
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3248
  if (_scanned_nmethod != NULL && cf != NULL) {
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3249
    // Safepoints can occur when the sweeper is scanning an nmethod so
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3250
    // process it here to make sure it isn't unloaded in the middle of
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3251
    // a scan.
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3252
    cf->do_code_blob(_scanned_nmethod);
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3253
  }
2e86734ba620 6996747: SIGSEGV in nmethod::cleanup_inline_caches / CompiledIC::verify
never
parents: 9437
diff changeset
  3254
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
// ======= Threads ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
// The Threads class links together all active threads, and provides
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
// operations over all threads.  It is protected by its own Mutex
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
// lock, which is also used in other contexts to protect thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
// operations from having the thread being operated on from exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
// and going away unexpectedly (e.g., safepoint synchronization)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
JavaThread* Threads::_thread_list = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
int         Threads::_number_of_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
int         Threads::_number_of_non_daemon_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
int         Threads::_return_code = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
size_t      JavaThread::_stack_size_at_create = 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3269
#ifdef ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3270
bool        Threads::_vm_complete = false;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3271
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
// All JavaThreads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
#define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
void os_stream();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
// All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
void Threads::threads_do(ThreadClosure* tc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
  assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
  // ALL_JAVA_THREADS iterates through all JavaThreads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
    tc->do_thread(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
  // Someday we could have a table or list of all non-JavaThreads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
  // For now, just manually iterate through them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
  tc->do_thread(VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
  Universe::heap()->gc_threads_do(tc);
1127
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3289
  WatcherThread *wt = WatcherThread::watcher_thread();
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3290
  // Strictly speaking, the following NULL check isn't sufficient to make sure
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3291
  // the data for WatcherThread is still valid upon being examined. However,
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3292
  // considering that WatchThread terminates when the VM is on the way to
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3293
  // exit at safepoint, the chance of the above is extremely small. The right
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3294
  // way to prevent termination of WatcherThread would be to acquire
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3295
  // Terminator_lock, but we can't do that without violating the lock rank
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3296
  // checking in some cases.
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3297
  if (wt != NULL)
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3298
    tc->do_thread(wt);
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  3299
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
  // If CompilerThreads ever become non-JavaThreads, add them here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3305
  extern void JDK_Version_init();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3306
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
  // Check version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
  if (!is_supported_jni_version(args->version)) return JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
  // Initialize the output stream module
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
  ostream_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
  // Process java launcher properties.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
  Arguments::process_sun_java_launcher_properties(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
  // Initialize the os module before using TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
  os::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
  // Initialize system properties.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
  Arguments::init_system_properties();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3322
  // So that JDK version can be used as a discrimintor when parsing arguments
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3323
  JDK_Version_init();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  3324
6961
a32b2fc66321 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 6273
diff changeset
  3325
  // Update/Initialize System properties after JDK version number is known
a32b2fc66321 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 6273
diff changeset
  3326
  Arguments::init_version_specific_system_properties();
a32b2fc66321 6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents: 6273
diff changeset
  3327
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  // Parse arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
  jint parse_result = Arguments::parse(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  if (parse_result != JNI_OK) return parse_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19723
diff changeset
  3332
  os::init_before_ergo();
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19723
diff changeset
  3333
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19723
diff changeset
  3334
  jint ergo_result = Arguments::apply_ergo();
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19723
diff changeset
  3335
  if (ergo_result != JNI_OK) return ergo_result;
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19723
diff changeset
  3336
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
  if (PauseAtStartup) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
    os::pause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3341
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  HS_DTRACE_PROBE(hotspot, vm__init__begin);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3343
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3344
  HOTSPOT_VM_INIT_BEGIN();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3345
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  // Record VM creation timing statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
  TraceVmCreationTime create_vm_timer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
  create_vm_timer.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
  // Timing (must come after argument parsing)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
  TraceTime timer("Create VM", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  // Initialize the os module after parsing the args
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  jint os_init_2_result = os::init_2();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
  if (os_init_2_result != JNI_OK) return os_init_2_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
14580
3e2316663327 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 14490
diff changeset
  3358
  jint adjust_after_os_result = Arguments::adjust_after_os();
3e2316663327 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 14490
diff changeset
  3359
  if (adjust_after_os_result != JNI_OK) return adjust_after_os_result;
3e2316663327 7198334: UseNUMA modifies system parameters on non-NUMA system
brutisso
parents: 14490
diff changeset
  3360
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3361
  // intialize TLS
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3362
  ThreadLocalStorage::init();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3363
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3364
  // Bootstrap native memory tracking, so it can start recording memory
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3365
  // activities before worker thread is started. This is the first phase
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3366
  // of bootstrapping, VM is currently running in single-thread mode.
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3367
  MemTracker::bootstrap_single_thread();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3368
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  // Initialize output stream logging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
  ostream_init_log();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
  // Convert -Xrun to -agentlib: if there is no JVM_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
  // Must be before create_vm_init_agents()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
  if (Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
    convert_vm_init_libraries_to_agents();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
  // Launch -agentlib/-agentpath and converted -Xrun agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
  if (Arguments::init_agents_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
    create_vm_init_agents();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  // Initialize Threads state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
  _thread_list = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
  _number_of_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
  _number_of_non_daemon_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  // Initialize global data structures and create system classes in heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
  vm_init_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
  // Attach the main thread to this os thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
  JavaThread* main_thread = new JavaThread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
  main_thread->set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
  // must do this before set_active_handles and initialize_thread_local_storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
  // Note: on solaris initialize_thread_local_storage() will (indirectly)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
  // change the stack size recorded here to one based on the java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
  // stacksize. This adjusted size is what is used to figure the placement
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  // of the guard pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
  main_thread->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
  main_thread->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
  main_thread->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
  if (!main_thread->set_as_starting_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
    vm_shutdown_during_initialization(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
      "Failed necessary internal allocation. Out of swap space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
    delete main_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
    *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
    return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  // Enable guard page *after* os::create_main_thread(), otherwise it would
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
  // crash Linux VM, see notes in os_linux.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
  main_thread->create_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  3416
  // Initialize Java-Level synchronization subsystem
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  3417
  ObjectMonitor::Initialize() ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3419
  // Second phase of bootstrapping, VM is about entering multi-thread mode
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3420
  MemTracker::bootstrap_multi_thread();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3421
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
  // Initialize global modules
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
  jint status = init_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
  if (status != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
    delete main_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
    *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
    return status;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3430
  // Should be done after the heap is fully created
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3431
  main_thread->cache_global_variables();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3432
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
  { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
    Threads::add(main_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
  // Any JVMTI raw monitors entered in onload will transition into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  // real raw monitor. VM is setup enough here for raw monitor enter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
  JvmtiExport::transition_pending_onload_raw_monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3443
  // Fully start NMT
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3444
  MemTracker::start();
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3445
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
  // Create the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
  { TraceTime timer("Start VMThread", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
    VMThread::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
    Thread* vmthread = VMThread::vm_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
    if (!os::create_thread(vmthread, os::vm_thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
      vm_exit_during_initialization("Cannot create VM thread. Out of system resources.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
    // Wait for the VM thread to become ready, and VMThread::run to initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
    // Monitors can have spurious returns, must always check another state flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
      MutexLocker ml(Notify_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
      os::start_thread(vmthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
      while (vmthread->active_handles() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
        Notify_lock->wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
  assert (Universe::is_fully_initialized(), "not initialized");
16680
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16606
diff changeset
  3466
  if (VerifyDuringStartup) {
17112
e49af4ba7755 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 16680
diff changeset
  3467
    // Make sure we're starting with a clean slate.
e49af4ba7755 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 16680
diff changeset
  3468
    VM_Verify verify_op;
16680
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16606
diff changeset
  3469
    VMThread::execute(&verify_op);
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16394
diff changeset
  3470
  }
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16394
diff changeset
  3471
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
  EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
  // At this point, the Universe is initialized, but we have not executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  // any byte code.  Now is a good time (the only time) to dump out the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
  // internal state of the JVM for sharing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
  if (DumpSharedSpaces) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3478
    MetaspaceShared::preload_and_dump(CHECK_0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  // Always call even when there are not JVMTI environments yet, since environments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  // may be attached late and JVMTI must track phases of VM execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
  JvmtiExport::enter_start_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
  JvmtiExport::post_vm_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
    TraceTime timer("Initialize java.lang classes", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
    if (EagerXrunInit && Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
      create_vm_init_libraries();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
15214
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3496
    initialize_class(vmSymbols::java_lang_String(), CHECK_0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
    // Initialize java_lang.System (needed before creating the thread)
15214
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3499
    initialize_class(vmSymbols::java_lang_System(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3500
    initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3501
    Handle thread_group = create_initial_thread_group(CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3502
    Universe::set_main_thread_group(thread_group());
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3503
    initialize_class(vmSymbols::java_lang_Thread(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3504
    oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3505
    main_thread->set_threadObj(thread_object);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3506
    // Set thread status to running since main thread has
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3507
    // been started and running.
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3508
    java_lang_Thread::set_thread_status(thread_object,
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3509
                                        java_lang_Thread::RUNNABLE);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3510
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3511
    // The VM creates & returns objects of this class. Make sure it's initialized.
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3512
    initialize_class(vmSymbols::java_lang_Class(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3513
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3514
    // The VM preresolves methods to these classes. Make sure that they get initialized
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3515
    initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3516
    initialize_class(vmSymbols::java_lang_ref_Finalizer(),  CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3517
    call_initializeSystemClass(CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3518
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3519
    // get the Java runtime name after java.lang.System is initialized
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3520
    JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3521
    JDK_Version::set_runtime_version(get_java_runtime_version(THREAD));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
    // an instance of OutOfMemory exception has been allocated earlier
15214
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3524
    initialize_class(vmSymbols::java_lang_OutOfMemoryError(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3525
    initialize_class(vmSymbols::java_lang_NullPointerException(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3526
    initialize_class(vmSymbols::java_lang_ClassCastException(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3527
    initialize_class(vmSymbols::java_lang_ArrayStoreException(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3528
    initialize_class(vmSymbols::java_lang_ArithmeticException(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3529
    initialize_class(vmSymbols::java_lang_StackOverflowError(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3530
    initialize_class(vmSymbols::java_lang_IllegalMonitorStateException(), CHECK_0);
1795c6aeb583 8004018: Remove old initialization flags
brutisso
parents: 14844
diff changeset
  3531
    initialize_class(vmSymbols::java_lang_IllegalArgumentException(), CHECK_0);
8883
5569135acca3 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 8725
diff changeset
  3532
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
  // See        : bugid 4211085.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
  // Background : the static initializer of java.lang.Compiler tries to read
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
  //              property"java.compiler" and read & write property "java.vm.info".
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
  //              When a security manager is installed through the command line
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
  //              option "-Djava.security.manager", the above properties are not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
  //              readable and the static initializer for java.lang.Compiler fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
  //              resulting in a NoClassDefFoundError.  This can happen in any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
  //              user code which calls methods in java.lang.Compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
  // Hack :       the hack is to pre-load and initialize this class, so that only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
  //              system domains are on the stack when the properties are read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
  //              Currently even the AWT code has calls to methods in java.lang.Compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
  //              On the classic VM, java.lang.Compiler is loaded very early to load the JIT.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
  // Future Fix : the best fix is to grant everyone permissions to read "java.compiler" and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
  //              read and write"java.vm.info" in the default policy file. See bugid 4211383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
  //              Once that is done, we should remove this hack.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3549
  initialize_class(vmSymbols::java_lang_Compiler(), CHECK_0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
  // More hackery - the static initializer of java.lang.Compiler adds the string "nojit" to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
  // the java.vm.info property if no jit gets loaded through java.lang.Compiler (the hotspot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
  // compiler does not get loaded through java.lang.Compiler).  "java -version" with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
  // hotspot vm says "nojit" all the time which is confusing.  So, we reset it here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
  // This should also be taken out as soon as 4211383 gets fixed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
  reset_vm_info_property(CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
  quicken_jni_functions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11637
diff changeset
  3560
  // Must be run after init_ft which initializes ft_enabled
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11637
diff changeset
  3561
  if (TRACE_INITIALIZE() != JNI_OK) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11637
diff changeset
  3562
    vm_exit_during_initialization("Failed to initialize tracing backend");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11637
diff changeset
  3563
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11637
diff changeset
  3564
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
  // Set flag that basic initialization has completed. Used by exceptions and various
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
  // debug stuff, that does not work until all basic classes have been initialized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
  set_init_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3569
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3570
  HS_DTRACE_PROBE(hotspot, vm__init__end);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3571
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3572
  HOTSPOT_VM_INIT_END();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3573
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
  // record VM initialization completion time
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3576
#if INCLUDE_MANAGEMENT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3577
  Management::record_vm_init_completed();
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3578
#endif // INCLUDE_MANAGEMENT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
  // Compute system loader. Note that this has to occur after set_init_completed, since
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
  // valid exceptions may be thrown in the process.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
  // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  // set_init_completed has just been called, causing exceptions not to be shortcut
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
  // anymore. We call vm_exit_during_initialization directly instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
  SystemDictionary::compute_java_system_loader(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
    vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  3590
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
  // Support for ConcurrentMarkSweep. This should be cleaned up
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3592
  // and better encapsulated. The ugly nested if test would go away
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3593
  // once things are properly refactored. XXX YSR
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3594
  if (UseConcMarkSweepGC || UseG1GC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3595
    if (UseConcMarkSweepGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3596
      ConcurrentMarkSweepThread::makeSurrogateLockerThread(THREAD);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3597
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3598
      ConcurrentMarkThread::makeSurrogateLockerThread(THREAD);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3599
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
      vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  3604
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3605
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
  // Always call even when there are not JVMTI environments yet, since environments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
  // may be attached late and JVMTI must track phases of VM execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
  JvmtiExport::enter_live_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
  // Signal Dispatcher needs to be started before VMInit event is posted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
  os::signal_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3613
  // Start Attach Listener if +StartAttachListener or it can't be started lazily
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3614
  if (!DisableAttachMechanism) {
18931
5de3638104b4 7162400: Intermittent java.io.IOException: Bad file number during HotSpotVirtualMachine.executeCommand
allwin
parents: 18928
diff changeset
  3615
    AttachListener::vm_start();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
    if (StartAttachListener || AttachListener::init_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
      AttachListener::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3619
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
  // Launch -Xrun agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3622
  // Must be done in the JVMTI live phase so that for backward compatibility the JDWP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3623
  // back-end can launch with -Xdebug -Xrunjdwp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3624
  if (!EagerXrunInit && Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3625
    create_vm_init_libraries();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3626
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3627
12373
09835f62dc29 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 12108
diff changeset
  3628
  // Notify JVMTI agents that VM initialization is complete - nop if no agents.
09835f62dc29 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 12108
diff changeset
  3629
  JvmtiExport::post_vm_initialized();
09835f62dc29 7160924: jvmti: GetPhase returns incorrect phase before VMInit event is issued
rbackman
parents: 12108
diff changeset
  3630
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  3631
  if (TRACE_START() != JNI_OK) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17116
diff changeset
  3632
    vm_exit_during_initialization("Failed to start tracing backend.");
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  3633
  }
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11174
diff changeset
  3634
10022
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9992
diff changeset
  3635
  if (CleanChunkPoolAsync) {
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9992
diff changeset
  3636
    Chunk::start_chunk_pool_cleaner_task();
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9992
diff changeset
  3637
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3638
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3639
  // initialize compiler(s)
14622
8e94e4186d35 8003868: fix shark for latest HotSpot and LLVM
twisti
parents: 14490
diff changeset
  3640
#if defined(COMPILER1) || defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3641
  CompileBroker::compilation_init();
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3642
#endif
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3643
19713
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3644
  if (EnableInvokeDynamic) {
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3645
    // Pre-initialize some JSR292 core classes to avoid deadlock during class loading.
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3646
    // It is done after compilers are initialized, because otherwise compilations of
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3647
    // signature polymorphic MH intrinsics can be missed
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3648
    // (see SystemDictionary::find_method_handle_intrinsic).
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3649
    initialize_class(vmSymbols::java_lang_invoke_MethodHandle(), CHECK_0);
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3650
    initialize_class(vmSymbols::java_lang_invoke_MemberName(), CHECK_0);
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3651
    initialize_class(vmSymbols::java_lang_invoke_MethodHandleNatives(), CHECK_0);
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3652
  }
8ef23b417f55 8022595: JSR292: deadlock during class loading of MethodHandles, MethodHandleImpl & MethodHandleNatives
vlivanov
parents: 18946
diff changeset
  3653
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3654
#if INCLUDE_MANAGEMENT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3655
  Management::initialize(THREAD);
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3656
#endif // INCLUDE_MANAGEMENT
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3657
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3658
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3659
    // management agent fails to start possibly due to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3660
    // configuration problem and is responsible for printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3661
    // stack trace if appropriate. Simply exit VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3662
    vm_exit(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3663
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3664
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3665
  if (Arguments::has_profile())       FlatProfiler::engage(main_thread, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3666
  if (MemProfiling)                   MemProfiler::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3667
  StatSampler::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3668
  if (CheckJNICalls)                  JniPeriodicChecker::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3669
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3670
  BiasedLocking::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3671
7900
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3672
  if (JDK_Version::current().post_vm_init_hook_enabled()) {
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3673
    call_postVMInitHook(THREAD);
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3674
    // The Java side of PostVMInitHook.run must deal with all
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3675
    // exceptions and provide means of diagnosis.
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3676
    if (HAS_PENDING_EXCEPTION) {
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3677
      CLEAR_PENDING_EXCEPTION;
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3678
    }
4c7fc6332f7e 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 7897
diff changeset
  3679
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3680
14390
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3681
  {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3682
      MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3683
      // Make sure the watcher thread can be started by WatcherThread::start()
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3684
      // or by dynamic enrollment.
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3685
      WatcherThread::make_startable();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3686
      // Start up the WatcherThread if there are any periodic tasks
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3687
      // NOTE:  All PeriodicTasks should be registered by now. If they
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3688
      //   aren't, late joiners might appear to start slowly (we might
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3689
      //   take a while to process their first tick).
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3690
      if (PeriodicTask::num_tasks() > 0) {
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3691
          WatcherThread::start();
bd0d881cf1c5 7127792: Add the ability to change an existing PeriodicTask's execution interval
rbackman
parents: 14289
diff changeset
  3692
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3693
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3694
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3695
  // Give os specific code one last chance to start
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3696
  os::init_3();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3697
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3698
  create_vm_timer.end();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3699
#ifdef ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3700
  _vm_complete = true;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3701
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3702
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3703
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3704
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3705
// type for the Agent_OnLoad and JVM_OnLoad entry points
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3706
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3707
  typedef jint (JNICALL *OnLoadEntry_t)(JavaVM *, char *, void *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3708
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3709
// Find a command line agent library and return its entry point for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3710
//         -agentlib:  -agentpath:   -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3711
// num_symbol_entries must be passed-in since only the caller knows the number of symbols in the array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3712
static OnLoadEntry_t lookup_on_load(AgentLibrary* agent, const char *on_load_symbols[], size_t num_symbol_entries) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3713
  OnLoadEntry_t on_load_entry = NULL;
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3714
  void *library = NULL;
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3715
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3716
  if (!agent->valid()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3717
    char buffer[JVM_MAXPATHLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3718
    char ebuf[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3719
    const char *name = agent->name();
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3720
    const char *msg = "Could not find agent library ";
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3721
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3722
    // First check to see if agent is statcally linked into executable
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3723
    if (os::find_builtin_agent(agent, on_load_symbols, num_symbol_entries)) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3724
      library = agent->os_lib();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3725
    } else if (agent->is_absolute_path()) {
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3726
      library = os::dll_load(name, ebuf, sizeof ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3727
      if (library == NULL) {
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3728
        const char *sub_msg = " in absolute path, with error: ";
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3729
        size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3730
        char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3731
        jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3732
        // If we can't find the agent, exit.
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3733
        vm_exit_during_initialization(buf, NULL);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3734
        FREE_C_HEAP_ARRAY(char, buf, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3735
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3736
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3737
      // Try to load the agent from the standard dll directory
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3738
      if (os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(),
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3739
                             name)) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3740
        library = os::dll_load(buffer, ebuf, sizeof ebuf);
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3741
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3742
      if (library == NULL) { // Try the local directory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3743
        char ns[1] = {0};
14471
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3744
        if (os::dll_build_name(buffer, sizeof(buffer), ns, name)) {
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3745
          library = os::dll_load(buffer, ebuf, sizeof ebuf);
f3a6b82e25cf 8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken
bpittore
parents: 14289
diff changeset
  3746
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3747
        if (library == NULL) {
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3748
          const char *sub_msg = " on the library path, with error: ";
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3749
          size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3750
          char *buf = NEW_C_HEAP_ARRAY(char, len, mtThread);
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3751
          jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3752
          // If we can't find the agent, exit.
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3753
          vm_exit_during_initialization(buf, NULL);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3754
          FREE_C_HEAP_ARRAY(char, buf, mtThread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3755
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3756
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3757
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3758
    agent->set_os_lib(library);
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3759
    agent->set_valid();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3760
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3761
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3762
  // Find the OnLoad function.
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3763
  on_load_entry =
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3764
    CAST_TO_FN_PTR(OnLoadEntry_t, os::find_agent_function(agent,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3765
                                                          false,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3766
                                                          on_load_symbols,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3767
                                                          num_symbol_entries));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3768
  return on_load_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3769
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3770
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3771
// Find the JVM_OnLoad entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3772
static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3773
  const char *on_load_symbols[] = JVM_ONLOAD_SYMBOLS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3774
  return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3775
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3776
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3777
// Find the Agent_OnLoad entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3778
static OnLoadEntry_t lookup_agent_on_load(AgentLibrary* agent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3779
  const char *on_load_symbols[] = AGENT_ONLOAD_SYMBOLS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3780
  return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3781
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3782
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3783
// For backwards compatibility with -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3784
// Convert libraries with no JVM_OnLoad, but which have Agent_OnLoad to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3785
// treated like -agentpath:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3786
// Must be called before agent libraries are created
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3787
void Threads::convert_vm_init_libraries_to_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3788
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3789
  AgentLibrary* next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3790
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3791
  for (agent = Arguments::libraries(); agent != NULL; agent = next) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3792
    next = agent->next();  // cache the next agent now as this agent may get moved off this list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3793
    OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3794
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3795
    // If there is an JVM_OnLoad function it will get called later,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3796
    // otherwise see if there is an Agent_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3797
    if (on_load_entry == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3798
      on_load_entry = lookup_agent_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3799
      if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3800
        // switch it to the agent list -- so that Agent_OnLoad will be called,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3801
        // JVM_OnLoad won't be attempted and Agent_OnUnload will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3802
        Arguments::convert_library_to_agent(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3803
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3804
        vm_exit_during_initialization("Could not find JVM_OnLoad or Agent_OnLoad function in the library", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3805
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3806
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3807
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3808
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3809
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3810
// Create agents for -agentlib:  -agentpath:  and converted -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3811
// Invokes Agent_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3812
// Called very early -- before JavaThreads exist
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3813
void Threads::create_vm_init_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3814
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3815
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3817
  JvmtiExport::enter_onload_phase();
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13860
diff changeset
  3818
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3819
  for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3820
    OnLoadEntry_t  on_load_entry = lookup_agent_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3821
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3822
    if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3823
      // Invoke the Agent_OnLoad function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3824
      jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3825
      if (err != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3826
        vm_exit_during_initialization("agent library failed to init", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3827
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3828
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3829
      vm_exit_during_initialization("Could not find Agent_OnLoad function in the agent library", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3830
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3831
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3832
  JvmtiExport::enter_primordial_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3833
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3834
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3835
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3836
  typedef void (JNICALL *Agent_OnUnload_t)(JavaVM *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3837
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3839
void Threads::shutdown_vm_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3840
  // Send any Agent_OnUnload notifications
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3841
  const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS;
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3842
  size_t num_symbol_entries = ARRAY_SIZE(on_unload_symbols);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3843
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3844
  for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3845
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3846
    // Find the Agent_OnUnload function.
19553
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3847
    Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3848
      os::find_agent_function(agent,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3849
      false,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3850
      on_unload_symbols,
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3851
      num_symbol_entries));
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3852
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3853
    // Invoke the Agent_OnUnload function
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3854
    if (unload_entry != NULL) {
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3855
      JavaThread* thread = JavaThread::current();
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3856
      ThreadToNativeFromVM ttn(thread);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3857
      HandleMark hm(thread);
9bbd930be684 8014135: The JVMTI specification does not conform to recent changes in JNI specification
bpittore
parents: 18946
diff changeset
  3858
      (*unload_entry)(&main_vm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3859
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3860
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3861
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3862
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3863
// Called for after the VM is initialized for -Xrun libraries which have not been converted to agent libraries
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3864
// Invokes JVM_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3865
void Threads::create_vm_init_libraries() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3866
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3867
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3869
  for (agent = Arguments::libraries(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3870
    OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3872
    if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3873
      // Invoke the JVM_OnLoad function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3874
      JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3875
      ThreadToNativeFromVM ttn(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3876
      HandleMark hm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3877
      jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3878
      if (err != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3879
        vm_exit_during_initialization("-Xrun library failed to init", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3880
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3881
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3882
      vm_exit_during_initialization("Could not find JVM_OnLoad function in -Xrun library", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3883
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3884
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3885
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3886
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3887
// Last thread running calls java.lang.Shutdown.shutdown()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3888
void JavaThread::invoke_shutdown_hooks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3889
  HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3890
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3891
  // We could get here with a pending exception, if so clear it now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3892
  if (this->has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3893
    this->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3894
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3896
  EXCEPTION_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3897
  Klass* k =
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3898
    SystemDictionary::resolve_or_null(vmSymbols::java_lang_Shutdown(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3899
                                      THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3900
  if (k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3901
    // SystemDictionary::resolve_or_null will return null if there was
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3902
    // an exception.  If we cannot load the Shutdown class, just don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3903
    // call Shutdown.shutdown() at all.  This will mean the shutdown hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3904
    // and finalizers (if runFinalizersOnExit is set) won't be run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3905
    // Note that if a shutdown hook was registered or runFinalizersOnExit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3906
    // was called, the Shutdown class would have already been loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3907
    // (Runtime.addShutdownHook and runFinalizersOnExit will load it).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3908
    instanceKlassHandle shutdown_klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3909
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3910
    JavaCalls::call_static(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3911
                           shutdown_klass,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3912
                           vmSymbols::shutdown_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3913
                           vmSymbols::void_method_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3914
                           THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3915
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3916
  CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3917
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3918
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3919
// Threads::destroy_vm() is normally called from jni_DestroyJavaVM() when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3920
// the program falls off the end of main(). Another VM exit path is through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3921
// vm_exit() when the program calls System.exit() to return a value or when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3922
// there is a serious error in VM. The two shutdown paths are not exactly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3923
// the same, but they share Shutdown.shutdown() at Java level and before_exit()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3924
// and VM_Exit op at VM level.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3925
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3926
// Shutdown sequence:
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  3927
//   + Shutdown native memory tracking if it is on
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3928
//   + Wait until we are the last non-daemon thread to execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3929
//     <-- every thing is still working at this moment -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3930
//   + Call java.lang.Shutdown.shutdown(), which will invoke Java level
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3931
//        shutdown hooks, run finalizers if finalization-on-exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3932
//   + Call before_exit(), prepare for VM exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3933
//      > run VM level shutdown hooks (they are registered through JVM_OnExit(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3934
//        currently the only user of this mechanism is File.deleteOnExit())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3935
//      > stop flat profiler, StatSampler, watcher thread, CMS threads,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3936
//        post thread end and vm death events to JVMTI,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3937
//        stop signal thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3938
//   + Call JavaThread::exit(), it will:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3939
//      > release JNI handle blocks, remove stack guard pages
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3940
//      > remove this thread from Threads list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3941
//     <-- no more Java code from this thread after this point -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3942
//   + Stop VM thread, it will bring the remaining VM to a safepoint and stop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3943
//     the compiler threads at safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3944
//     <-- do not use anything that could get blocked by Safepoint -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3945
//   + Disable tracing at JNI/JVM barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3946
//   + Set _vm_exited flag for threads that are still running native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3947
//   + Delete this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3948
//   + Call exit_globals()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3949
//      > deletes tty
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3950
//      > deletes PerfMemory resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3951
//   + Return to caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3952
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3953
bool Threads::destroy_vm() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3954
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3955
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3956
#ifdef ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3957
  _vm_complete = false;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  3958
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3959
  // Wait until we are the last non-daemon thread to execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3960
  { MutexLocker nu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3961
    while (Threads::number_of_non_daemon_threads() > 1 )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3962
      // This wait should make safepoint checks, wait without a timeout,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3963
      // and wait as a suspend-equivalent condition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3964
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3965
      // Note: If the FlatProfiler is running and this thread is waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3966
      // for another non-daemon thread to finish, then the FlatProfiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3967
      // is waiting for the external suspend request on this thread to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3968
      // complete. wait_for_ext_suspend_completion() will eventually
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3969
      // timeout, but that takes time. Making this wait a suspend-
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3970
      // equivalent condition solves that timeout problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3971
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3972
      Threads_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3973
                         Mutex::_as_suspend_equivalent_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3974
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3976
  // Hang forever on exit if we are reporting an error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3977
  if (ShowMessageBoxOnError && is_error_reported()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3978
    os::infinite_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3979
  }
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8118
diff changeset
  3980
  os::wait_for_keypress_at_exit();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3982
  if (JDK_Version::is_jdk12x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3983
    // We are the last thread running, so check if finalizers should be run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3984
    // For 1.3 or later this is done in thread->invoke_shutdown_hooks()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3985
    HandleMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3986
    Universe::run_finalizers_on_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3987
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3988
    // run Java level shutdown hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3989
    thread->invoke_shutdown_hooks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3990
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3991
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3992
  before_exit(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3993
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3994
  thread->exit(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3995
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3996
  // Stop VM thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3997
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3998
    // 4945125 The vm thread comes to a safepoint during exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3999
    // GC vm_operations can get caught at the safepoint, and the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4000
    // heap is unparseable if they are caught. Grab the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4001
    // to prevent this. The GC vm_operations will not be able to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4002
    // queue until after the vm thread is dead.
9992
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4003
    // After this point, we'll never emerge out of the safepoint before
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4004
    // the VM exits, so concurrent GC threads do not need to be explicitly
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4005
    // stopped; they remain inactive until the process exits.
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4006
    // Note: some concurrent G1 threads may be running during a safepoint,
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4007
    // but these will not be accessing the heap, just some G1-specific side
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4008
    // data structures that are not accessed by any other threads but them
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4009
    // after this point in a terminal safepoint.
0d82cce3e655 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 9946
diff changeset
  4010
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4011
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4013
    VMThread::wait_for_vm_thread_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4014
    assert(SafepointSynchronize::is_at_safepoint(), "VM thread should exit at Safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4015
    VMThread::destroy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4016
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4018
  // clean up ideal graph printers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4019
#if defined(COMPILER2) && !defined(PRODUCT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4020
  IdealGraphPrinter::clean_up();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4021
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4023
  // Now, all Java threads are gone except daemon threads. Daemon threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4024
  // running Java code or in VM are stopped by the Safepoint. However,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4025
  // daemon threads executing native code are still running.  But they
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4026
  // will be stopped at native=>Java/VM barriers. Note that we can't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4027
  // simply kill or suspend them, as it is inherently deadlock-prone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4029
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4030
  // disable function tracing at JNI/JVM barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4031
  TraceJNICalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4032
  TraceJVMCalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4033
  TraceRuntimeCalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4034
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4036
  VM_Exit::set_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4038
  notify_vm_shutdown();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4040
  delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4041
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4042
  // exit_globals() will delete tty
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4043
  exit_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4045
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4046
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4049
jboolean Threads::is_supported_jni_version_including_1_1(jint version) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4050
  if (version == JNI_VERSION_1_1) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4051
  return is_supported_jni_version(version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4052
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4053
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4055
jboolean Threads::is_supported_jni_version(jint version) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4056
  if (version == JNI_VERSION_1_2) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4057
  if (version == JNI_VERSION_1_4) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4058
  if (version == JNI_VERSION_1_6) return JNI_TRUE;
16394
b5940f63d436 8005716: Enhance JNI specification to allow support of static JNI libraries in Embedded JREs
bpittore
parents: 15853
diff changeset
  4059
  if (version == JNI_VERSION_1_8) return JNI_TRUE;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4060
  return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4061
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4064
void Threads::add(JavaThread* p, bool force_daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4065
  // The threads lock must be owned at this point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4066
  assert_locked_or_safepoint(Threads_lock);
6768
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  4067
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  4068
  // See the comment for this method in thread.hpp for its purpose and
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  4069
  // why it is called here.
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  4070
  p->initialize_queues();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4071
  p->set_next(_thread_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4072
  _thread_list = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4073
  _number_of_threads++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4074
  oop threadObj = p->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4075
  bool daemon = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4076
  // Bootstrapping problem: threadObj can be null for initial
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4077
  // JavaThread (or for threads attached via JNI)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4078
  if ((!force_daemon) && (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4079
    _number_of_non_daemon_threads++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4080
    daemon = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4081
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4082
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  4083
  p->set_safepoint_visible(true);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  4084
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4085
  ThreadService::add_thread(p, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4087
  // Possible GC point.
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11480
diff changeset
  4088
  Events::log(p, "Thread added: " INTPTR_FORMAT, p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4089
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4091
void Threads::remove(JavaThread* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4092
  // Extra scope needed for Thread_lock, so we can check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4093
  // that we do not remove thread without safepoint code notice
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4094
  { MutexLocker ml(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4096
    assert(includes(p), "p must be present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4098
    JavaThread* current = _thread_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4099
    JavaThread* prev    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4101
    while (current != p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4102
      prev    = current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4103
      current = current->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4104
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4106
    if (prev) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4107
      prev->set_next(current->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4108
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4109
      _thread_list = p->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4110
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4111
    _number_of_threads--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4112
    oop threadObj = p->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4113
    bool daemon = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4114
    if (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4115
      _number_of_non_daemon_threads--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4116
      daemon = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4118
      // Only one thread left, do a notify on the Threads_lock so a thread waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4119
      // on destroy_vm will wake up.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4120
      if (number_of_non_daemon_threads() == 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4121
        Threads_lock->notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4122
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4123
    ThreadService::remove_thread(p, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4125
    // Make sure that safepoint code disregard this thread. This is needed since
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4126
    // the thread might mess around with locks after this point. This can cause it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4127
    // to do callbacks into the safepoint code. However, the safepoint code is not aware
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4128
    // of this thread since it is removed from the queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4129
    p->set_terminated_value();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  4130
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  4131
    // Now, this thread is not visible to safepoint
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12373
diff changeset
  4132
    p->set_safepoint_visible(false);
14120
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  4133
    // once the thread becomes safepoint invisible, we can not use its per-thread
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  4134
    // recorder. And Threads::do_threads() no longer walks this thread, so we have
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  4135
    // to release its per-thread recorder here.
7d298141c258 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 14083
diff changeset
  4136
    MemTracker::thread_exiting(p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4137
  } // unlock Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4139
  // Since Events::log uses a lock, we grab it outside the Threads_lock
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11480
diff changeset
  4140
  Events::log(p, "Thread exited: " INTPTR_FORMAT, p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4141
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4143
// Threads_lock must be held when this is called (or must be called during a safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4144
bool Threads::includes(JavaThread* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4145
  assert(Threads_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4146
  ALL_JAVA_THREADS(q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4147
    if (q == p ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4148
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4149
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4150
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4151
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4152
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4153
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4154
// Operations on the Threads list for GC.  These are not explicitly locked,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4155
// but the garbage collector must provide a safe context for them to run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4156
// In particular, these things should never be called when the Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4157
// is held by some other thread. (Note: the Safepoint abstraction also
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4158
// uses the Threads_lock to gurantee this property. It also makes sure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4159
// all threads gets blocked when exiting or starting).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4160
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4161
void Threads::oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4162
  ALL_JAVA_THREADS(p) {
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4163
    p->oops_do(f, cld_f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4164
  }
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4165
  VMThread::vm_thread()->oops_do(f, cld_f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4166
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4167
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4168
void Threads::possibly_parallel_oops_do(OopClosure* f, CLDToOopClosure* cld_f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4169
  // Introduce a mechanism allowing parallel threads to claim threads as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4170
  // root groups.  Overhead should be small enough to use all the time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4171
  // even in sequential code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4172
  SharedHeap* sh = SharedHeap::heap();
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4173
  // Cannot yet substitute active_workers for n_par_threads
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4174
  // because of G1CollectedHeap::verify() use of
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4175
  // SharedHeap::process_strong_roots().  n_par_threads == 0 will
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4176
  // turn off parallelism in process_strong_roots while active_workers
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4177
  // is being used for parallelism elsewhere.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4178
  bool is_par = sh->n_par_threads() > 0;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4179
  assert(!is_par ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4180
         (SharedHeap::heap()->n_par_threads() ==
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 10966
diff changeset
  4181
          SharedHeap::heap()->workers()->active_workers()), "Mismatch");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4182
  int cp = SharedHeap::heap()->strong_roots_parity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4183
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4184
    if (p->claim_oops_do(is_par, cp)) {
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4185
      p->oops_do(f, cld_f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4186
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4187
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4188
  VMThread* vmt = VMThread::vm_thread();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10546
diff changeset
  4189
  if (vmt->claim_oops_do(is_par, cp)) {
14582
490bb6c0df7c 8003720: NPG: Method in interpreter stack frame can be deallocated
stefank
parents: 14580
diff changeset
  4190
    vmt->oops_do(f, cld_f, cf);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10546
diff changeset
  4191
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4193
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4194
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4195
// Used by ParallelScavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4196
void Threads::create_thread_roots_tasks(GCTaskQueue* q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4197
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4198
    q->enqueue(new ThreadRootsTask(p));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4199
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4200
  q->enqueue(new ThreadRootsTask(VMThread::vm_thread()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4203
// Used by Parallel Old
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4204
void Threads::create_thread_roots_marking_tasks(GCTaskQueue* q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4205
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4206
    q->enqueue(new ThreadRootsMarkingTask(p));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4207
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4208
  q->enqueue(new ThreadRootsMarkingTask(VMThread::vm_thread()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4209
}
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4210
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4211
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  4212
void Threads::nmethods_do(CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4213
  ALL_JAVA_THREADS(p) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  4214
    p->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4215
  }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  4216
  VMThread::vm_thread()->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4217
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4218
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4219
void Threads::metadata_do(void f(Metadata*)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4220
  ALL_JAVA_THREADS(p) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4221
    p->metadata_do(f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4222
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4223
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13196
diff changeset
  4224
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4225
void Threads::gc_epilogue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4226
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4227
    p->gc_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4228
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4229
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4231
void Threads::gc_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4232
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4233
    p->gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4234
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4235
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4237
void Threads::deoptimized_wrt_marked_nmethods() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4238
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4239
    p->deoptimized_wrt_marked_nmethods();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4241
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4244
// Get count Java threads that are waiting to enter the specified monitor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4245
GrowableArray<JavaThread*>* Threads::get_pending_threads(int count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4246
  address monitor, bool doLock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4247
  assert(doLock || SafepointSynchronize::is_at_safepoint(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4248
    "must grab Threads_lock or be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4249
  GrowableArray<JavaThread*>* result = new GrowableArray<JavaThread*>(count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4250
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4251
  int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4252
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4253
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4254
    ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4255
      if (p->is_Compiler_thread()) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4257
      address pending = (address)p->current_pending_monitor();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4258
      if (pending == monitor) {             // found a match
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4259
        if (i < count) result->append(p);   // save the first count matches
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4260
        i++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4261
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4262
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4263
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4264
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4268
JavaThread *Threads::owning_thread_from_monitor_owner(address owner, bool doLock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4269
  assert(doLock ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4270
         Threads_lock->owned_by_self() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4271
         SafepointSynchronize::is_at_safepoint(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4272
         "must grab Threads_lock or be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4274
  // NULL owner means not locked so we can skip the search
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4275
  if (owner == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4277
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4278
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4279
    ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4280
      // first, see if owner is the address of a Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4281
      if (owner == (address)p) return p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4282
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4283
  }
15853
1c4e16950e96 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 15611
diff changeset
  4284
  // Cannot assert on lack of success here since this function may be
1c4e16950e96 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 15611
diff changeset
  4285
  // used by code that is trying to report useful problem information
1c4e16950e96 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 15611
diff changeset
  4286
  // like deadlock detection.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4287
  if (UseHeavyMonitors) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4288
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4289
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4290
  // If we didn't find a matching Java thread and we didn't force use of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4291
  // heavyweight monitors, then the owner is the stack address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4292
  // Lock Word in the owning Java thread's stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4293
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4294
  JavaThread* the_owner = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4295
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4296
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4297
    ALL_JAVA_THREADS(q) {
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  4298
      if (q->is_lock_owned(owner)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4299
        the_owner = q;
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  4300
        break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4301
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4302
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4303
  }
15853
1c4e16950e96 8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
dcubed
parents: 15611
diff changeset
  4304
  // cannot assert on lack of success here; see above comment
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4305
  return the_owner;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4306
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4308
// Threads::print_on() is called at safepoint by VM_PrintThreads operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4309
void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4310
  char buf[32];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4311
  st->print_cr(os::local_time_string(buf, sizeof(buf)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4312
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4313
  st->print_cr("Full thread dump %s (%s %s):",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4314
                Abstract_VM_Version::vm_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4315
                Abstract_VM_Version::vm_release(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4316
                Abstract_VM_Version::vm_info_string()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4317
               );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4318
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4319
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4320
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4321
  // Dump concurrent locks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4322
  ConcurrentLocksDump concurrent_locks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4323
  if (print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4324
    concurrent_locks.dump_at_safepoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4325
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4326
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4328
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4329
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4330
    p->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4331
    if (print_stacks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4332
      if (internal_format) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4333
        p->trace_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4334
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4335
        p->print_stack_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4336
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4337
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4338
    st->cr();
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4339
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4340
    if (print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4341
      concurrent_locks.print_locks_on(p, st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4342
    }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15221
diff changeset
  4343
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4346
  VMThread::vm_thread()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4347
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4348
  Universe::heap()->print_gc_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4349
  WatcherThread* wt = WatcherThread::watcher_thread();
13857
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  4350
  if (wt != NULL) {
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  4351
    wt->print_on(st);
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  4352
    st->cr();
93015306affa 7194254: jstack reports wrong thread priorities
dholmes
parents: 13748
diff changeset
  4353
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4354
  CompileBroker::print_compiler_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4355
  st->flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4356
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4358
// Threads::print_on_error() is called by fatal error handler. It's possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4359
// that VM is not at safepoint and/or current thread is inside signal handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4360
// Don't print stack trace, as the stack may not be walkable. Don't allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4361
// memory (even in resource area), it might deadlock the error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4362
void Threads::print_on_error(outputStream* st, Thread* current, char* buf, int buflen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4363
  bool found_current = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4364
  st->print_cr("Java Threads: ( => current thread )");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4365
  ALL_JAVA_THREADS(thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4366
    bool is_current = (current == thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4367
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4369
    st->print("%s", is_current ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4371
    st->print(PTR_FORMAT, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4372
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4373
    thread->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4374
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4375
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4376
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4377
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4378
  st->print_cr("Other Threads:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4379
  if (VMThread::vm_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4380
    bool is_current = (current == VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4381
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4382
    st->print("%s", current == VMThread::vm_thread() ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4384
    st->print(PTR_FORMAT, VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4385
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4386
    VMThread::vm_thread()->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4387
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4389
  WatcherThread* wt = WatcherThread::watcher_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4390
  if (wt != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4391
    bool is_current = (current == wt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4392
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4393
    st->print("%s", is_current ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4395
    st->print(PTR_FORMAT, wt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4396
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4397
    wt->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4398
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4399
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4400
  if (!found_current) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4401
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4402
    st->print("=>" PTR_FORMAT " (exited) ", current);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4403
    current->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4404
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4405
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4406
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4407
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4408
// Internal SpinLock and Mutex
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4409
// Based on ParkEvent
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4410
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4411
// Ad-hoc mutual exclusion primitives: SpinLock and Mux
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4412
//
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4413
// We employ SpinLocks _only for low-contention, fixed-length
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4414
// short-duration critical sections where we're concerned
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4415
// about native mutex_t or HotSpot Mutex:: latency.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4416
// The mux construct provides a spin-then-block mutual exclusion
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4417
// mechanism.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4418
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4419
// Testing has shown that contention on the ListLock guarding gFreeList
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4420
// is common.  If we implement ListLock as a simple SpinLock it's common
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4421
// for the JVM to devolve to yielding with little progress.  This is true
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4422
// despite the fact that the critical sections protected by ListLock are
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4423
// extremely short.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4424
//
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4425
// TODO-FIXME: ListLock should be of type SpinLock.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4426
// We should make this a 1st-class type, integrated into the lock
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4427
// hierarchy as leaf-locks.  Critically, the SpinLock structure
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4428
// should have sufficient padding to avoid false-sharing and excessive
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4429
// cache-coherency traffic.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4430
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4431
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4432
typedef volatile int SpinLockT ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4433
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4434
void Thread::SpinAcquire (volatile int * adr, const char * LockName) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4435
  if (Atomic::cmpxchg (1, adr, 0) == 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4436
     return ;   // normal fast-path return
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4437
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4438
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4439
  // Slow-path : We've encountered contention -- Spin/Yield/Block strategy.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4440
  TEVENT (SpinAcquire - ctx) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4441
  int ctr = 0 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4442
  int Yields = 0 ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4443
  for (;;) {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4444
     while (*adr != 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4445
        ++ctr ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4446
        if ((ctr & 0xFFF) == 0 || !os::is_MP()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4447
           if (Yields > 5) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4448
             // Consider using a simple NakedSleep() instead.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4449
             // Then SpinAcquire could be called by non-JVM threads
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4450
             Thread::current()->_ParkEvent->park(1) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4451
           } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4452
             os::NakedYield() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4453
             ++Yields ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4454
           }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4455
        } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4456
           SpinPause() ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4457
        }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4458
     }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4459
     if (Atomic::cmpxchg (1, adr, 0) == 0) return ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4460
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4461
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4462
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4463
void Thread::SpinRelease (volatile int * adr) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4464
  assert (*adr != 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4465
  OrderAccess::fence() ;      // guarantee at least release consistency.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4466
  // Roach-motel semantics.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4467
  // It's safe if subsequent LDs and STs float "up" into the critical section,
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4468
  // but prior LDs and STs within the critical section can't be allowed
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4469
  // to reorder or float past the ST that releases the lock.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4470
  *adr = 0 ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4471
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4472
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4473
// muxAcquire and muxRelease:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4474
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4475
// *  muxAcquire and muxRelease support a single-word lock-word construct.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4476
//    The LSB of the word is set IFF the lock is held.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4477
//    The remainder of the word points to the head of a singly-linked list
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4478
//    of threads blocked on the lock.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4479
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4480
// *  The current implementation of muxAcquire-muxRelease uses its own
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4481
//    dedicated Thread._MuxEvent instance.  If we're interested in
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4482
//    minimizing the peak number of extant ParkEvent instances then
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4483
//    we could eliminate _MuxEvent and "borrow" _ParkEvent as long
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4484
//    as certain invariants were satisfied.  Specifically, care would need
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4485
//    to be taken with regards to consuming unpark() "permits".
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4486
//    A safe rule of thumb is that a thread would never call muxAcquire()
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4487
//    if it's enqueued (cxq, EntryList, WaitList, etc) and will subsequently
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4488
//    park().  Otherwise the _ParkEvent park() operation in muxAcquire() could
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4489
//    consume an unpark() permit intended for monitorenter, for instance.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4490
//    One way around this would be to widen the restricted-range semaphore
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4491
//    implemented in park().  Another alternative would be to provide
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4492
//    multiple instances of the PlatformEvent() for each thread.  One
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4493
//    instance would be dedicated to muxAcquire-muxRelease, for instance.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4494
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4495
// *  Usage:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4496
//    -- Only as leaf locks
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4497
//    -- for short-term locking only as muxAcquire does not perform
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4498
//       thread state transitions.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4499
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4500
// Alternatives:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4501
// *  We could implement muxAcquire and muxRelease with MCS or CLH locks
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4502
//    but with parking or spin-then-park instead of pure spinning.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4503
// *  Use Taura-Oyama-Yonenzawa locks.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4504
// *  It's possible to construct a 1-0 lock if we encode the lockword as
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4505
//    (List,LockByte).  Acquire will CAS the full lockword while Release
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4506
//    will STB 0 into the LockByte.  The 1-0 scheme admits stranding, so
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4507
//    acquiring threads use timers (ParkTimed) to detect and recover from
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4508
//    the stranding window.  Thread/Node structures must be aligned on 256-byte
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4509
//    boundaries by using placement-new.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4510
// *  Augment MCS with advisory back-link fields maintained with CAS().
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4511
//    Pictorially:  LockWord -> T1 <-> T2 <-> T3 <-> ... <-> Tn <-> Owner.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4512
//    The validity of the backlinks must be ratified before we trust the value.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4513
//    If the backlinks are invalid the exiting thread must back-track through the
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4514
//    the forward links, which are always trustworthy.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4515
// *  Add a successor indication.  The LockWord is currently encoded as
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4516
//    (List, LOCKBIT:1).  We could also add a SUCCBIT or an explicit _succ variable
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4517
//    to provide the usual futile-wakeup optimization.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4518
//    See RTStt for details.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4519
// *  Consider schedctl.sc_nopreempt to cover the critical section.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4520
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4521
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4522
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4523
typedef volatile intptr_t MutexT ;      // Mux Lock-word
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4524
enum MuxBits { LOCKBIT = 1 } ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4525
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4526
void Thread::muxAcquire (volatile intptr_t * Lock, const char * LockName) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4527
  intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4528
  if (w == 0) return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4529
  if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4530
     return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4531
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4532
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4533
  TEVENT (muxAcquire - Contention) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4534
  ParkEvent * const Self = Thread::current()->_MuxEvent ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4535
  assert ((intptr_t(Self) & LOCKBIT) == 0, "invariant") ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4536
  for (;;) {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4537
     int its = (os::is_MP() ? 100 : 0) + 1 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4538
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4539
     // Optional spin phase: spin-then-park strategy
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4540
     while (--its >= 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4541
       w = *Lock ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4542
       if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4543
          return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4544
       }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4545
     }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4546
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4547
     Self->reset() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4548
     Self->OnList = intptr_t(Lock) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4549
     // The following fence() isn't _strictly necessary as the subsequent
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4550
     // CAS() both serializes execution and ratifies the fetched *Lock value.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4551
     OrderAccess::fence();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4552
     for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4553
        w = *Lock ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4554
        if ((w & LOCKBIT) == 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4555
            if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4556
                Self->OnList = 0 ;   // hygiene - allows stronger asserts
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4557
                return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4558
            }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4559
            continue ;      // Interference -- *Lock changed -- Just retry
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4560
        }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4561
        assert (w & LOCKBIT, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4562
        Self->ListNext = (ParkEvent *) (w & ~LOCKBIT );
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4563
        if (Atomic::cmpxchg_ptr (intptr_t(Self)|LOCKBIT, Lock, w) == w) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4564
     }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4565
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4566
     while (Self->OnList != 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4567
        Self->park() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4568
     }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4570
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4571
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4572
void Thread::muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4573
  intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4574
  if (w == 0) return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4575
  if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4576
    return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4577
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4578
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4579
  TEVENT (muxAcquire - Contention) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4580
  ParkEvent * ReleaseAfter = NULL ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4581
  if (ev == NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4582
    ev = ReleaseAfter = ParkEvent::Allocate (NULL) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4583
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4584
  assert ((intptr_t(ev) & LOCKBIT) == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4585
  for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4586
    guarantee (ev->OnList == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4587
    int its = (os::is_MP() ? 100 : 0) + 1 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4588
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4589
    // Optional spin phase: spin-then-park strategy
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4590
    while (--its >= 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4591
      w = *Lock ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4592
      if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4593
        if (ReleaseAfter != NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4594
          ParkEvent::Release (ReleaseAfter) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4595
        }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4596
        return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4597
      }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4598
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4599
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4600
    ev->reset() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4601
    ev->OnList = intptr_t(Lock) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4602
    // The following fence() isn't _strictly necessary as the subsequent
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4603
    // CAS() both serializes execution and ratifies the fetched *Lock value.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4604
    OrderAccess::fence();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4605
    for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4606
      w = *Lock ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4607
      if ((w & LOCKBIT) == 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4608
        if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4609
          ev->OnList = 0 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4610
          // We call ::Release while holding the outer lock, thus
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4611
          // artificially lengthening the critical section.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4612
          // Consider deferring the ::Release() until the subsequent unlock(),
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4613
          // after we've dropped the outer lock.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4614
          if (ReleaseAfter != NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4615
            ParkEvent::Release (ReleaseAfter) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4616
          }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4617
          return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4618
        }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4619
        continue ;      // Interference -- *Lock changed -- Just retry
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4620
      }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4621
      assert (w & LOCKBIT, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4622
      ev->ListNext = (ParkEvent *) (w & ~LOCKBIT );
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4623
      if (Atomic::cmpxchg_ptr (intptr_t(ev)|LOCKBIT, Lock, w) == w) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4624
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4625
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4626
    while (ev->OnList != 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4627
      ev->park() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4628
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4629
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4630
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4631
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4632
// Release() must extract a successor from the list and then wake that thread.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4633
// It can "pop" the front of the list or use a detach-modify-reattach (DMR) scheme
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4634
// similar to that used by ParkEvent::Allocate() and ::Release().  DMR-based
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4635
// Release() would :
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4636
// (A) CAS() or swap() null to *Lock, releasing the lock and detaching the list.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4637
// (B) Extract a successor from the private list "in-hand"
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4638
// (C) attempt to CAS() the residual back into *Lock over null.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4639
//     If there were any newly arrived threads and the CAS() would fail.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4640
//     In that case Release() would detach the RATs, re-merge the list in-hand
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4641
//     with the RATs and repeat as needed.  Alternately, Release() might
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4642
//     detach and extract a successor, but then pass the residual list to the wakee.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4643
//     The wakee would be responsible for reattaching and remerging before it
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4644
//     competed for the lock.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4645
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4646
// Both "pop" and DMR are immune from ABA corruption -- there can be
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4647
// multiple concurrent pushers, but only one popper or detacher.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4648
// This implementation pops from the head of the list.  This is unfair,
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4649
// but tends to provide excellent throughput as hot threads remain hot.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4650
// (We wake recently run threads first).
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4651
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4652
void Thread::muxRelease (volatile intptr_t * Lock)  {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4653
  for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4654
    const intptr_t w = Atomic::cmpxchg_ptr (0, Lock, LOCKBIT) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4655
    assert (w & LOCKBIT, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4656
    if (w == LOCKBIT) return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4657
    ParkEvent * List = (ParkEvent *) (w & ~LOCKBIT) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4658
    assert (List != NULL, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4659
    assert (List->OnList == intptr_t(Lock), "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4660
    ParkEvent * nxt = List->ListNext ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4661
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4662
    // The following CAS() releases the lock and pops the head element.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4663
    if (Atomic::cmpxchg_ptr (intptr_t(nxt), Lock, w) != w) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4664
      continue ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4665
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4666
    List->OnList = 0 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4667
    OrderAccess::fence() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4668
    List->unpark () ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4669
    return ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4670
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4671
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4672
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 6968
diff changeset
  4673
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4674
void Threads::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4675
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4676
    p->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4677
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4678
  VMThread* thread = VMThread::vm_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4679
  if (thread != NULL) thread->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4680
}