hotspot/src/share/vm/runtime/thread.cpp
author tonyp
Fri, 01 Oct 2010 16:43:05 -0400
changeset 6768 71338ecb7813
parent 6764 82eecb6073ad
child 6769 5f30b5a1ce5c
permissions -rw-r--r--
6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue Summary: Under certain circumstances a safepoint could happen between a JavaThread object being created and that object being added to the Java threads list. This could cause the active field of that thread's SATB queue to get out-of-sync with respect to the other Java threads. The solution is to activate the SATB queue, when necessary, before adding the thread to the Java threads list, not when the JavaThread object is created. The changeset also includes a small fix to rename the surrogate locker thread from "Surrogate Locker Thread (CMS)" to "Surrogate Locker Thread (Concurrent GC)" since it's also used in G1. Reviewed-by: iveresov, ysr, johnc, jcoomes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5085
diff changeset
     2
 * Copyright (c) 1997, 2010, 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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
# include "incls/_precompiled.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
# include "incls/_thread.cpp.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
#ifdef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// Only bother with this argument setup if dtrace is available
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
HS_DTRACE_PROBE_DECL(hotspot, vm__init__begin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
HS_DTRACE_PROBE_DECL(hotspot, vm__init__end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
HS_DTRACE_PROBE_DECL5(hotspot, thread__start, char*, intptr_t,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  intptr_t, intptr_t, bool);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
HS_DTRACE_PROBE_DECL5(hotspot, thread__stop, char*, intptr_t,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
  intptr_t, intptr_t, bool);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
#define DTRACE_THREAD_PROBE(probe, javathread)                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  {                                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
    ResourceMark rm(this);                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
    int len = 0;                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
    const char* name = (javathread)->get_thread_name();                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
    len = strlen(name);                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
    HS_DTRACE_PROBE5(hotspot, thread__##probe,                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
      name, len,                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
      java_lang_Thread::thread_id((javathread)->threadObj()),              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
      (javathread)->osthread()->thread_id(),                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
      java_lang_Thread::is_daemon((javathread)->threadObj()));             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
#else //  ndef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
#define DTRACE_THREAD_PROBE(probe, javathread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
#endif // ndef DTRACE_ENABLED
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// Class hierarchy
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// - Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//   - VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
//   - WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//   - ConcurrentMarkSweepThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
//   - JavaThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
//     - CompilerThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
// ======= Thread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
// Support for forcing alignment of thread objects for biased locking
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
void* Thread::operator new(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    const int alignment = markOopDesc::biased_lock_alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    size_t aligned_size = size + (alignment - sizeof(intptr_t));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    void* real_malloc_addr = CHeapObj::operator new(aligned_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    void* aligned_addr     = (void*) align_size_up((intptr_t) real_malloc_addr, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    assert(((uintptr_t) aligned_addr + (uintptr_t) size) <=
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
           ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
           "JavaThread alignment code overflowed allocated storage");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    if (TraceBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
      if (aligned_addr != real_malloc_addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
        tty->print_cr("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
                      real_malloc_addr, aligned_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    return aligned_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    return CHeapObj::operator new(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
void Thread::operator delete(void* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    void* real_malloc_addr = ((Thread*) p)->_real_malloc_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    CHeapObj::operator delete(real_malloc_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    CHeapObj::operator delete(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
// Base class for all threads: VMThread, WatcherThread, ConcurrentMarkSweepThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// JavaThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
Thread::Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _stack_base   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  _stack_size   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  _self_raw_id  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  _lgrp_id      = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  _osthread     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // allocated data structures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  set_resource_area(new ResourceArea());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  set_handle_area(new HandleArea(NULL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  set_active_handles(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  set_free_handle_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  set_last_handle_mark(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  set_osthread(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // This initial value ==> never claimed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  _oops_do_parity = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // the handle mark links itself to last_handle_mark
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  new HandleMark(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // plain initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  debug_only(_owned_locks = NULL;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  debug_only(_allow_allocation_count = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  NOT_PRODUCT(_allow_safepoint_count = 0;)
2995
d8283445992a 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 2526
diff changeset
   130
  NOT_PRODUCT(_skip_gcalot = false;)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  CHECK_UNHANDLED_OOPS_ONLY(_gc_locked_out_count = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  _jvmti_env_iteration_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  _vm_operation_started_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  _vm_operation_completed_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _current_pending_monitor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  _current_pending_monitor_is_from_java = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  _current_waiting_monitor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  _num_nested_signal = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  omFreeList = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  omFreeCount = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  omFreeProvision = 32 ;
5710
d664086c0add 6852873: Reduce safepoint cleanup time
acorn
parents: 5085
diff changeset
   142
  omInUseList = NULL ;
d664086c0add 6852873: Reduce safepoint cleanup time
acorn
parents: 5085
diff changeset
   143
  omInUseCount = 0 ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  _SR_lock = new Monitor(Mutex::suspend_resume, "SR_lock", true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  _suspend_flags = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // thread-specific hashCode stream generator state - Marsaglia shift-xor form
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  _hashStateX = os::random() ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  _hashStateY = 842502087 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  _hashStateZ = 0x8767 ;    // (int)(3579807591LL & 0xffff) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  _hashStateW = 273326509 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  _OnTrap   = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  _schedctl = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  _Stalled  = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  _TypeTag  = 0x2BAD ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Many of the following fields are effectively final - immutable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Note that nascent threads can't use the Native Monitor-Mutex
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // construct until the _MutexEvent is initialized ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // CONSIDER: instead of using a fixed set of purpose-dedicated ParkEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // we might instead use a stack of ParkEvents that we could provision on-demand.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // The stack would act as a cache to avoid calls to ParkEvent::Allocate()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // and ::Release()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  _ParkEvent   = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  _SleepEvent  = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  _MutexEvent  = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  _MuxEvent    = ParkEvent::Allocate (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
#ifdef CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  if (CheckUnhandledOops) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    _unhandled_oops = new UnhandledOops(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
#endif // CHECK_UNHANDLED_OOPS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    assert((((uintptr_t) this) & (markOopDesc::biased_lock_alignment - 1)) == 0, "forced alignment of thread object failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    assert(this == _real_malloc_address ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
           this == (void*) align_size_up((intptr_t) _real_malloc_address, markOopDesc::biased_lock_alignment),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
           "bug in forced alignment of thread objects");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
#endif /* ASSERT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
void Thread::initialize_thread_local_storage() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Note: Make sure this method only calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // non-blocking operations. Otherwise, it might not work
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // with the thread-startup/safepoint interaction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // During Java thread startup, safepoint code should allow this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // method to complete because it may need to allocate memory to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // store information for the new thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // initialize structure dependent on thread local storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  ThreadLocalStorage::set_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // set up any platform-specific state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  os::initialize_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
void Thread::record_stack_base_and_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  set_stack_base(os::current_stack_base());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  set_stack_size(os::current_stack_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
Thread::~Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Reclaim the objectmonitors from the omFreeList of the moribund thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  ObjectSynchronizer::omFlush (this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // deallocate data structures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  delete resource_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // since the handle marks are using the handle area, we have to deallocated the root
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // handle mark before deallocating the thread's handle area,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  assert(last_handle_mark() != NULL, "check we have an element");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  delete last_handle_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  assert(last_handle_mark() == NULL, "check we have reached the end");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  // It's possible we can encounter a null _ParkEvent, etc., in stillborn threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  // We NULL out the fields for good hygiene.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  ParkEvent::Release (_ParkEvent)   ; _ParkEvent   = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  ParkEvent::Release (_SleepEvent)  ; _SleepEvent  = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  ParkEvent::Release (_MutexEvent)  ; _MutexEvent  = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  ParkEvent::Release (_MuxEvent)    ; _MuxEvent    = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  delete handle_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // osthread() can be NULL, if creation of thread failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  if (osthread() != NULL) os::free_thread(osthread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  delete _SR_lock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // clear thread local storage if the Thread is deleting itself
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  if (this == Thread::current()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    ThreadLocalStorage::set_thread(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    // In the case where we're not the current thread, invalidate all the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    // caches in case some code tries to get the current thread or the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    // thread that was destroyed, and gets stale information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    ThreadLocalStorage::invalidate_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) delete unhandled_oops();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
// NOTE: dummy function for assertion purpose.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
void Thread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
// Private method to check for dangling thread pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
void check_for_dangling_thread_pointer(Thread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
         "possibility of dangling Thread pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
// Tracing method for basic thread operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
void Thread::trace(const char* msg, const Thread* const thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  if (!TraceThreadEvents) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  ThreadCritical tc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  const char *name = "non-Java thread";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  int prio = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  if (thread->is_Java_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
      && !thread->is_Compiler_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    // The Threads_lock must be held to get information about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    // this thread but may not be in some situations when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    // tracing  thread events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    bool release_Threads_lock = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    if (!Threads_lock->owned_by_self()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
      Threads_lock->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
      release_Threads_lock = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    JavaThread* jt = (JavaThread *)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    name = (char *)jt->get_thread_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    oop thread_oop = jt->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    if (thread_oop != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      prio = java_lang_Thread::priority(thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    if (release_Threads_lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
      Threads_lock->unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  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
   290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
ThreadPriority Thread::get_priority(const Thread* const thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  trace("get priority", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  ThreadPriority priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // Can return an error!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  (void)os::get_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  assert(MinPriority <= priority && priority <= MaxPriority, "non-Java priority found");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  return priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
void Thread::set_priority(Thread* thread, ThreadPriority priority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  trace("set priority", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // Can return an error!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  (void)os::set_priority(thread, priority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
void Thread::start(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  trace("start", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  // Start is different from resume in that its safety is guaranteed by context or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // being called from a Java method synchronized on the Thread object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  if (!DisableStartThread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    if (thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
      // Initialize the thread state to RUNNABLE before starting this thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
      // Can not set it after the thread started because we do not know the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
      // exact thread state at that time. It could be in MONITOR_WAIT or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
      // in SLEEPING or some other state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
      java_lang_Thread::set_thread_status(((JavaThread*)thread)->threadObj(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
                                          java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    os::start_thread(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
// Enqueue a VM_Operation to do the job for us - sometime later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
void Thread::send_async_exception(oop java_thread, oop java_throwable) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  VM_ThreadStop* vm_stop = new VM_ThreadStop(java_thread, java_throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  VMThread::execute(vm_stop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
// Check if an external suspend request has completed (or has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
// cancelled). Returns true if the thread is externally suspended and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
// false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
// The bits parameter returns information about the code path through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// the routine. Useful for debugging:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
// set in is_ext_suspend_completed():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
// 0x00000001 - routine was entered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
// 0x00000010 - routine return false at end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
// 0x00000100 - thread exited (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
// 0x00000200 - suspend request cancelled (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
// 0x00000400 - thread suspended (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
// 0x00001000 - thread is in a suspend equivalent state (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
// 0x00002000 - thread is native and walkable (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
// 0x00004000 - thread is native_trans and walkable (needed retry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
// set in wait_for_ext_suspend_completion():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
// 0x00010000 - routine was entered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
// 0x00020000 - suspend request cancelled before loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
// 0x00040000 - thread suspended before loop (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
// 0x00080000 - suspend request cancelled in loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
// 0x00100000 - thread suspended in loop (return true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
// 0x00200000 - suspend not completed during retry loop (return false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
// Helper class for tracing suspend wait debug bits.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
// 0x00000100 indicates that the target thread exited before it could
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
// self-suspend which is not a wait failure. 0x00000200, 0x00020000 and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
// 0x00080000 each indicate a cancelled suspend request so they don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
// count as wait failures either.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
#define DEBUG_FALSE_BITS (0x00000010 | 0x00200000)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
class TraceSuspendDebugBits : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  JavaThread * jt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  bool         is_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  bool         called_by_wait;  // meaningful when !is_wait
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  uint32_t *   bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  TraceSuspendDebugBits(JavaThread *_jt, bool _is_wait, bool _called_by_wait,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
                        uint32_t *_bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    jt             = _jt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    is_wait        = _is_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    called_by_wait = _called_by_wait;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    bits           = _bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  ~TraceSuspendDebugBits() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    if (!is_wait) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
#if 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
      // By default, don't trace bits for is_ext_suspend_completed() calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
      // That trace is very chatty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
      if (!called_by_wait) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
        // If tracing for is_ext_suspend_completed() is enabled, then only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
        // trace calls to it from wait_for_ext_suspend_completion()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    if (AssertOnSuspendWaitFailure || TraceSuspendWaitFailures) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
      if (bits != NULL && (*bits & DEBUG_FALSE_BITS) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
        MutexLocker ml(Threads_lock);  // needed for get_thread_name()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
        tty->print_cr(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
            "Failed wait_for_ext_suspend_completion(thread=%s, debug_bits=%x)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
            jt->get_thread_name(), *bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
        guarantee(!AssertOnSuspendWaitFailure, "external suspend wait failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
#undef DEBUG_FALSE_BITS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
bool JavaThread::is_ext_suspend_completed(bool called_by_wait, int delay, uint32_t *bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  TraceSuspendDebugBits tsdb(this, false /* !is_wait */, called_by_wait, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  bool did_trans_retry = false;  // only do thread_in_native_trans retry once
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  bool do_trans_retry;           // flag to force the retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  *bits |= 0x00000001;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    do_trans_retry = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    if (is_exiting()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
      // Thread is in the process of exiting. This is always checked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
      // first to reduce the risk of dereferencing a freed JavaThread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
      *bits |= 0x00000100;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
      // Suspend request is cancelled. This is always checked before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
      // is_ext_suspended() to reduce the risk of a rogue resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
      // confusing the thread that made the suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
      *bits |= 0x00000200;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    if (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
      // thread is suspended
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
      *bits |= 0x00000400;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    // Now that we no longer do hard suspends of threads running
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    // native code, the target thread can be changing thread state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    // while we are in this routine:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    //   _thread_in_native -> _thread_in_native_trans -> _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    // We save a copy of the thread state as observed at this moment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    // and make our decision about suspend completeness based on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    // copy. This closes the race where the thread state is seen as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    // _thread_in_native_trans in the if-thread_blocked check, but is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    // seen as _thread_blocked in if-thread_in_native_trans check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    JavaThreadState save_state = thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    if (save_state == _thread_blocked && is_suspend_equivalent()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
      // If the thread's state is _thread_blocked and this blocking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
      // condition is known to be equivalent to a suspend, then we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      // consider the thread to be externally suspended. This means that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      // the code that sets _thread_blocked has been modified to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
      // self-suspension if the blocking condition releases. We also
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
      // used to check for CONDVAR_WAIT here, but that is now covered by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
      // the _thread_blocked with self-suspension check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
      // Return true since we wouldn't be here unless there was still an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
      // external suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
      *bits |= 0x00001000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    } else if (save_state == _thread_in_native && frame_anchor()->walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
      // Threads running native code will self-suspend on native==>VM/Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
      // transitions. If its stack is walkable (should always be the case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
      // unless this function is called before the actual java_suspend()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
      // call), then the wait is done.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
      *bits |= 0x00002000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    } else if (!called_by_wait && !did_trans_retry &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
               save_state == _thread_in_native_trans &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
               frame_anchor()->walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
      // The thread is transitioning from thread_in_native to another
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
      // thread state. check_safepoint_and_suspend_for_native_trans()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
      // will force the thread to self-suspend. If it hasn't gotten
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
      // there yet we may have caught the thread in-between the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
      // code check above and the self-suspend. Lucky us. If we were
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
      // called by wait_for_ext_suspend_completion(), then it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
      // will be doing the retries so we don't have to.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
      // Since we use the saved thread state in the if-statement above,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
      // there is a chance that the thread has already transitioned to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
      // _thread_blocked by the time we get here. In that case, we will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
      // make a single unnecessary pass through the logic below. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
      // doesn't hurt anything since we still do the trans retry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
      *bits |= 0x00004000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
      // Once the thread leaves thread_in_native_trans for another
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
      // thread state, we break out of this retry loop. We shouldn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
      // need this flag to prevent us from getting back here, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
      // sometimes paranoia is good.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
      did_trans_retry = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
      // We wait for the thread to transition to a more usable state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
      for (int i = 1; i <= SuspendRetryCount; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
        // We used to do an "os::yield_all(i)" call here with the intention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
        // that yielding would increase on each retry. However, the parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
        // is ignored on Linux which means the yield didn't scale up. Waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
        // on the SR_lock below provides a much more predictable scale up for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
        // the delay. It also provides a simple/direct point to check for any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
        // safepoint requests from the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
        // temporarily drops SR_lock while doing wait with safepoint check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
        // (if we're a JavaThread - the WatcherThread can also call this)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
        // and increase delay with each retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
        SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
        // check the actual thread state instead of what we saved above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
        if (thread_state() != _thread_in_native_trans) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
          // the thread has transitioned to another thread state so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
          // try all the checks (except this one) one more time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
          do_trans_retry = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
      } // end retry loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  } while (do_trans_retry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  *bits |= 0x00000010;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
// Wait for an external suspend request to complete (or be cancelled).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
// Returns true if the thread is externally suspended and false otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
bool JavaThread::wait_for_ext_suspend_completion(int retries, int delay,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
       uint32_t *bits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  TraceSuspendDebugBits tsdb(this, true /* is_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
                             false /* !called_by_wait */, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  // local flag copies to minimize SR_lock hold time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  bool is_suspended;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  bool pending;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  uint32_t reset_bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // set a marker so is_ext_suspend_completed() knows we are the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  *bits |= 0x00010000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  // We use reset_bits to reinitialize the bits value at the top of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  // each retry loop. This allows the caller to make use of any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  // unused bits for their own marking purposes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  reset_bits = *bits;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
                                            delay, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    pending = is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // must release SR_lock to allow suspension to complete
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  if (!pending) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
    // A cancelled suspend request is the only false return from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    // is_ext_suspend_completed() that keeps us from entering the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
    // retry loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    *bits |= 0x00020000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  if (is_suspended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    *bits |= 0x00040000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  for (int i = 1; i <= retries; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    *bits = reset_bits;  // reinit to only track last retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    // We used to do an "os::yield_all(i)" call here with the intention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    // that yielding would increase on each retry. However, the parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    // is ignored on Linux which means the yield didn't scale up. Waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    // on the SR_lock below provides a much more predictable scale up for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    // the delay. It also provides a simple/direct point to check for any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    // safepoint requests from the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
      MutexLocker ml(SR_lock());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
      // wait with safepoint check (if we're a JavaThread - the WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
      // can also call this)  and increase delay with each retry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
      SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
      is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
                                              delay, bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
      // It is possible for the external suspend request to be cancelled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
      // (by a resume) before the actual suspend operation is completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
      // Refresh our local copy to see if we still need to wait.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
      pending = is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    if (!pending) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
      // A cancelled suspend request is the only false return from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
      // is_ext_suspend_completed() that keeps us from staying in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
      // retry loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
      *bits |= 0x00080000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    if (is_suspended) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      *bits |= 0x00100000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  } // end retry loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  // thread did not suspend after all our retries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  *bits |= 0x00200000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
void JavaThread::record_jump(address target, address instr, const char* file, int line) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  // This should not need to be atomic as the only way for simultaneous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  // updates is via interrupts. Even then this should be rare or non-existant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  // and we don't care that much anyway.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  int index = _jmp_ring_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  _jmp_ring_index = (index + 1 ) & (jump_ring_buffer_size - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  _jmp_ring[index]._target = (intptr_t) target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  _jmp_ring[index]._instruction = (intptr_t) instr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  _jmp_ring[index]._file = file;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  _jmp_ring[index]._line = line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
#endif /* PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
// Called by flat profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
// Callers have already called wait_for_ext_suspend_completion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
// The assertion for that is currently too complex to put here:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
bool JavaThread::profile_last_Java_frame(frame* _fr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  bool gotframe = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // self suspension saves needed state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  if (has_last_Java_frame() && _anchor.walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
     *_fr = pd_last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
     gotframe = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  return gotframe;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
void Thread::interrupt(Thread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  trace("interrupt", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  os::interrupt(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
bool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  trace("is_interrupted", thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  debug_only(check_for_dangling_thread_pointer(thread);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  // Note:  If clear_interrupted==false, this simply fetches and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // returns the value of the field osthread()->interrupted().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  return os::is_interrupted(thread, clear_interrupted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
// GC Support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  jint thread_parity = _oops_do_parity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  if (thread_parity != strong_roots_parity) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
    if (res == thread_parity) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
      guarantee(res == strong_roots_parity, "Or else what?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
      assert(SharedHeap::heap()->n_par_threads() > 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
             "Should only fail when parallel.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  assert(SharedHeap::heap()->n_par_threads() > 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
         "Should only fail when parallel.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   688
void Thread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  active_handles()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  // Do oop for ThreadShadow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  f->do_oop((oop*)&_pending_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  handle_area()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   695
void Thread::nmethods_do(CodeBlobClosure* cf) {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   696
  // no nmethods in a generic thread...
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
void Thread::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  // get_priority assumes osthread initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  if (osthread() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
    st->print("prio=%d tid=" INTPTR_FORMAT " ", get_priority(this), this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
    osthread()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  debug_only(if (WizardMode) print_owned_locks_on(st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
// Thread::print_on_error() is called by fatal error handler. Don't use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
// any lock or allocate memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
void Thread::print_on_error(outputStream* st, char* buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  if      (is_VM_thread())                  st->print("VMThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  else if (is_Compiler_thread())            st->print("CompilerThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  else if (is_Java_thread())                st->print("JavaThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  else if (is_GC_task_thread())             st->print("GCTaskThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  else if (is_Watcher_thread())             st->print("WatcherThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  else if (is_ConcurrentGC_thread())        st->print("ConcurrentGCThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  else st->print("Thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  st->print(" [stack: " PTR_FORMAT "," PTR_FORMAT "]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
            _stack_base - _stack_size, _stack_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  if (osthread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    st->print(" [id=%d]", osthread()->thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
void Thread::print_owned_locks_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  Monitor *cur = _owned_locks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  if (cur == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    st->print(" (no locks) ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    st->print_cr(" Locks owned:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    while(cur) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
      cur->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      cur = cur->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
static int ref_use_count  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
bool Thread::owns_locks_but_compiled_lock() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
    if (cur != Compile_lock) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
// The flag: potential_vm_operation notifies if this particular safepoint state could potential
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
// 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
   757
// no threads which allow_vm_block's are held
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
void Thread::check_for_valid_safepoint_state(bool potential_vm_operation) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
    // Check if current thread is allowed to block at a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
    if (!(_allow_safepoint_count == 0))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
      fatal("Possible safepoint reached by thread that does not allow it");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
    if (is_Java_thread() && ((JavaThread*)this)->thread_state() != _thread_in_vm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
      fatal("LEAF method calling lock?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    if (potential_vm_operation && is_Java_thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
        && !Universe::is_bootstrapping()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
      // Make sure we do not hold any locks that the VM thread also uses.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
      // This could potentially lead to deadlocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
      for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
        // Threads_lock is special, since the safepoint synchronization will not start before this is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
        // acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
        // since it is used to transfer control between JavaThreads and the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
        // Do not *exclude* any locks unless you are absolutly sure it is correct. Ask someone else first!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
        if ( (cur->allow_vm_block() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
              cur != Threads_lock &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
              cur != Compile_lock &&               // Temporary: should not be necessary when we get spearate compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
              cur != VMOperationRequest_lock &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
              cur != VMOperationQueue_lock) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
              cur->rank() == Mutex::special) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
          warning("Thread holding lock at safepoint that vm can block on: %s", cur->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    if (GCALotAtAllSafepoints) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
      // We could enter a safepoint here and thus have a gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
      InterfaceSupport::check_gc_alot();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
bool Thread::is_in_stack(address adr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  assert(Thread::current() == this, "is_in_stack can only be called from current thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  address end = os::current_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  if (stack_base() >= adr && adr >= end) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
// We had to move these methods here, because vm threads get into ObjectSynchronizer::enter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
// However, there is a note in JavaThread::is_lock_owned() about the VM threads not being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
// used for compilation in the future. If that change is made, the need for these methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
// should be revisited, and they should be removed if possible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
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
   810
  return on_local_stack(adr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
bool Thread::set_as_starting_thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
 // NOTE: this must be called inside the main thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  return os::create_main_thread((JavaThread*)this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
static void initialize_class(symbolHandle class_name, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  klassOop klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  instanceKlass::cast(klass)->initialize(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
// Creates the initial ThreadGroup
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
static Handle create_initial_thread_group(TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ThreadGroup(), true, CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  Handle system_instance = klass->allocate_instance_handle(CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
                            system_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
                            klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
                            vmSymbolHandles::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
                            vmSymbolHandles::void_method_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
                            CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  Universe::set_system_thread_group(system_instance());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  Handle main_instance = klass->allocate_instance_handle(CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    Handle string = java_lang_String::create_from_str("main", CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
                            main_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
                            klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
                            vmSymbolHandles::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
                            vmSymbolHandles::threadgroup_string_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
                            system_instance,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
                            string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
                            CHECK_NH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  return main_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
// Creates the initial Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  java_lang_Thread::set_thread(thread_oop(), thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  java_lang_Thread::set_priority(thread_oop(), NormPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  thread->set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  Handle string = java_lang_String::create_from_str("main", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  JavaCalls::call_special(&result, thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
                                   klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
                                   vmSymbolHandles::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
                                   vmSymbolHandles::threadgroup_string_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
                                   thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
                                   string,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
                                   CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  return thread_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
static void call_initializeSystemClass(TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  klassOop k =  SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_System(), true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  JavaCalls::call_static(&result, klass, vmSymbolHandles::initializeSystemClass_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
                                         vmSymbolHandles::void_method_signature(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
4485
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   889
#ifdef KERNEL
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   890
static void set_jkernel_boot_classloader_hook(TRAPS) {
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   891
  klassOop k = SystemDictionary::sun_jkernel_DownloadManager_klass();
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   892
  instanceKlassHandle klass (THREAD, k);
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   893
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   894
  if (k == NULL) {
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   895
    // sun.jkernel.DownloadManager may not present in the JDK; just return
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   896
    return;
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   897
  }
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   898
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   899
  JavaValue result(T_VOID);
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   900
  JavaCalls::call_static(&result, klass, vmSymbolHandles::setBootClassLoaderHook_name(),
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   901
                                         vmSymbolHandles::void_method_signature(), CHECK);
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   902
}
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   903
#endif // KERNEL
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
   904
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
static void reset_vm_info_property(TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  // the vm info string
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  const char *vm_info = VM_Version::vm_info_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  // java.lang.System class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  klassOop k =  SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_System(), true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  // setProperty arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  Handle key_str    = java_lang_String::create_from_str("java.vm.info", CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  Handle value_str  = java_lang_String::create_from_str(vm_info, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  // return value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  JavaValue r(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  // public static String setProperty(String key, String value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  JavaCalls::call_static(&r,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
                         klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
                         vmSymbolHandles::setProperty_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
                         vmSymbolHandles::string_string_string_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
                         key_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
                         value_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
                         CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  assert(thread_group.not_null(), "thread group should be specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  assert(threadObj() == NULL, "should only create Java thread object once");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  instanceKlassHandle klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  java_lang_Thread::set_thread(thread_oop(), this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  java_lang_Thread::set_priority(thread_oop(), NormPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  if (thread_name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
    Handle name = java_lang_String::create_from_str(thread_name, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    // Thread gets assigned specified name and null target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
                            thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
                            klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
                            vmSymbolHandles::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
                            vmSymbolHandles::threadgroup_string_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
                            thread_group, // Argument 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
                            name,         // Argument 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
                            THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    // Thread gets assigned name "Thread-nnn" and null target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
    // (java.lang.Thread doesn't have a constructor taking only a ThreadGroup argument)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
    JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
                            thread_oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
                            klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
                            vmSymbolHandles::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
                            vmSymbolHandles::threadgroup_runnable_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
                            thread_group, // Argument 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
                            Handle(),     // Argument 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
                            THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  if (daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
      java_lang_Thread::set_daemon(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
   978
  KlassHandle group(this, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  Handle threadObj(this, this->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  JavaCalls::call_special(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
                         thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
                         group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
                         vmSymbolHandles::add_method_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
                         vmSymbolHandles::thread_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
                         threadObj,          // Arg 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
                         THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
// NamedThread --  non-JavaThread subclasses with multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
// uniquely named instances should derive from this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
NamedThread::NamedThread() : Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  _name = NULL;
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
   996
  _processed_thread = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
NamedThread::~NamedThread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  if (_name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
    FREE_C_HEAP_ARRAY(char, _name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
    _name = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
void NamedThread::set_name(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  guarantee(_name == NULL, "Only get to set name once.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  _name = NEW_C_HEAP_ARRAY(char, max_name_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  guarantee(_name != NULL, "alloc failure");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  jio_vsnprintf(_name, max_name_len, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
// ======= WatcherThread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
// The watcher thread exists to simulate timer interrupts.  It should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
// be replaced by an abstraction over whatever native support for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
// timer interrupts exists on the platform.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
WatcherThread* WatcherThread::_watcher_thread   = NULL;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1023
volatile bool  WatcherThread::_should_terminate = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
WatcherThread::WatcherThread() : Thread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  assert(watcher_thread() == NULL, "we can only allocate one WatcherThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  if (os::create_thread(this, os::watcher_thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
    _watcher_thread = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
    // Set the watcher thread to the highest OS priority which should not be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
    // used, unless a Java thread with priority java.lang.Thread.MAX_PRIORITY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
    // is created. The only normal thread using this priority is the reference
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
    // handler thread, which runs for very short intervals only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
    // If the VMThread's priority is not lower than the WatcherThread profiling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
    // will be inaccurate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    os::set_priority(this, MaxPriority);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    if (!DisableStartThread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
      os::start_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
void WatcherThread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  assert(this == watcher_thread(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  this->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  this->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  this->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  while(!_should_terminate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    assert(watcher_thread() == Thread::current(),  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
    assert(watcher_thread() == this,  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
    // Calculate how long it'll be until the next PeriodicTask work
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    // should be done, and sleep that amount of time.
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1055
    size_t time_to_wait = PeriodicTask::time_to_wait();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1056
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1057
    // we expect this to timeout - we only ever get unparked when
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1058
    // we should terminate
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1059
    {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1060
      OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1061
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1062
      jlong prev_time = os::javaTimeNanos();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1063
      for (;;) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1064
        int res= _SleepEvent->park(time_to_wait);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1065
        if (res == OS_TIMEOUT || _should_terminate)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1066
          break;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1067
        // spurious wakeup of some kind
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1068
        jlong now = os::javaTimeNanos();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1069
        time_to_wait -= (now - prev_time) / 1000000;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1070
        if (time_to_wait <= 0)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1071
          break;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1072
        prev_time = now;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1073
      }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1074
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    if (is_error_reported()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
      // A fatal error has happened, the error handler(VMError::report_and_die)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
      // should abort JVM after creating an error log file. However in some
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
      // rare cases, the error handler itself might deadlock. Here we try to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
      // kill JVM if the fatal error handler fails to abort in 2 minutes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
      // This code is in WatcherThread because WatcherThread wakes up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
      // periodically so the fatal error handler doesn't need to do anything;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
      // also because the WatcherThread is less likely to crash than other
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
      // threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
      for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
        if (!ShowMessageBoxOnError
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
         && (OnError == NULL || OnError[0] == '\0')
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
         && Arguments::abort_hook() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
             os::sleep(this, 2 * 60 * 1000, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
             fdStream err(defaultStream::output_fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
             err.print_raw_cr("# [ timer expired, abort... ]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
             // skip atexit/vm_exit/vm_abort hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
             os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
        // Wake up 5 seconds later, the fatal handler may reset OnError or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
        // ShowMessageBoxOnError when it is ready to abort.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
        os::sleep(this, 5 * 1000, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
    PeriodicTask::real_time_tick(time_to_wait);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
    // If we have no more tasks left due to dynamic disenrollment,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
    // shut down the thread since we don't currently support dynamic enrollment
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
    if (PeriodicTask::num_tasks() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
      _should_terminate = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  // Signal that it is terminated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
    MutexLockerEx mu(Terminator_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
    _watcher_thread = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
    Terminator_lock->notify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // Thread destructor usually does this..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  ThreadLocalStorage::set_thread(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
void WatcherThread::start() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  if (watcher_thread() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
    _should_terminate = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    // Create the single instance of WatcherThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
    new WatcherThread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
void WatcherThread::stop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  // it is ok to take late safepoints here, if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  MutexLocker mu(Terminator_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  _should_terminate = true;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1136
  OrderAccess::fence();  // ensure WatcherThread sees update in main loop
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1137
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1138
  Thread* watcher = watcher_thread();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1139
  if (watcher != NULL)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1140
    watcher->_SleepEvent->unpark();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1141
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  while(watcher_thread() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
    // This wait should make safepoint checks, wait without a timeout,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
    // and wait as a suspend-equivalent condition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
    // Note: If the FlatProfiler is running, then this thread is waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
    // for the WatcherThread to terminate and the WatcherThread, via the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
    // FlatProfiler task, is waiting for the external suspend request on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
    // this thread to complete. wait_for_ext_suspend_completion() will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
    // eventually timeout, but that takes time. Making this wait a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
    // suspend-equivalent condition solves that timeout problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
    Terminator_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
                          Mutex::_as_suspend_equivalent_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
void WatcherThread::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  st->print("\"%s\" ", name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  Thread::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
// ======= JavaThread ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
// A JavaThread is a normal Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
void JavaThread::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  // Initialize fields
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1170
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1171
  // 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
  1172
  set_claimed_par_id(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1173
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  set_saved_exception_pc(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  set_threadObj(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  _anchor.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  set_entry_point(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  set_jni_functions(jni_functions());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  set_callee_target(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  set_vm_result_2(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  set_vframe_array_head(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  set_vframe_array_last(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  set_deferred_locals(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  set_deopt_mark(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  clear_must_deopt_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  set_monitor_chunks(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  set_next(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  set_thread_state(_thread_new);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  _terminated = _not_terminated;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  _privileged_stack_top = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  _array_for_gc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  _suspend_equivalent = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  _in_deopt_handler = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  _doing_unsafe_access = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  _exception_oop = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  _exception_pc  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  _exception_handler_pc = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  _exception_stack_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  _jvmti_thread_state= NULL;
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4637
diff changeset
  1202
  _should_post_on_exceptions_flag = JNI_FALSE;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  _jvmti_get_loaded_classes_closure = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  _interp_only_mode    = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  _special_runtime_exit_condition = _no_async_condition;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  _pending_async_exception = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  _is_compiling = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  _thread_stat = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  _thread_stat = new ThreadStatistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  _blocked_on_compilation = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  _jni_active_critical = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  _do_not_unlock_if_synchronized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  _cached_monitor_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  _parker = Parker::Allocate(this) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  _jmp_ring_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  for (int ji = 0 ; ji < jump_ring_buffer_size ; ji++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
    record_jump(NULL, NULL, NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
#endif /* PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  set_thread_profiler(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  if (FlatProfiler::is_active()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
    // This is where we would decide to either give each thread it's own profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
    // or use one global one from FlatProfiler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
    // or up to some count of the number of profiled threads, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
    ThreadProfiler* pp = new ThreadProfiler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
    pp->engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
    set_thread_profiler(pp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  // Setup safepoint state info for this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  ThreadSafepointState::create(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  debug_only(_java_call_counter = 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  // JVMTI PopFrame support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
  _popframe_condition = popframe_inactive;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  _popframe_preserved_args = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  _popframe_preserved_args_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  pd_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1246
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1247
SATBMarkQueueSet JavaThread::_satb_mark_queue_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1248
DirtyCardQueueSet JavaThread::_dirty_card_queue_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1249
#endif // !SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1250
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1251
JavaThread::JavaThread(bool is_attaching) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1252
  Thread()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1253
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1254
  , _satb_mark_queue(&_satb_mark_queue_set),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1255
  _dirty_card_queue(&_dirty_card_queue_set)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1256
#endif // !SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1257
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
  initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  _is_attaching = is_attaching;
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3916
diff changeset
  1260
  assert(_deferred_card_mark.is_empty(), "Default MemRegion ctor");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
bool JavaThread::reguard_stack(address cur_sp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  if (_stack_guard_state != stack_guard_yellow_disabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
    return true; // Stack already guarded or guard pages not needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  if (register_stack_overflow()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
    // For those architectures which have separate register and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
    // memory stacks, we must check the register stack to see if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
    // it has overflowed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  // Java code never executes within the yellow zone: the latter is only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  // there to provoke an exception during stack banging.  If java code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
  // is executing there, either StackShadowPages should be larger, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
  // some exception code in c1, c2 or the interpreter isn't unwinding
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
  // when it should.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
  guarantee(cur_sp > stack_yellow_zone_base(), "not enough space to reguard - increase StackShadowPages");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
  enable_stack_yellow_zone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
bool JavaThread::reguard_stack(void) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
  return reguard_stack(os::current_stack_pointer());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
void JavaThread::block_if_vm_exited() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
  if (_terminated == _vm_exited) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
    // _vm_exited is set at safepoint, and Threads_lock is never released
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
    // we will block here forever
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
    Threads_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
// Remove this ifdef when C1 is ported to the compiler interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
static void compiler_thread_entry(JavaThread* thread, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1304
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1305
  Thread()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1306
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1307
  , _satb_mark_queue(&_satb_mark_queue_set),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1308
  _dirty_card_queue(&_dirty_card_queue_set)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1309
#endif // !SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  1310
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
  if (TraceThreadEvents) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
    tty->print_cr("creating thread %p", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
  initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
  _is_attaching = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  set_entry_point(entry_point);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
  // Create the native thread itself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  // %note runtime_23
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
  os::ThreadType thr_type = os::java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
  thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
                                                     os::java_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
  os::create_thread(this, thr_type, stack_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
  // The _osthread may be NULL here because we ran out of memory (too many threads active).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  // We need to throw and OutOfMemoryError - however we cannot do this here because the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  // may hold a lock and all locks must be unlocked before throwing the exception (throwing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
  // the exception consists of creating the exception object & initializing it, initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  // will leave the VM via a JavaCall and then all locks must be unlocked).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  // The thread is still suspended when we reach here. Thread must be explicit started
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  // by creator! Furthermore, the thread must also explicitly be added to the Threads list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  // by calling Threads:add. The reason why this is not done here, is because the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  // object must be fully initialized (take a look at JVM_Start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
JavaThread::~JavaThread() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  if (TraceThreadEvents) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
      tty->print_cr("terminate thread %p", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  // JSR166 -- return the parker to the free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  Parker::Release(_parker);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
  _parker = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  // Free any remaining  previous UnrollBlock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  vframeArray* old_array = vframe_array_last();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
  if (old_array != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
    Deoptimization::UnrollBlock* old_info = old_array->unroll_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
    old_array->set_unroll_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
    delete old_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
    delete old_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
  GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = deferred_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  if (deferred != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
    // This can only happen if thread is destroyed before deoptimization occurs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
    assert(deferred->length() != 0, "empty array!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
      jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
      deferred->remove_at(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
      // individual jvmtiDeferredLocalVariableSet are CHeapObj's
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
      delete dlv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
    } while (deferred->length() != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
    delete deferred;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
  // All Java related clean up happens in exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
  ThreadSafepointState::destroy(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  if (_thread_profiler != NULL) delete _thread_profiler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  if (_thread_stat != NULL) delete _thread_stat;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
// The first routine called by a new Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
void JavaThread::run() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  // initialize thread-local alloc buffer related fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
  this->initialize_tlab();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  // used to test validitity of stack trace backs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  this->record_base_of_stack_pointer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
  // Record real stack base and size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
  this->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  // Initialize thread local storage; set before calling MutexLocker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
  this->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
  this->create_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1391
  this->cache_global_variables();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  1392
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
  // Thread is now sufficient initialized to be handled by the safepoint code as being
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
  // in the VM. Change thread state from _thread_new to _thread_in_vm
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
  ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
  assert(JavaThread::current() == this, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  assert(!Thread::current()->owns_locks(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  DTRACE_THREAD_PROBE(start, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
  // This operation might block. We call that after all safepoint checks for a new thread has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  // been completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  this->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
  if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
    JvmtiExport::post_thread_start(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  // We call another function to do the rest so we are sure that the stack addresses used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  // from there will be lower than the stack base just computed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
  thread_main_inner();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  // Note, thread is no longer valid at this point!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
void JavaThread::thread_main_inner() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
  assert(JavaThread::current() == this, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  assert(this->threadObj() != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
  // Execute thread entry point. If this thread is being asked to restart,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
  // or has been stopped before starting, do not reexecute entry point.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
  // Note: Due to JVM_StopThread we can have pending exceptions already!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  if (!this->has_pending_exception() && !java_lang_Thread::is_stillborn(this->threadObj())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    // enter the thread's entry point only if we have no pending exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
    HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
    this->entry_point()(this, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
  DTRACE_THREAD_PROBE(stop, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  this->exit(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
  delete this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
static void ensure_join(JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  // We do not need to grap the Threads_lock, since we are operating on ourself.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  Handle threadObj(thread, thread->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  assert(threadObj.not_null(), "java thread object must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  ObjectLocker lock(threadObj, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  // Ignore pending exception (ThreadDeath), since we are exiting anyway
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
  // It is of profound importance that we set the stillborn bit and reset the thread object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  // before we do the notify. Since, changing these two variable will make JVM_IsAlive return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
  // false. So in case another thread is doing a join on this thread , it will detect that the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  // is dead when it gets notified.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  java_lang_Thread::set_stillborn(threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  // Thread is exiting. So set thread_status field in  java.lang.Thread class to TERMINATED.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  java_lang_Thread::set_thread(threadObj(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  lock.notify_all(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  // Ignore pending exception (ThreadDeath), since we are exiting anyway
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
  thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1458
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
// For any new cleanup additions, please check to see if they need to be applied to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
// cleanup_failed_attach_current_thread as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  assert(this == JavaThread::current(),  "thread consistency check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
  if (!InitializeJavaLangSystem) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  Handle uncaught_exception(this, this->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  this->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  Handle threadObj(this, this->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  assert(threadObj.not_null(), "Java thread object should be created");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  if (get_thread_profiler() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    get_thread_profiler()->disengage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
    get_thread_profiler()->print(get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  // 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
  1479
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  // FIXIT: The is_null check is only so it works better on JDK1.2 VM's. This
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  // has to be fixed by a runtime query method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  if (!destroy_vm || JDK_Version::is_jdk12x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
    // JSR-166: change call from from ThreadGroup.uncaughtException to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
    // java.lang.Thread.dispatchUncaughtException
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
    if (uncaught_exception.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
      Handle group(this, java_lang_Thread::threadGroup(threadObj()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
      Events::log("uncaught exception INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
        (address)uncaught_exception(), (address)threadObj(), (address)group());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
        EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
        // Check if the method Thread.dispatchUncaughtException() exists. If so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
        // call it.  Otherwise we have an older library without the JSR-166 changes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
        // so call ThreadGroup.uncaughtException()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
        KlassHandle recvrKlass(THREAD, threadObj->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
        CallInfo callinfo;
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1500
        KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
        LinkResolver::resolve_virtual_call(callinfo, threadObj, recvrKlass, thread_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
                                           vmSymbolHandles::dispatchUncaughtException_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
                                           vmSymbolHandles::throwable_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
                                           KlassHandle(), false, false, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
        methodHandle method = callinfo.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
        if (method.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
          JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
                                  threadObj, thread_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
                                  vmSymbolHandles::dispatchUncaughtException_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
                                  vmSymbolHandles::throwable_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
                                  uncaught_exception,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
                                  THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
        } else {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1516
          KlassHandle thread_group(THREAD, SystemDictionary::ThreadGroup_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
          JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
          JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
                                  group, thread_group,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
                                  vmSymbolHandles::uncaughtException_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
                                  vmSymbolHandles::thread_throwable_void_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
                                  threadObj,           // Arg 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
                                  uncaught_exception,  // Arg 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
                                  THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
    // Call Thread.exit(). We try 3 times in case we got another Thread.stop during
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
    // 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
  1532
    // is deprecated anyhow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
    { int count = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
      while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
        EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
        JavaValue result(T_VOID);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1537
        KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
        JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
                              threadObj, thread_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
                              vmSymbolHandles::exit_method_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
                              vmSymbolHandles::void_method_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
                              THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
    // notify JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
    if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
      JvmtiExport::post_thread_end(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
    // We have notified the agents that we are exiting, before we go on,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
    // we must check for a pending external suspend request and honor it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
    // in order to not surprise the thread that made the suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
    while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
        MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
        if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
          set_terminated(_thread_exiting);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
          ThreadService::current_thread_exiting(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
        // Implied else:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
        // Things get a little tricky here. We have a pending external
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
        // suspend request, but we are holding the SR_lock so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
        // can't just self-suspend. So we temporarily drop the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
        // and then self-suspend.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
      ThreadBlockInVM tbivm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
      java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
      // We're done with this suspend request, but we have to loop around
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
      // and check again. Eventually we will get SR_lock without a pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
      // external suspend request and will be able to mark ourselves as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
      // exiting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
    // no more external suspends are allowed at this point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
    // before_exit() has already posted JVMTI THREAD_END events
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  // Notify waiters on thread object. This has to be done after exit() is called
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  // on the thread (if the thread is the last thread in a daemon ThreadGroup the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  // group should have the destroyed bit set before waiters are notified).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  ensure_join(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
  assert(!this->has_pending_exception(), "ensure_join should have cleared");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  // 6282335 JNI DetachCurrentThread spec states that all Java monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  // held by this thread must be released.  A detach operation must only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  // get here if there are no Java frames on the stack.  Therefore, any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  // owned monitors at this point MUST be JNI-acquired monitors which are
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
  // pre-inflated and in the monitor cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
  // ensure_join() ignores IllegalThreadStateExceptions, and so does this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
  if (exit_type == jni_detach && JNIDetachReleasesMonitors) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
    assert(!this->has_last_Java_frame(), "detaching with Java frames?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
    ObjectSynchronizer::release_monitors_owned_by_thread(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
    assert(!this->has_pending_exception(), "release_monitors should have cleared");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
  // These things needs to be done while we are still a Java Thread. Make sure that thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
  // is in a consistent state, in case GC happens
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
  assert(_privileged_stack_top == NULL, "must be NULL when we get here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  if (active_handles() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
    JNIHandleBlock* block = active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
    set_active_handles(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
    JNIHandleBlock::release_block(block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
  if (free_handle_block() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
    JNIHandleBlock* block = free_handle_block();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
    set_free_handle_block(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
    JNIHandleBlock::release_block(block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
  // These have to be removed while this is still a valid thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
  remove_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
  if (UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
    tlab().make_parsable(true);  // retire TLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1625
  if (jvmti_thread_state() != NULL) {
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1626
    JvmtiExport::cleanup_thread(this);
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1627
  }
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 1
diff changeset
  1628
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1629
#ifndef SERIALGC
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1630
  // We must flush G1-related buffers before removing a thread from
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1631
  // the list of active threads.
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1632
  if (UseG1GC) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1633
    flush_barrier_queues();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1634
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1635
#endif
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1636
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  // 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
  1638
  Threads::remove(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1641
#ifndef SERIALGC
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1642
// Flush G1-related queues.
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1643
void JavaThread::flush_barrier_queues() {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1644
  satb_mark_queue().flush();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1645
  dirty_card_queue().flush();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1646
}
6768
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1647
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1648
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
  1649
  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
  1650
         "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
  1651
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1652
  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
  1653
  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
  1654
  // 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
  1655
  // 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
  1656
  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
  1657
  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
  1658
  // 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
  1659
  // 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
  1660
  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
  1661
    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
  1662
  }
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1663
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1664
  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
  1665
  // 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
  1666
  // 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
  1667
  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
  1668
}
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  1669
#endif // !SERIALGC
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1670
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
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
  1672
  if (get_thread_profiler() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1673
    get_thread_profiler()->disengage();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1674
    ResourceMark rm;
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1675
    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
  1676
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1677
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1678
  if (active_handles() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1679
    JNIHandleBlock* block = active_handles();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1680
    set_active_handles(NULL);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1681
    JNIHandleBlock::release_block(block);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1682
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1683
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1684
  if (free_handle_block() != NULL) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1685
    JNIHandleBlock* block = free_handle_block();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1686
    set_free_handle_block(NULL);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1687
    JNIHandleBlock::release_block(block);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1688
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1689
5041
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4761
diff changeset
  1690
  // 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
  1691
  remove_stack_guard_pages();
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4761
diff changeset
  1692
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1693
  if (UseTLAB) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1694
    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
  1695
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1696
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1697
#ifndef SERIALGC
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1698
  if (UseG1GC) {
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1699
    flush_barrier_queues();
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1700
  }
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1701
#endif
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1702
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1703
  Threads::remove(this);
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1704
  delete this;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
1560
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1708
1b328492b7f8 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 1415
diff changeset
  1709
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
JavaThread* JavaThread::active() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  Thread* thread = ThreadLocalStorage::thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  assert(thread != NULL, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
  if (thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
    return (JavaThread*) thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
    assert(thread->is_VM_thread(), "this must be a vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
    VM_Operation* op = ((VMThread*) thread)->vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
    JavaThread *ret=op == NULL ? NULL : (JavaThread *)op->calling_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
    assert(ret->is_Java_thread(), "must be a Java thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
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
  1725
  if (Thread::is_lock_owned(adr)) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
    if (chunk->contains(adr)) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
void JavaThread::add_monitor_chunk(MonitorChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
  chunk->set_next(monitor_chunks());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
  set_monitor_chunks(chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
void JavaThread::remove_monitor_chunk(MonitorChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  guarantee(monitor_chunks() != NULL, "must be non empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  if (monitor_chunks() == chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
    set_monitor_chunks(chunk->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
    MonitorChunk* prev = monitor_chunks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
    while (prev->next() != chunk) prev = prev->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
    prev->set_next(chunk->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
// JVM support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
// Note: this function shouldn't block if it's called in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
// _thread_in_native_trans state (such as from
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
// check_special_condition_for_native_trans()).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
void JavaThread::check_and_handle_async_exceptions(bool check_unsafe_error) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  if (has_last_Java_frame() && has_async_condition()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
    // If we are at a polling page safepoint (not a poll return)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
    // then we must defer async exception because live registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
    // will be clobbered by the exception path. Poll return is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
    // ok because the call we a returning from already collides
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
    // with exception handling registers and so there is no issue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
    // (The exception handling path kills call result registers but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
    //  this is ok since the exception kills the result anyway).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
    if (is_at_poll_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
      // if the code we are returning to has deoptimized we must defer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
      // the exception otherwise live registers get clobbered on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
      // exception path before deoptimization is able to retrieve them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
      RegisterMap map(this, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
      frame caller_fr = last_frame().sender(&map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
      assert(caller_fr.is_compiled_frame(), "what?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
      if (caller_fr.is_deoptimized_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
        if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
          ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
          tty->print_cr("deferred async exception at compiled safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  JavaThread::AsyncRequests condition = clear_special_runtime_exit_condition();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  if (condition == _no_async_condition) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
    // Conditions have changed since has_special_runtime_exit_condition()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
    // was called:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
    // - if we were here only because of an external suspend request,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
    //   then that was taken care of above (or cancelled) so we are done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
    // - if we were here because of another async request, then it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
    //   been cleared between the has_special_runtime_exit_condition()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
    //   and now so again we are done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
  // Check for pending async. exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
  if (_pending_async_exception != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
    // 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
  1800
    if (!has_pending_exception() || !pending_exception()->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
      // We cannot call Exceptions::_throw(...) here because we cannot block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
      set_pending_exception(_pending_async_exception, __FILE__, __LINE__);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
      if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
        tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
        if (has_last_Java_frame() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
          frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
          tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
        tty->print_cr(" of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
      _pending_async_exception = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
      clear_has_async_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  if (check_unsafe_error &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
      condition == _async_unsafe_access_error && !has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
    condition = _no_async_condition;  // done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
    switch (thread_state()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
    case _thread_in_vm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
        THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
    case _thread_in_native:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
        ThreadInVMfromNative tiv(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
        THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
    case _thread_in_Java:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
        ThreadInVMfromJava tiv(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
        JavaThread* THREAD = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
        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
  1839
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
  assert(condition == _no_async_condition || has_pending_exception() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
         (!check_unsafe_error && condition == _async_unsafe_access_error),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
         "must have handled the async condition, if no exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
  // Check for pending external suspend. Internal suspend requests do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  // not use handle_special_runtime_exit_condition().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
  // If JNIEnv proxies are allowed, don't self-suspend if the target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  // thread is not the current thread. In older versions of jdbx, jdbx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  // threads could call into the VM with another thread's JNIEnv so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  // can be here operating on behalf of a suspended thread (4432884).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
  bool do_self_suspend = is_external_suspend_with_lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  if (do_self_suspend && (!AllowJNIEnvProxy || this == JavaThread::current())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
    // Because thread is external suspended the safepoint code will count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
    // thread as at a safepoint. This can be odd because we can be here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    // as _thread_in_Java which would normally transition to _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
    // at a safepoint. We would like to mark the thread as _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
    // before calling java_suspend_self like all other callers of it but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
    // we must then observe proper safepoint protocol. (We can't leave
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
    // _thread_blocked with a safepoint in progress). However we can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
    // here as _thread_in_native_trans so we can't use a normal transition
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
    // constructor/destructor pair because they assert on that type of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
    // transition. We could do something like:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
    // JavaThreadState state = thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
    // set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
    // {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
    //   ThreadBlockInVM tbivm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
    //   java_suspend_self()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
    // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
    // set_thread_state(_thread_in_vm_trans);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
    // if (safepoint) block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
    // set_thread_state(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
    // but that is pretty messy. Instead we just go with the way the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
    // code has worked before and note that this is the only path to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
    // java_suspend_self that doesn't put the thread in _thread_blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
    // mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
    frame_anchor()->make_walkable(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
    java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
    // We might be here for reasons in addition to the self-suspend request
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
    // so check for other async requests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
  if (check_asyncs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
    check_and_handle_async_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
void JavaThread::send_thread_stop(oop java_throwable)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
  assert(Thread::current()->is_VM_thread(), "should be in the vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  assert(Threads_lock->is_locked(), "Threads_lock should be locked by safepoint code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
  assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  // Do not throw asynchronous exceptions against the compiler thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
  // (the compiler thread should not be a Java thread -- fix in 1.4.2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  if (is_Compiler_thread()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
  // This is a change from JDK 1.1, but JDK 1.2 will also do it:
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4564
diff changeset
  1909
  if (java_throwable->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
    java_lang_Thread::set_stillborn(threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
    // Actually throw the Throwable against the target Thread - however
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
    // 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
  1916
    if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
      // If the topmost frame is a runtime stub, then we are calling into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
      // OptoRuntime from compiled code. Some runtime stubs (new, monitor_exit..)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
      // must deoptimize the caller before continuing, as the compiled  exception handler table
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
      // may not be valid
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
      if (has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
        frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
        if (f.is_runtime_frame() || f.is_safepoint_blob_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
          // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
          RegisterMap reg_map(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
          frame compiled_frame = f.sender(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
          if (compiled_frame.can_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
            Deoptimization::deoptimize(this, compiled_frame, &reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
      // Set async. pending exception in thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
      set_pending_async_exception(java_throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
      if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
       ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
       tty->print_cr("Pending Async. exception installed of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
      // for AbortVMOnException flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
      NOT_PRODUCT(Exceptions::debug_check_abort(instanceKlass::cast(_pending_async_exception->klass())->external_name()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
  // Interrupt thread so it will wake up from a potential wait()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  Thread::interrupt(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
// External suspension mechanism.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
// Tell the VM to suspend a thread when ever it knows that it does not hold on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
// to any VM_locks and it is at a transition
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
// Self-suspension will happen on the transition out of the vm.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
// Catch "this" coming in from JNIEnv pointers when the thread has been freed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
// Guarantees on return:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
//   + Target thread will not execute any new bytecode (that's why we need to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
//     force a safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
//   + Target thread will not enter any new monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
void JavaThread::java_suspend() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
  { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
    if (!Threads::includes(this) || is_exiting() || this->threadObj() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
       return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
  { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
    if (!is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
      // a racing resume has cancelled us; bail out now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
    // suspend is done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
    uint32_t debug_bits = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
    // Warning: is_ext_suspend_completed() may temporarily drop the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
    // SR_lock to allow the thread to reach a stable thread state if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
    // it is currently in a transient thread state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
    if (is_ext_suspend_completed(false /* !called_by_wait */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
                                 SuspendRetryDelay, &debug_bits) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
  VM_ForceSafepoint vm_suspend;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  VMThread::execute(&vm_suspend);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
// Part II of external suspension.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
// A JavaThread self suspends when it detects a pending external suspend
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
// request. This is usually on transitions. It is also done in places
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
// where continuing to the next transition would surprise the caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
// e.g., monitor entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
// Returns the number of times that the thread self-suspended.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
// Note: DO NOT call java_suspend_self() when you just want to block current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
//       thread. java_suspend_self() is the second stage of cooperative
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
//       suspension for external suspend requests and should only be used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
//       to complete an external suspend request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
int JavaThread::java_suspend_self() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
  int ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
  // we are in the process of exiting so don't suspend
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  if (is_exiting()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
     clear_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
     return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  assert(_anchor.walkable() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
    (is_Java_thread() && !((JavaThread*)this)->has_last_Java_frame()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
    "must have walkable stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
3826
67b89f5a5cac 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 3261
diff changeset
  2018
  assert(!this->is_ext_suspended(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
    "a thread trying to self-suspend should not already be suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  if (this->is_suspend_equivalent()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
    // If we are self-suspending as a result of the lifting of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
    // suspend equivalent condition, then the suspend_equivalent
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
    // flag is not cleared until we set the ext_suspended flag so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
    // that wait_for_ext_suspend_completion() returns consistent
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
    // results.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
    this->clear_suspend_equivalent();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  // A racing resume may have cancelled us before we grabbed SR_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  // above. Or another external suspend request could be waiting for us
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  // by the time we return from SR_lock()->wait(). The thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  // that requested the suspension may already be trying to walk our
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  // stack and if we return now, we can change the stack out from under
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  // it. This would be a "bad thing (TM)" and cause the stack walker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  // to crash. We stay self-suspended until there are no more pending
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
  // external suspend requests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
  while (is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
    ret++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
    this->set_ext_suspended();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
    // _ext_suspended flag is cleared by java_resume()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
    while (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
      this->SR_lock()->wait(Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
// verify the JavaThread has not yet been published in the Threads::list, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
// hence doesn't need protection from concurrent access at this stage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
void JavaThread::verify_not_published() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  if (!Threads_lock->owned_by_self()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
   MutexLockerEx ml(Threads_lock,  Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
   assert( !Threads::includes(this),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
           "java thread shouldn't have been published yet!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
   assert( !Threads::includes(this),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
           "java thread shouldn't have been published yet!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
// Slow path when the native==>VM/Java barriers detect a safepoint is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
// progress or when _suspend_flags is non-zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
// Current thread needs to self-suspend if there is a suspend request and/or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
// block if a safepoint is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
// Async exception ISN'T checked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
// Note only the ThreadInVMfromNative transition can call this function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
// directly and when thread state is _thread_in_native_trans
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
  JavaThread *curJT = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
  bool do_self_suspend = thread->is_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
  assert(!curJT->has_last_Java_frame() || curJT->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
  // If JNIEnv proxies are allowed, don't self-suspend if the target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
  // thread is not the current thread. In older versions of jdbx, jdbx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
  // threads could call into the VM with another thread's JNIEnv so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  // can be here operating on behalf of a suspended thread (4432884).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
  if (do_self_suspend && (!AllowJNIEnvProxy || curJT == thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
    JavaThreadState state = thread->thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
    // We mark this thread_blocked state as a suspend-equivalent so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
    // that a caller to is_ext_suspend_completed() won't be confused.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
    // The suspend-equivalent state is cleared by java_suspend_self().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
    thread->set_suspend_equivalent();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
    // If the safepoint code sees the _thread_in_native_trans state, it will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
    // wait until the thread changes to other thread state. There is no
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
    // guarantee on how soon we can obtain the SR_lock and complete the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
    // self-suspend request. It would be a bad idea to let safepoint wait for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
    // too long. Temporarily change the state to _thread_blocked to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
    // let the VM thread know that this thread is ready for GC. The problem
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
    // of changing thread state is that safepoint could happen just after
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
    // java_suspend_self() returns after being resumed, and VM thread will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
    // see the _thread_blocked state. We must check for safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
    // after restoring the state and make sure we won't leave while a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
    // is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
    thread->set_thread_state(_thread_blocked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
    thread->java_suspend_self();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
    thread->set_thread_state(state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
    // Make sure new state is seen by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
    if (os::is_MP()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
      if (UseMembar) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
        // Force a fence between the write above and read below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
        OrderAccess::fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
        // Must use this rather than serialization page in particular on Windows
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
        InterfaceSupport::serialize_memory(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
  if (SafepointSynchronize::do_call_back()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
    // If we are safepointing, then block the caller which may not be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
    // the same as the target thread (see above).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
    SafepointSynchronize::block(curJT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
  if (thread->is_deopt_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
    thread->clear_deopt_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
    RegisterMap map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
    frame f = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
    while ( f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      f = f.sender(&map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
    if (f.id() == thread->must_deopt_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
      thread->clear_must_deopt_id();
6269
10e06287c0b0 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 6184
diff changeset
  2135
      f.deoptimize(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
      fatal("missed deoptimization!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
// Slow path when the native==>VM/Java barriers detect a safepoint is in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
// progress or when _suspend_flags is non-zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
// Current thread needs to self-suspend if there is a suspend request and/or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
// block if a safepoint is in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
// Also check for pending async exception (not including unsafe access error).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
// Note only the native==>VM/Java barriers can call this function and when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
// thread state is _thread_in_native_trans.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
void JavaThread::check_special_condition_for_native_trans(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
  check_safepoint_and_suspend_for_native_trans(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  if (thread->has_async_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
    // We are in _thread_in_native_trans state, don't handle unsafe
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
    // access error since that may block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
    thread->check_and_handle_async_exceptions(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
// We need to guarantee the Threads_lock here, since resumes are not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
// allowed during safepoint synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
// Can only resume from an external suspension
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
void JavaThread::java_resume() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
  // Sanity check: thread is gone, has started exiting or the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
  // was not externally suspended.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
  if (!Threads::includes(this) || is_exiting() || !is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
  MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
  clear_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  if (is_ext_suspended()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
    clear_ext_suspended();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
    SR_lock()->notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
void JavaThread::create_stack_guard_pages() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
  if (! os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
  address low_addr = stack_base() - stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
  size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
  int allocate = os::allocate_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
  // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 5041
diff changeset
  2189
  if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
    warning("Attempt to allocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
  if (os::guard_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
    _stack_guard_state = stack_guard_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
    warning("Attempt to protect stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
    if (os::uncommit_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
      warning("Attempt to deallocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
void JavaThread::remove_stack_guard_pages() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
  if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
  address low_addr = stack_base() - stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
  size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
  if (os::allocate_stack_guard_pages()) {
5085
4f0c435f8c3c 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 5041
diff changeset
  2210
    if (os::remove_stack_guard_pages((char *) low_addr, len)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
      _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
      warning("Attempt to deallocate stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
    if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
    if (os::unguard_memory((char *) low_addr, len)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
      _stack_guard_state = stack_guard_unused;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
        warning("Attempt to unprotect stack guard pages failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
void JavaThread::enable_stack_yellow_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
  assert(_stack_guard_state != stack_guard_enabled, "already enabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
  address base = stack_yellow_zone_base() - stack_yellow_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
  guarantee(base < stack_base(),"Error calculating stack yellow zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  guarantee(base < os::current_stack_pointer(),"Error calculating stack yellow zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  if (os::guard_memory((char *) base, stack_yellow_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
    _stack_guard_state = stack_guard_enabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
    warning("Attempt to guard stack yellow zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
  enable_register_stack_guard();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
void JavaThread::disable_stack_yellow_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
  assert(_stack_guard_state != stack_guard_yellow_disabled, "already disabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
  // Simply return if called for a thread that does not use guard pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
  if (_stack_guard_state == stack_guard_unused) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
  address base = stack_yellow_zone_base() - stack_yellow_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  if (os::unguard_memory((char *)base, stack_yellow_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
    _stack_guard_state = stack_guard_yellow_disabled;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
    warning("Attempt to unguard stack yellow zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  disable_register_stack_guard();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
void JavaThread::enable_stack_red_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  address base = stack_red_zone_base() - stack_red_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  guarantee(base < stack_base(),"Error calculating stack red zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
  guarantee(base < os::current_stack_pointer(),"Error calculating stack red zone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  if(!os::guard_memory((char *) base, stack_red_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
    warning("Attempt to guard stack red zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
void JavaThread::disable_stack_red_zone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
  // The base notation is from the stacks point of view, growing downward.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  // We need to adjust it to work correctly with guard_memory()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  address base = stack_red_zone_base() - stack_red_zone_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  if (!os::unguard_memory((char *)base, stack_red_zone_size())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
    warning("Attempt to unguard stack red zone failed.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
void JavaThread::frames_do(void f(frame*, const RegisterMap* map)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  // ignore is there is no stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
  // traverse the stack frames. Starts from top frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
    frame* fr = fst.current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
    f(fr, fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
// Deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
// Function for testing deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
void JavaThread::deoptimize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  StackFrameStream fst(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  bool deopt = false;           // Dump stack only if a deopt actually happens.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
  bool only_at = strlen(DeoptimizeOnlyAt) > 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
  // Iterate over all frames in the thread and deoptimize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  for(; !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
    if(fst.current()->can_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
      if (only_at) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
        // Deoptimize only at particular bcis.  DeoptimizeOnlyAt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
        // consists of comma or carriage return separated numbers so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
        // search for the current bci in that string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
        address pc = fst.current()->pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
        nmethod* nm =  (nmethod*) fst.current()->cb();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
        ScopeDesc* sd = nm->scope_desc_at( pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
        char buffer[8];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
        jio_snprintf(buffer, sizeof(buffer), "%d", sd->bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
        size_t len = strlen(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
        const char * found = strstr(DeoptimizeOnlyAt, buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
        while (found != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
          if ((found[len] == ',' || found[len] == '\n' || found[len] == '\0') &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
              (found == DeoptimizeOnlyAt || found[-1] == ',' || found[-1] == '\n')) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
            // Check that the bci found is bracketed by terminators.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
          found = strstr(found + 1, buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
        if (!found) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
      if (DebugDeoptimization && !deopt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
        deopt = true; // One-time only print before deopt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
        tty->print_cr("[BEFORE Deoptimization]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
        trace_frames();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
        trace_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
      Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
  if (DebugDeoptimization && deopt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
    tty->print_cr("[AFTER Deoptimization]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
    trace_frames();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
// Make zombies
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
void JavaThread::make_zombies() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
    if (fst.current()->can_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
      // it is a Java nmethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
      nmethod* nm = CodeCache::find_nmethod(fst.current()->pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
      nm->make_not_entrant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
void JavaThread::deoptimized_wrt_marked_nmethods() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
  // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
  StackFrameStream fst(this, UseBiasedLocking);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
  for(; !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
    if (fst.current()->should_be_deoptimized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
      Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
// GC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
static void frame_gc_epilogue(frame* f, const RegisterMap* map) { f->gc_epilogue(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
void JavaThread::gc_epilogue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
  frames_do(frame_gc_epilogue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
static void frame_gc_prologue(frame* f, const RegisterMap* map) { f->gc_prologue(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
void JavaThread::gc_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
  frames_do(frame_gc_prologue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2390
// 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
  2391
// 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
  2392
class RememberProcessedThread: public StackObj {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2393
  NamedThread* _cur_thr;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2394
public:
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2395
  RememberProcessedThread(JavaThread* jthr) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2396
    Thread* thread = Thread::current();
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2397
    if (thread->is_Named_thread()) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2398
      _cur_thr = (NamedThread *)thread;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2399
      _cur_thr->set_processed_thread(jthr);
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2400
    } else {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2401
      _cur_thr = NULL;
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2402
    }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2403
  }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2404
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2405
  ~RememberProcessedThread() {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2406
    if (_cur_thr) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2407
      _cur_thr->set_processed_thread(NULL);
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2408
    }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2409
  }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2410
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2412
void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4573
diff changeset
  2413
  // Verify that the deferred card marks have been flushed.
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4573
diff changeset
  2414
  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
  2415
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
  // The ThreadProfiler oops_do is done from FlatProfiler::oops_do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
  // since there may be more than one thread using each ThreadProfiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
  // Traverse the GCHandles
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2420
  Thread::oops_do(f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
  assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
          (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
  if (has_last_Java_frame()) {
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2426
    // Record JavaThread to GC thread
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4485
diff changeset
  2427
    RememberProcessedThread rpt(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
    // Traverse the privileged stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
    if (_privileged_stack_top != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
      _privileged_stack_top->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
    // traverse the registered growable array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
    if (_array_for_gc != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
      for (int index = 0; index < _array_for_gc->length(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
        f->do_oop(_array_for_gc->adr_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
    // Traverse the monitor chunks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
    for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
      chunk->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
    // Traverse the execution stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
    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
  2448
      fst.current()->oops_do(f, cf, fst.register_map());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
  // callee_target is never live across a gc point so NULL it here should
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
  // it still contain a methdOop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
  set_callee_target(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
  assert(vframe_array_head() == NULL, "deopt in progress at a safepoint!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
  // If we have deferred set_locals there might be oops waiting to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2459
  // written
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2460
  GrowableArray<jvmtiDeferredLocalVariableSet*>* list = deferred_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
  if (list != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
    for (int i = 0; i < list->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
      list->at(i)->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
  // Traverse instance variables at the end since the GC may be moving things
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  // around using this function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
  f->do_oop((oop*) &_threadObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
  f->do_oop((oop*) &_vm_result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
  f->do_oop((oop*) &_vm_result_2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
  f->do_oop((oop*) &_exception_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
  f->do_oop((oop*) &_pending_async_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
  if (jvmti_thread_state() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
    jvmti_thread_state()->oops_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2480
void JavaThread::nmethods_do(CodeBlobClosure* cf) {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2481
  Thread::nmethods_do(cf);  // (super method is a no-op)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
  assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
          (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
  if (has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
    // Traverse the execution stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
    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
  2489
      fst.current()->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
// Printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
const char* _get_thread_state_name(JavaThreadState _thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
  switch (_thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
  case _thread_uninitialized:     return "_thread_uninitialized";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
  case _thread_new:               return "_thread_new";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
  case _thread_new_trans:         return "_thread_new_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
  case _thread_in_native:         return "_thread_in_native";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
  case _thread_in_native_trans:   return "_thread_in_native_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
  case _thread_in_vm:             return "_thread_in_vm";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
  case _thread_in_vm_trans:       return "_thread_in_vm_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
  case _thread_in_Java:           return "_thread_in_Java";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
  case _thread_in_Java_trans:     return "_thread_in_Java_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
  case _thread_blocked:           return "_thread_blocked";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
  case _thread_blocked_trans:     return "_thread_blocked_trans";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
  default:                        return "unknown thread state";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
void JavaThread::print_thread_state_on(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
  st->print_cr("   JavaThread state: %s", _get_thread_state_name(_thread_state));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
void JavaThread::print_thread_state() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
  print_thread_state_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
// Called by Threads::print() for VM_PrintThreads operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
void JavaThread::print_on(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
  st->print("\"%s\" ", get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
  oop thread_oop = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
  if (thread_oop != NULL && java_lang_Thread::is_daemon(thread_oop))  st->print("daemon ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
  Thread::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
  // 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
  2528
  st->print_cr("[" INTPTR_FORMAT "]", (intptr_t)last_Java_sp() & ~right_n_bits(12));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
  if (thread_oop != NULL && JDK_Version::is_gte_jdk15x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
    st->print_cr("   java.lang.Thread.State: %s", java_lang_Thread::thread_status_name(thread_oop));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
  print_thread_state_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
  _safepoint_state->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
// Called by fatal error handler. The difference between this and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
// JavaThread::print() is that we can't grab lock or allocate memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
void JavaThread::print_on_error(outputStream* st, char *buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
  st->print("JavaThread \"%s\"",  get_thread_name_string(buf, buflen));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
     if (java_lang_Thread::is_daemon(thread_obj)) st->print(" daemon");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
  st->print(" [");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
  st->print("%s", _get_thread_state_name(_thread_state));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
  if (osthread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
    st->print(", id=%d", osthread()->thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
  st->print(", stack(" PTR_FORMAT "," PTR_FORMAT ")",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
            _stack_base - _stack_size, _stack_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
  st->print("]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
// Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
void JavaThread::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
  // Verify oops in the thread.
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  2563
  oops_do(&VerifyOopClosure::verify_oop, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  // Verify the stack frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
  frames_do(frame_verify);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
// CR 6300358 (sub-CR 2137150)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
// Most callers of this method assume that it can't return NULL but a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
// thread may not have a name whilst it is in the process of attaching to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
// the VM - see CR 6412693, and there are places where a JavaThread can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
// seen prior to having it's threadObj set (eg JNI attaching threads and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
// if vm exit occurs during initialization). These cases can all be accounted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
// for such that this method never returns NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
const char* JavaThread::get_thread_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
  // early safepoints can hit while current thread does not yet have TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
  if (!SafepointSynchronize::is_at_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
    Thread *cur = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
    if (!(cur->is_Java_thread() && cur == this)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
      // Current JavaThreads are allowed to get their own name without
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
      // the Threads_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
      assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
    return get_thread_name_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
// Returns a non-NULL representation of this thread's name, or a suitable
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
// descriptive string if there is no set name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
const char* JavaThread::get_thread_name_string(char* buf, int buflen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  const char* name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
    typeArrayOop name = java_lang_Thread::name(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
    if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
      if (buf == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
        name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
      else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
        name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length(), buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
    else if (is_attaching()) { // workaround for 6412693 - see 6404306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
      name_str = "<no-name - thread is attaching>";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
      name_str = Thread::name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
    name_str = Thread::name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
  assert(name_str != NULL, "unexpected NULL thread name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
  return name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
const char* JavaThread::get_threadgroup_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
  debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
    oop thread_group = java_lang_Thread::threadGroup(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
    if (thread_group != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
      typeArrayOop name = java_lang_ThreadGroup::name(thread_group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
      // ThreadGroup.name can be null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
      if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
        const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
        return str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
const char* JavaThread::get_parent_name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
  debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
  oop thread_obj = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
  if (thread_obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
    oop thread_group = java_lang_Thread::threadGroup(thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
    if (thread_group != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
      oop parent = java_lang_ThreadGroup::parent(thread_group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
      if (parent != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
        typeArrayOop name = java_lang_ThreadGroup::name(parent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
        // ThreadGroup.name can be null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
        if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
          const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
          return str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
ThreadPriority JavaThread::java_priority() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
  oop thr_oop = threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
  if (thr_oop == NULL) return NormPriority; // Bootstrapping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
  ThreadPriority priority = java_lang_Thread::priority(thr_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
  assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
  return priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
void JavaThread::prepare(jobject jni_thread, ThreadPriority prio) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
  assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
  // Link Java Thread object <-> C++ Thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
  // Get the C++ thread object (an oop) from the JNI handle (a jthread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
  // and put it into a new Handle.  The Handle "thread_oop" can then
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  // be used to pass the C++ thread object to other methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
  // Set the Java level thread object (jthread) field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
  // new thread (a JavaThread *) to C++ thread object using the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
  // "thread_oop" handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
  // Set the thread field (a JavaThread *) of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
  // oop representing the java_lang_Thread to the new thread (a JavaThread *).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
  Handle thread_oop(Thread::current(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
                    JNIHandles::resolve_non_null(jni_thread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
  assert(instanceKlass::cast(thread_oop->klass())->is_linked(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
    "must be initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
  set_threadObj(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
  java_lang_Thread::set_thread(thread_oop(), this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
  if (prio == NoPriority) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
    prio = java_lang_Thread::priority(thread_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
    assert(prio != NoPriority, "A valid priority should be present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
  // Push the Java priority down to the native thread; needs Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
  Thread::set_priority(this, prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
  // Add the new thread to the Threads list and set it in motion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
  // We must have threads lock in order to call Threads::add.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
  // It is crucial that we do not block before the thread is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
  // added to the Threads list for if a GC happens, then the java_thread oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
  // will not be visited by GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
  Threads::add(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
oop JavaThread::current_park_blocker() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
  // Support for JSR-166 locks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
  oop thread_oop = threadObj();
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2708
  if (thread_oop != NULL &&
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2709
      JDK_Version::current().supports_thread_park_blocker()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
    return java_lang_Thread::park_blocker(thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
void JavaThread::print_stack_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2717
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
  HandleMark   hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
  RegisterMap reg_map(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
  vframe* start_vf = last_java_vframe(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
  int count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
  for (vframe* f = start_vf; f; f = f->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
    if (f->is_java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
      javaVFrame* jvf = javaVFrame::cast(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
      java_lang_Throwable::print_stack_element(st, jvf->method(), jvf->bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
      // Print out lock information
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
      if (JavaMonitorsInStackTrace) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
        jvf->print_lock_info_on(st, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
      // Ignore non-Java frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
    // Bail-out case for too deep stacks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
    count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
    if (MaxJavaStackTraceDepth == count) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
// JVMTI PopFrame support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
  assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
  if (in_bytes(size_in_bytes) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
    _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
    _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
  2750
    Copy::conjoint_jbytes(start, _popframe_preserved_args, _popframe_preserved_args_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
void* JavaThread::popframe_preserved_args() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
  return _popframe_preserved_args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
ByteSize JavaThread::popframe_preserved_args_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
  return in_ByteSize(_popframe_preserved_args_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
WordSize JavaThread::popframe_preserved_args_size_in_words() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
  int sz = in_bytes(popframe_preserved_args_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
  assert(sz % wordSize == 0, "argument size must be multiple of wordSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
  return in_WordSize(sz / wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
void JavaThread::popframe_free_preserved_args() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
  assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
  _popframe_preserved_args = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
  _popframe_preserved_args_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
void JavaThread::trace_frames() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
  tty->print_cr("[Describe stack]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
  int frame_no = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
  for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
    tty->print("  %d. ", frame_no++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
    fst.current()->print_value_on(tty,this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
void JavaThread::trace_stack_from(vframe* start_vf) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
  int vframe_no = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
  for (vframe* f = start_vf; f; f = f->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
    if (f->is_java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
      javaVFrame::cast(f)->print_activation(vframe_no++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
      f->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
    if (vframe_no > StackPrintLimit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
      tty->print_cr("...<more frames>...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
    }
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
void JavaThread::trace_stack() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
  if (!has_last_Java_frame()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
  HandleMark   hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
  RegisterMap reg_map(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
  trace_stack_from(last_java_vframe(&reg_map));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2813
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
javaVFrame* JavaThread::last_java_vframe(RegisterMap *reg_map) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
  assert(reg_map != NULL, "a map must be given");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
  frame f = last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
  for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
    if (vf->is_java_frame()) return javaVFrame::cast(vf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
klassOop JavaThread::security_get_caller_class(int depth) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
  vframeStream vfst(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
  vfst.security_get_caller_frame(depth);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
  if (!vfst.at_end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
    return vfst.method()->method_holder();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
static void compiler_thread_entry(JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
  assert(thread->is_Compiler_thread(), "must be compiler thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
  CompileBroker::compiler_thread_loop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
// Create a CompilerThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
CompilerThread::CompilerThread(CompileQueue* queue, CompilerCounters* counters)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
: JavaThread(&compiler_thread_entry) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
  _env   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
  _log   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
  _task  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
  _queue = queue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
  _counters = counters;
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
  2849
  _buffer_blob = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
  _ideal_graph_printer = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
// ======= Threads ========
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
// The Threads class links together all active threads, and provides
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
// operations over all threads.  It is protected by its own Mutex
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
// lock, which is also used in other contexts to protect thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
// operations from having the thread being operated on from exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
// and going away unexpectedly (e.g., safepoint synchronization)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
JavaThread* Threads::_thread_list = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
int         Threads::_number_of_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
int         Threads::_number_of_non_daemon_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
int         Threads::_return_code = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
size_t      JavaThread::_stack_size_at_create = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
// All JavaThreads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
#define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
void os_stream();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
// All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
void Threads::threads_do(ThreadClosure* tc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
  assert_locked_or_safepoint(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
  // ALL_JAVA_THREADS iterates through all JavaThreads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
    tc->do_thread(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
  // Someday we could have a table or list of all non-JavaThreads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
  // For now, just manually iterate through them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
  tc->do_thread(VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
  Universe::heap()->gc_threads_do(tc);
1127
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2887
  WatcherThread *wt = WatcherThread::watcher_thread();
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2888
  // 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
  2889
  // 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
  2890
  // 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
  2891
  // 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
  2892
  // way to prevent termination of WatcherThread would be to acquire
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2893
  // 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
  2894
  // checking in some cases.
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2895
  if (wt != NULL)
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2896
    tc->do_thread(wt);
7245ad3ee7ea 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 994
diff changeset
  2897
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  // If CompilerThreads ever become non-JavaThreads, add them here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2903
  extern void JDK_Version_init();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2904
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
  // Check version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
  if (!is_supported_jni_version(args->version)) return JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
  // Initialize the output stream module
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
  ostream_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
  // Process java launcher properties.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
  Arguments::process_sun_java_launcher_properties(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
  // Initialize the os module before using TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
  os::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
  // Initialize system properties.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
  Arguments::init_system_properties();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
950
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2920
  // 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
  2921
  JDK_Version_init();
6112b627bb36 6721093: -XX:AppendRatio=N not supported
kamg
parents: 670
diff changeset
  2922
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
  // Parse arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
  jint parse_result = Arguments::parse(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
  if (parse_result != JNI_OK) return parse_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
  if (PauseAtStartup) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
    os::pause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
  HS_DTRACE_PROBE(hotspot, vm__init__begin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
  // Record VM creation timing statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
  TraceVmCreationTime create_vm_timer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
  create_vm_timer.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
  // Timing (must come after argument parsing)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
  TraceTime timer("Create VM", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
  // Initialize the os module after parsing the args
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
  jint os_init_2_result = os::init_2();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  if (os_init_2_result != JNI_OK) return os_init_2_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
  // Initialize output stream logging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
  ostream_init_log();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
  // Convert -Xrun to -agentlib: if there is no JVM_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
  // Must be before create_vm_init_agents()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
  if (Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
    convert_vm_init_libraries_to_agents();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
  // Launch -agentlib/-agentpath and converted -Xrun agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
  if (Arguments::init_agents_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
    create_vm_init_agents();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
  // Initialize Threads state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
  _thread_list = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
  _number_of_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
  _number_of_non_daemon_threads = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
  // Initialize TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
  ThreadLocalStorage::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  // Initialize global data structures and create system classes in heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
  vm_init_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
  // Attach the main thread to this os thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
  JavaThread* main_thread = new JavaThread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
  main_thread->set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
  // must do this before set_active_handles and initialize_thread_local_storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
  // Note: on solaris initialize_thread_local_storage() will (indirectly)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
  // change the stack size recorded here to one based on the java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
  // stacksize. This adjusted size is what is used to figure the placement
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
  // of the guard pages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
  main_thread->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
  main_thread->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
  main_thread->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
  if (!main_thread->set_as_starting_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
    vm_shutdown_during_initialization(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
      "Failed necessary internal allocation. Out of swap space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
    delete main_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
    *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
    return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
  // Enable guard page *after* os::create_main_thread(), otherwise it would
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
  // crash Linux VM, see notes in os_linux.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
  main_thread->create_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
  // Initialize Java-Leve synchronization subsystem
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
  ObjectSynchronizer::Initialize() ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
  // Initialize global modules
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
  jint status = init_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
  if (status != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
    delete main_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
    *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
    return status;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3005
  // Should be done after the heap is fully created
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3006
  main_thread->cache_global_variables();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3007
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
  HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
  { MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
    Threads::add(main_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  // Any JVMTI raw monitors entered in onload will transition into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
  // real raw monitor. VM is setup enough here for raw monitor enter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  JvmtiExport::transition_pending_onload_raw_monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
  if (VerifyBeforeGC &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
      Universe::heap()->total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
    Universe::heap()->prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
    Universe::verify();   // make sure we're starting with a clean slate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
  // Create the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
  { TraceTime timer("Start VMThread", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
    VMThread::create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
    Thread* vmthread = VMThread::vm_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
    if (!os::create_thread(vmthread, os::vm_thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
      vm_exit_during_initialization("Cannot create VM thread. Out of system resources.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
    // Wait for the VM thread to become ready, and VMThread::run to initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
    // Monitors can have spurious returns, must always check another state flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
      MutexLocker ml(Notify_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
      os::start_thread(vmthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
      while (vmthread->active_handles() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
        Notify_lock->wait();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
  assert (Universe::is_fully_initialized(), "not initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
  EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
  // At this point, the Universe is initialized, but we have not executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
  // any byte code.  Now is a good time (the only time) to dump out the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
  // internal state of the JVM for sharing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
  if (DumpSharedSpaces) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
    Universe::heap()->preload_and_dump(CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
  // Always call even when there are not JVMTI environments yet, since environments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
  // may be attached late and JVMTI must track phases of VM execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
  JvmtiExport::enter_start_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
  // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
  JvmtiExport::post_vm_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
    TraceTime timer("Initialize java.lang classes", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
    if (EagerXrunInit && Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
      create_vm_init_libraries();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
    if (InitializeJavaLangString) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
      initialize_class(vmSymbolHandles::java_lang_String(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
      warning("java.lang.String not initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
191
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3075
    if (AggressiveOpts) {
618
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3076
      {
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3077
        // Forcibly initialize java/util/HashMap and mutate the private
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3078
        // static final "frontCacheEnabled" field before we start creating instances
191
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3079
#ifdef ASSERT
618
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3080
        klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3081
        assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet");
191
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3082
#endif
618
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3083
        klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3084
        KlassHandle k = KlassHandle(THREAD, k_o);
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3085
        guarantee(k.not_null(), "Must find java/util/HashMap");
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3086
        instanceKlassHandle ik = instanceKlassHandle(THREAD, k());
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3087
        ik->initialize(CHECK_0);
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3088
        fieldDescriptor fd;
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3089
        // Possible we might not find this field; if so, don't break
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3090
        if (ik->find_local_field(vmSymbols::frontCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) {
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3091
          k()->bool_field_put(fd.offset(), true);
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3092
        }
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3093
      }
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3094
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3095
      if (UseStringCache) {
2336
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3096
        // Forcibly initialize java/lang/StringValue and mutate the private
618
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3097
        // static final "stringCacheEnabled" field before we start creating instances
2336
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3098
        klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_StringValue(), Handle(), Handle(), CHECK_0);
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3099
        // Possible that StringValue isn't present: if so, silently don't break
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3100
        if (k_o != NULL) {
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3101
          KlassHandle k = KlassHandle(THREAD, k_o);
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3102
          instanceKlassHandle ik = instanceKlassHandle(THREAD, k());
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3103
          ik->initialize(CHECK_0);
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3104
          fieldDescriptor fd;
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3105
          // Possible we might not find this field: if so, silently don't break
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3106
          if (ik->find_local_field(vmSymbols::stringCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) {
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3107
            k()->bool_field_put(fd.offset(), true);
427ce3320578 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 1560
diff changeset
  3108
          }
618
9641c2c8f977 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 235
diff changeset
  3109
        }
191
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3110
      }
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3111
    }
314312979e7a 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 1
diff changeset
  3112
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
    // Initialize java_lang.System (needed before creating the thread)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
    if (InitializeJavaLangSystem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
      initialize_class(vmSymbolHandles::java_lang_System(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
      initialize_class(vmSymbolHandles::java_lang_ThreadGroup(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
      Handle thread_group = create_initial_thread_group(CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
      Universe::set_main_thread_group(thread_group());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
      initialize_class(vmSymbolHandles::java_lang_Thread(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
      oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
      main_thread->set_threadObj(thread_object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
      // Set thread status to running since main thread has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
      // been started and running.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
      java_lang_Thread::set_thread_status(thread_object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
                                          java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
      // The VM preresolve methods to these classes. Make sure that get initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
      initialize_class(vmSymbolHandles::java_lang_reflect_Method(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
      initialize_class(vmSymbolHandles::java_lang_ref_Finalizer(),  CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
      // The VM creates & returns objects of this class. Make sure it's initialized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
      initialize_class(vmSymbolHandles::java_lang_Class(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
      call_initializeSystemClass(CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
      warning("java.lang.System not initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
    // an instance of OutOfMemory exception has been allocated earlier
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
    if (InitializeJavaLangExceptionsErrors) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
      initialize_class(vmSymbolHandles::java_lang_OutOfMemoryError(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
      initialize_class(vmSymbolHandles::java_lang_NullPointerException(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
      initialize_class(vmSymbolHandles::java_lang_ClassCastException(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
      initialize_class(vmSymbolHandles::java_lang_ArrayStoreException(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
      initialize_class(vmSymbolHandles::java_lang_ArithmeticException(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
      initialize_class(vmSymbolHandles::java_lang_StackOverflowError(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
      initialize_class(vmSymbolHandles::java_lang_IllegalMonitorStateException(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
      warning("java.lang.OutOfMemoryError has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
      warning("java.lang.NullPointerException has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
      warning("java.lang.ClassCastException has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
      warning("java.lang.ArrayStoreException has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
      warning("java.lang.ArithmeticException has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
      warning("java.lang.StackOverflowError has not been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
    }
4564
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3154
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3155
    if (EnableInvokeDynamic) {
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3156
      // JSR 292: An intialized java.dyn.InvokeDynamic is required in
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3157
      // the compiler.
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3158
      initialize_class(vmSymbolHandles::java_dyn_InvokeDynamic(), CHECK_0);
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4030
diff changeset
  3159
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
  // See        : bugid 4211085.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
  // Background : the static initializer of java.lang.Compiler tries to read
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
  //              property"java.compiler" and read & write property "java.vm.info".
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
  //              When a security manager is installed through the command line
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
  //              option "-Djava.security.manager", the above properties are not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
  //              readable and the static initializer for java.lang.Compiler fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
  //              resulting in a NoClassDefFoundError.  This can happen in any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
  //              user code which calls methods in java.lang.Compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
  // Hack :       the hack is to pre-load and initialize this class, so that only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
  //              system domains are on the stack when the properties are read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
  //              Currently even the AWT code has calls to methods in java.lang.Compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
  //              On the classic VM, java.lang.Compiler is loaded very early to load the JIT.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
  // Future Fix : the best fix is to grant everyone permissions to read "java.compiler" and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
  //              read and write"java.vm.info" in the default policy file. See bugid 4211383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
  //              Once that is done, we should remove this hack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3177
  initialize_class(vmSymbolHandles::java_lang_Compiler(), CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
  // More hackery - the static initializer of java.lang.Compiler adds the string "nojit" to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  // the java.vm.info property if no jit gets loaded through java.lang.Compiler (the hotspot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
  // compiler does not get loaded through java.lang.Compiler).  "java -version" with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
  // hotspot vm says "nojit" all the time which is confusing.  So, we reset it here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
  // This should also be taken out as soon as 4211383 gets fixed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
  reset_vm_info_property(CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
  quicken_jni_functions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
  // Set flag that basic initialization has completed. Used by exceptions and various
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
  // debug stuff, that does not work until all basic classes have been initialized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
  set_init_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
  HS_DTRACE_PROBE(hotspot, vm__init__end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
  // record VM initialization completion time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
  Management::record_vm_init_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
  // Compute system loader. Note that this has to occur after set_init_completed, since
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
  // valid exceptions may be thrown in the process.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
  // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
  // set_init_completed has just been called, causing exceptions not to be shortcut
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
  // anymore. We call vm_exit_during_initialization directly instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
  SystemDictionary::compute_java_system_loader(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
    vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
4485
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3207
#ifdef KERNEL
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3208
  if (JDK_Version::is_gte_jdk17x_version()) {
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3209
    set_jkernel_boot_classloader_hook(THREAD);
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3210
  }
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3211
#endif // KERNEL
76684005deef 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 4030
diff changeset
  3212
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
  // Support for ConcurrentMarkSweep. This should be cleaned up
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3215
  // 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
  3216
  // once things are properly refactored. XXX YSR
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3217
  if (UseConcMarkSweepGC || UseG1GC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3218
    if (UseConcMarkSweepGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3219
      ConcurrentMarkSweepThread::makeSurrogateLockerThread(THREAD);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3220
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3221
      ConcurrentMarkThread::makeSurrogateLockerThread(THREAD);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 235
diff changeset
  3222
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
      vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
  // Always call even when there are not JVMTI environments yet, since environments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
  // may be attached late and JVMTI must track phases of VM execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
  JvmtiExport::enter_live_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
  // Signal Dispatcher needs to be started before VMInit event is posted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  os::signal_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
  // Start Attach Listener if +StartAttachListener or it can't be started lazily
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  if (!DisableAttachMechanism) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
    if (StartAttachListener || AttachListener::init_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
      AttachListener::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
  // Launch -Xrun agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  // Must be done in the JVMTI live phase so that for backward compatibility the JDWP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
  // back-end can launch with -Xdebug -Xrunjdwp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  if (!EagerXrunInit && Arguments::init_libraries_at_startup()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
    create_vm_init_libraries();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
  // Notify JVMTI agents that VM initialization is complete - nop if no agents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
  JvmtiExport::post_vm_initialized();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
  Chunk::start_chunk_pool_cleaner_task();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
  // initialize compiler(s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
  CompileBroker::compilation_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
  Management::initialize(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
    // management agent fails to start possibly due to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
    // configuration problem and is responsible for printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
    // stack trace if appropriate. Simply exit VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
    vm_exit(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
  if (Arguments::has_profile())       FlatProfiler::engage(main_thread, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
  if (Arguments::has_alloc_profile()) AllocationProfiler::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
  if (MemProfiling)                   MemProfiler::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
  StatSampler::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
  if (CheckJNICalls)                  JniPeriodicChecker::engage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
  BiasedLocking::init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
  // Start up the WatcherThread if there are any periodic tasks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
  // NOTE:  All PeriodicTasks should be registered by now. If they
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
  //   aren't, late joiners might appear to start slowly (we might
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
  //   take a while to process their first tick).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
  if (PeriodicTask::num_tasks() > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
    WatcherThread::start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3283
  // Give os specific code one last chance to start
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3284
  os::init_3();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5888
diff changeset
  3285
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
  create_vm_timer.end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
// type for the Agent_OnLoad and JVM_OnLoad entry points
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
  typedef jint (JNICALL *OnLoadEntry_t)(JavaVM *, char *, void *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
// Find a command line agent library and return its entry point for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
//         -agentlib:  -agentpath:   -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
// 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
  3297
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
  3298
  OnLoadEntry_t on_load_entry = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
  void *library = agent->os_lib();  // check if we have looked it up before
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
  if (library == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
    char buffer[JVM_MAXPATHLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
    char ebuf[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
    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
  3305
    const char *msg = "Could not find agent library ";
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
    if (agent->is_absolute_path()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
      library = hpi::dll_load(name, ebuf, sizeof ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
      if (library == NULL) {
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3310
        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
  3311
        size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3312
        char *buf = NEW_C_HEAP_ARRAY(char, len);
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3313
        jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
        // 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
  3315
        vm_exit_during_initialization(buf, NULL);
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3316
        FREE_C_HEAP_ARRAY(char, buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
      // Try to load the agent from the standard dll directory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
      hpi::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
      library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
#ifdef KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
      // Download instrument dll
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
      if (library == NULL && strcmp(name, "instrument") == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
        char *props = Arguments::get_kernel_properties();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
        char *home  = Arguments::get_java_home();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
        const char *fmt   = "%s/bin/java %s -Dkernel.background.download=false"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
                      " sun.jkernel.DownloadManager -download client_jvm";
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3329
        size_t length = strlen(props) + strlen(home) + strlen(fmt) + 1;
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3330
        char *cmd = NEW_C_HEAP_ARRAY(char, length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
        jio_snprintf(cmd, length, fmt, home, props);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
        int status = os::fork_and_exec(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
        FreeHeap(props);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
        if (status == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
          warning(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
          vm_exit_during_initialization("fork_and_exec failed: %s",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
                                         strerror(errno));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
        }
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3339
        FREE_C_HEAP_ARRAY(char, cmd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
        // when this comes back the instrument.dll should be where it belongs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
        library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
#endif // KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
      if (library == NULL) { // Try the local directory
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
        char ns[1] = {0};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
        hpi::dll_build_name(buffer, sizeof(buffer), ns, name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
        library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
        if (library == NULL) {
6189
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3349
          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
  3350
          size_t len = strlen(msg) + strlen(name) + strlen(sub_msg) + strlen(ebuf) + 1;
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3351
          char *buf = NEW_C_HEAP_ARRAY(char, len);
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3352
          jio_snprintf(buf, len, "%s%s%s%s", msg, name, sub_msg, ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
          // 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
  3354
          vm_exit_during_initialization(buf, NULL);
9dcd5f57dcc3 6378314: Bad warning message when agent library not found. local directory is not searched.
rasbold
parents: 6176
diff changeset
  3355
          FREE_C_HEAP_ARRAY(char, buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
    agent->set_os_lib(library);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
  // Find the OnLoad function.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
  for (size_t symbol_index = 0; symbol_index < num_symbol_entries; symbol_index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
    on_load_entry = CAST_TO_FN_PTR(OnLoadEntry_t, hpi::dll_lookup(library, on_load_symbols[symbol_index]));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
    if (on_load_entry != NULL) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
  return on_load_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
// Find the JVM_OnLoad entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
  const char *on_load_symbols[] = JVM_ONLOAD_SYMBOLS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
  return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
// Find the Agent_OnLoad entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
static OnLoadEntry_t lookup_agent_on_load(AgentLibrary* agent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
  const char *on_load_symbols[] = AGENT_ONLOAD_SYMBOLS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
  return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
// For backwards compatibility with -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
// Convert libraries with no JVM_OnLoad, but which have Agent_OnLoad to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
// treated like -agentpath:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
// Must be called before agent libraries are created
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
void Threads::convert_vm_init_libraries_to_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  AgentLibrary* next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
  for (agent = Arguments::libraries(); agent != NULL; agent = next) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
    next = agent->next();  // cache the next agent now as this agent may get moved off this list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
    OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
    // If there is an JVM_OnLoad function it will get called later,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
    // otherwise see if there is an Agent_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
    if (on_load_entry == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
      on_load_entry = lookup_agent_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
      if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
        // switch it to the agent list -- so that Agent_OnLoad will be called,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
        // JVM_OnLoad won't be attempted and Agent_OnUnload will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
        Arguments::convert_library_to_agent(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
        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
  3404
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
// Create agents for -agentlib:  -agentpath:  and converted -Xrun
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
// Invokes Agent_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
// Called very early -- before JavaThreads exist
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
void Threads::create_vm_init_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
  JvmtiExport::enter_onload_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
  for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
    OnLoadEntry_t  on_load_entry = lookup_agent_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
    if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
      // Invoke the Agent_OnLoad function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
      jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
      if (err != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
        vm_exit_during_initialization("agent library failed to init", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
      vm_exit_during_initialization("Could not find Agent_OnLoad function in the agent library", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
  JvmtiExport::enter_primordial_phase();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
  typedef void (JNICALL *Agent_OnUnload_t)(JavaVM *);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
void Threads::shutdown_vm_agents() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
  // Send any Agent_OnUnload notifications
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
  const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
  for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
    // Find the Agent_OnUnload function.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
    for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_unload_symbols); symbol_index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
      Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
               hpi::dll_lookup(agent->os_lib(), on_unload_symbols[symbol_index]));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
      // Invoke the Agent_OnUnload function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
      if (unload_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
        JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
        ThreadToNativeFromVM ttn(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
        HandleMark hm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
        (*unload_entry)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
// 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
  3461
// Invokes JVM_OnLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
void Threads::create_vm_init_libraries() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
  extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
  AgentLibrary* agent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
  for (agent = Arguments::libraries(); agent != NULL; agent = agent->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
    OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
    if (on_load_entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
      // Invoke the JVM_OnLoad function
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
      JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
      ThreadToNativeFromVM ttn(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
      HandleMark hm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
      jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
      if (err != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
        vm_exit_during_initialization("-Xrun library failed to init", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
      vm_exit_during_initialization("Could not find JVM_OnLoad function in -Xrun library", agent->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
// Last thread running calls java.lang.Shutdown.shutdown()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
void JavaThread::invoke_shutdown_hooks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  HandleMark hm(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
  // We could get here with a pending exception, if so clear it now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  if (this->has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
    this->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
  EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
  klassOop k =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
    SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_Shutdown(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
                                      THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
  if (k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
    // SystemDictionary::resolve_or_null will return null if there was
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
    // an exception.  If we cannot load the Shutdown class, just don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
    // call Shutdown.shutdown() at all.  This will mean the shutdown hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
    // and finalizers (if runFinalizersOnExit is set) won't be run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
    // Note that if a shutdown hook was registered or runFinalizersOnExit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
    // was called, the Shutdown class would have already been loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
    // (Runtime.addShutdownHook and runFinalizersOnExit will load it).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
    instanceKlassHandle shutdown_klass (THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
    JavaCalls::call_static(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
                           shutdown_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
                           vmSymbolHandles::shutdown_method_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
                           vmSymbolHandles::void_method_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
                           THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
  CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
// Threads::destroy_vm() is normally called from jni_DestroyJavaVM() when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
// the program falls off the end of main(). Another VM exit path is through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
// vm_exit() when the program calls System.exit() to return a value or when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
// there is a serious error in VM. The two shutdown paths are not exactly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
// the same, but they share Shutdown.shutdown() at Java level and before_exit()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
// and VM_Exit op at VM level.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
// Shutdown sequence:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
//   + Wait until we are the last non-daemon thread to execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
//     <-- every thing is still working at this moment -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
//   + Call java.lang.Shutdown.shutdown(), which will invoke Java level
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
//        shutdown hooks, run finalizers if finalization-on-exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
//   + Call before_exit(), prepare for VM exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
//      > run VM level shutdown hooks (they are registered through JVM_OnExit(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
//        currently the only user of this mechanism is File.deleteOnExit())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
//      > stop flat profiler, StatSampler, watcher thread, CMS threads,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
//        post thread end and vm death events to JVMTI,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
//        stop signal thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
//   + Call JavaThread::exit(), it will:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
//      > release JNI handle blocks, remove stack guard pages
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
//      > remove this thread from Threads list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
//     <-- no more Java code from this thread after this point -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
//   + Stop VM thread, it will bring the remaining VM to a safepoint and stop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
//     the compiler threads at safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
//     <-- do not use anything that could get blocked by Safepoint -->
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
//   + Disable tracing at JNI/JVM barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
//   + Set _vm_exited flag for threads that are still running native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
//   + Delete this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
//   + Call exit_globals()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
//      > deletes tty
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
//      > deletes PerfMemory resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
//   + Return to caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3549
bool Threads::destroy_vm() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
  // Wait until we are the last non-daemon thread to execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
  { MutexLocker nu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
    while (Threads::number_of_non_daemon_threads() > 1 )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
      // This wait should make safepoint checks, wait without a timeout,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
      // and wait as a suspend-equivalent condition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
      // Note: If the FlatProfiler is running and this thread is waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
      // for another non-daemon thread to finish, then the FlatProfiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
      // is waiting for the external suspend request on this thread to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
      // complete. wait_for_ext_suspend_completion() will eventually
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
      // timeout, but that takes time. Making this wait a suspend-
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3563
      // equivalent condition solves that timeout problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
      Threads_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
                         Mutex::_as_suspend_equivalent_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
  // Hang forever on exit if we are reporting an error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3570
  if (ShowMessageBoxOnError && is_error_reported()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3571
    os::infinite_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3572
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
  if (JDK_Version::is_jdk12x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
    // We are the last thread running, so check if finalizers should be run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
    // For 1.3 or later this is done in thread->invoke_shutdown_hooks()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3577
    HandleMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3578
    Universe::run_finalizers_on_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3579
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
    // run Java level shutdown hooks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
    thread->invoke_shutdown_hooks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
  before_exit(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
  thread->exit(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  // Stop VM thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
    // 4945125 The vm thread comes to a safepoint during exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
    // GC vm_operations can get caught at the safepoint, and the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
    // heap is unparseable if they are caught. Grab the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
    // to prevent this. The GC vm_operations will not be able to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
    // queue until after the vm thread is dead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
    VMThread::wait_for_vm_thread_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3598
    assert(SafepointSynchronize::is_at_safepoint(), "VM thread should exit at Safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
    VMThread::destroy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
  // clean up ideal graph printers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
#if defined(COMPILER2) && !defined(PRODUCT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
  IdealGraphPrinter::clean_up();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3605
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
  // Now, all Java threads are gone except daemon threads. Daemon threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
  // running Java code or in VM are stopped by the Safepoint. However,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
  // daemon threads executing native code are still running.  But they
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
  // will be stopped at native=>Java/VM barriers. Note that we can't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
  // simply kill or suspend them, as it is inherently deadlock-prone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3613
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3614
  // disable function tracing at JNI/JVM barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3615
  TraceHPI = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
  TraceJNICalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
  TraceJVMCalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
  TraceRuntimeCalls = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3619
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
  VM_Exit::set_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3622
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3623
  notify_vm_shutdown();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3625
  delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3626
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3627
  // exit_globals() will delete tty
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3628
  exit_globals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3630
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3631
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3632
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3633
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3634
jboolean Threads::is_supported_jni_version_including_1_1(jint version) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3635
  if (version == JNI_VERSION_1_1) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3636
  return is_supported_jni_version(version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3637
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3638
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3640
jboolean Threads::is_supported_jni_version(jint version) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3641
  if (version == JNI_VERSION_1_2) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3642
  if (version == JNI_VERSION_1_4) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3643
  if (version == JNI_VERSION_1_6) return JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3644
  return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3645
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3646
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3648
void Threads::add(JavaThread* p, bool force_daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3649
  // The threads lock must be owned at this point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3650
  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
  3651
71338ecb7813 6980838: G1: guarantee(false) failed: thread has an unexpected active value in its SATB queue
tonyp
parents: 6764
diff changeset
  3652
  // 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
  3653
  // 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
  3654
  p->initialize_queues();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3655
  p->set_next(_thread_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3656
  _thread_list = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3657
  _number_of_threads++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3658
  oop threadObj = p->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3659
  bool daemon = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3660
  // Bootstrapping problem: threadObj can be null for initial
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3661
  // JavaThread (or for threads attached via JNI)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3662
  if ((!force_daemon) && (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3663
    _number_of_non_daemon_threads++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3664
    daemon = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3665
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3667
  ThreadService::add_thread(p, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3668
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3669
  // Possible GC point.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3670
  Events::log("Thread added: " INTPTR_FORMAT, p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3671
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3672
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3673
void Threads::remove(JavaThread* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3674
  // Extra scope needed for Thread_lock, so we can check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3675
  // that we do not remove thread without safepoint code notice
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3676
  { MutexLocker ml(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3677
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3678
    assert(includes(p), "p must be present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3680
    JavaThread* current = _thread_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3681
    JavaThread* prev    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3683
    while (current != p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3684
      prev    = current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3685
      current = current->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3686
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3687
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3688
    if (prev) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3689
      prev->set_next(current->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3690
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3691
      _thread_list = p->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3692
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3693
    _number_of_threads--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3694
    oop threadObj = p->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3695
    bool daemon = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3696
    if (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3697
      _number_of_non_daemon_threads--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3698
      daemon = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3699
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3700
      // Only one thread left, do a notify on the Threads_lock so a thread waiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3701
      // on destroy_vm will wake up.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3702
      if (number_of_non_daemon_threads() == 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3703
        Threads_lock->notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3704
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3705
    ThreadService::remove_thread(p, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3707
    // Make sure that safepoint code disregard this thread. This is needed since
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3708
    // the thread might mess around with locks after this point. This can cause it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3709
    // to do callbacks into the safepoint code. However, the safepoint code is not aware
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3710
    // of this thread since it is removed from the queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3711
    p->set_terminated_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3712
  } // unlock Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3713
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3714
  // Since Events::log uses a lock, we grab it outside the Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3715
  Events::log("Thread exited: " INTPTR_FORMAT, p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3716
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3717
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3718
// Threads_lock must be held when this is called (or must be called during a safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3719
bool Threads::includes(JavaThread* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3720
  assert(Threads_lock->is_locked(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3721
  ALL_JAVA_THREADS(q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3722
    if (q == p ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3723
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3724
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3725
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3726
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3727
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3728
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3729
// Operations on the Threads list for GC.  These are not explicitly locked,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3730
// but the garbage collector must provide a safe context for them to run.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3731
// In particular, these things should never be called when the Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3732
// is held by some other thread. (Note: the Safepoint abstraction also
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3733
// uses the Threads_lock to gurantee this property. It also makes sure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3734
// all threads gets blocked when exiting or starting).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3735
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3736
void Threads::oops_do(OopClosure* f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3737
  ALL_JAVA_THREADS(p) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3738
    p->oops_do(f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3739
  }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3740
  VMThread::vm_thread()->oops_do(f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3741
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3742
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3743
void Threads::possibly_parallel_oops_do(OopClosure* f, CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3744
  // Introduce a mechanism allowing parallel threads to claim threads as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3745
  // root groups.  Overhead should be small enough to use all the time,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3746
  // even in sequential code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3747
  SharedHeap* sh = SharedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3748
  bool is_par = (sh->n_par_threads() > 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3749
  int cp = SharedHeap::heap()->strong_roots_parity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3750
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3751
    if (p->claim_oops_do(is_par, cp)) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3752
      p->oops_do(f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3753
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3754
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3755
  VMThread* vmt = VMThread::vm_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3756
  if (vmt->claim_oops_do(is_par, cp))
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3757
    vmt->oops_do(f, cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3758
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3759
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3760
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3761
// Used by ParallelScavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3762
void Threads::create_thread_roots_tasks(GCTaskQueue* q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3763
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3764
    q->enqueue(new ThreadRootsTask(p));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3765
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3766
  q->enqueue(new ThreadRootsTask(VMThread::vm_thread()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3767
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3769
// Used by Parallel Old
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3770
void Threads::create_thread_roots_marking_tasks(GCTaskQueue* q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3771
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3772
    q->enqueue(new ThreadRootsMarkingTask(p));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3773
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3774
  q->enqueue(new ThreadRootsMarkingTask(VMThread::vm_thread()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3775
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3776
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3777
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3778
void Threads::nmethods_do(CodeBlobClosure* cf) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3779
  ALL_JAVA_THREADS(p) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3780
    p->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3781
  }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
  3782
  VMThread::vm_thread()->nmethods_do(cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3783
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3785
void Threads::gc_epilogue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3786
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3787
    p->gc_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3788
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3789
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3790
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3791
void Threads::gc_prologue() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3792
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3793
    p->gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3794
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3795
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3797
void Threads::deoptimized_wrt_marked_nmethods() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3798
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3799
    p->deoptimized_wrt_marked_nmethods();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3800
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3801
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3802
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3804
// Get count Java threads that are waiting to enter the specified monitor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3805
GrowableArray<JavaThread*>* Threads::get_pending_threads(int count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3806
  address monitor, bool doLock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3807
  assert(doLock || SafepointSynchronize::is_at_safepoint(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3808
    "must grab Threads_lock or be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3809
  GrowableArray<JavaThread*>* result = new GrowableArray<JavaThread*>(count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3811
  int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3812
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3813
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3814
    ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3815
      if (p->is_Compiler_thread()) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3817
      address pending = (address)p->current_pending_monitor();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3818
      if (pending == monitor) {             // found a match
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3819
        if (i < count) result->append(p);   // save the first count matches
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3820
        i++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3821
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3822
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3823
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3824
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3825
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3826
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3827
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3828
JavaThread *Threads::owning_thread_from_monitor_owner(address owner, bool doLock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3829
  assert(doLock ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3830
         Threads_lock->owned_by_self() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3831
         SafepointSynchronize::is_at_safepoint(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3832
         "must grab Threads_lock or be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3833
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3834
  // NULL owner means not locked so we can skip the search
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3835
  if (owner == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3836
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3837
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3838
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3839
    ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3840
      // first, see if owner is the address of a Java thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3841
      if (owner == (address)p) return p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3842
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3843
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3844
  assert(UseHeavyMonitors == false, "Did not find owning Java thread with UseHeavyMonitors enabled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3845
  if (UseHeavyMonitors) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3846
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3847
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3848
  // If we didn't find a matching Java thread and we didn't force use of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3849
  // heavyweight monitors, then the owner is the stack address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3850
  // Lock Word in the owning Java thread's stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3851
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3852
  JavaThread* the_owner = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3853
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3854
    MutexLockerEx ml(doLock ? Threads_lock : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3855
    ALL_JAVA_THREADS(q) {
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  3856
      if (q->is_lock_owned(owner)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3857
        the_owner = q;
2526
39a58a50be35 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 2336
diff changeset
  3858
        break;
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
  assert(the_owner != NULL, "Did not find owning Java thread for lock word address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3863
  return the_owner;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3864
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3865
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3866
// Threads::print_on() is called at safepoint by VM_PrintThreads operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3867
void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3868
  char buf[32];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3869
  st->print_cr(os::local_time_string(buf, sizeof(buf)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3870
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3871
  st->print_cr("Full thread dump %s (%s %s):",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3872
                Abstract_VM_Version::vm_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3873
                Abstract_VM_Version::vm_release(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3874
                Abstract_VM_Version::vm_info_string()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3875
               );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3876
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3877
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3878
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3879
  // Dump concurrent locks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3880
  ConcurrentLocksDump concurrent_locks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3881
  if (print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3882
    concurrent_locks.dump_at_safepoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3884
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3885
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3886
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3887
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3888
    p->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3889
    if (print_stacks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3890
      if (internal_format) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3891
        p->trace_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3892
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3893
        p->print_stack_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3894
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3895
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3896
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3897
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3898
    if (print_concurrent_locks) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3899
      concurrent_locks.print_locks_on(p, st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3900
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3901
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3902
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3903
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3904
  VMThread::vm_thread()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3905
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3906
  Universe::heap()->print_gc_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3907
  WatcherThread* wt = WatcherThread::watcher_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3908
  if (wt != NULL) wt->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3909
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3910
  CompileBroker::print_compiler_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3911
  st->flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3912
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3913
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3914
// Threads::print_on_error() is called by fatal error handler. It's possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3915
// that VM is not at safepoint and/or current thread is inside signal handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3916
// Don't print stack trace, as the stack may not be walkable. Don't allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3917
// memory (even in resource area), it might deadlock the error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3918
void Threads::print_on_error(outputStream* st, Thread* current, char* buf, int buflen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3919
  bool found_current = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3920
  st->print_cr("Java Threads: ( => current thread )");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3921
  ALL_JAVA_THREADS(thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3922
    bool is_current = (current == thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3923
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3924
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3925
    st->print("%s", is_current ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3926
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3927
    st->print(PTR_FORMAT, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3928
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3929
    thread->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3930
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3931
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3932
  st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3933
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3934
  st->print_cr("Other Threads:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3935
  if (VMThread::vm_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3936
    bool is_current = (current == VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3937
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3938
    st->print("%s", current == VMThread::vm_thread() ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3939
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3940
    st->print(PTR_FORMAT, VMThread::vm_thread());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3941
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3942
    VMThread::vm_thread()->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3943
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3944
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3945
  WatcherThread* wt = WatcherThread::watcher_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3946
  if (wt != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3947
    bool is_current = (current == wt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3948
    found_current = found_current || is_current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3949
    st->print("%s", is_current ? "=>" : "  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3951
    st->print(PTR_FORMAT, wt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3952
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3953
    wt->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3954
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3955
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3956
  if (!found_current) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3957
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3958
    st->print("=>" PTR_FORMAT " (exited) ", current);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3959
    current->print_on_error(st, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3960
    st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3961
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3962
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3963
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3965
// Lifecycle management for TSM ParkEvents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3966
// ParkEvents are type-stable (TSM).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3967
// In our particular implementation they happen to be immortal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3968
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3969
// We manage concurrency on the FreeList with a CAS-based
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3970
// detach-modify-reattach idiom that avoids the ABA problems
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3971
// that would otherwise be present in a simple CAS-based
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3972
// push-pop implementation.   (push-one and pop-all)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3973
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3974
// Caveat: Allocate() and Release() may be called from threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3975
// other than the thread associated with the Event!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3976
// If we need to call Allocate() when running as the thread in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3977
// question then look for the PD calls to initialize native TLS.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3978
// Native TLS (Win32/Linux/Solaris) can only be initialized or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3979
// accessed by the associated thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3980
// See also pd_initialize().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3981
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3982
// Note that we could defer associating a ParkEvent with a thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3983
// until the 1st time the thread calls park().  unpark() calls to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3984
// an unprovisioned thread would be ignored.  The first park() call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3985
// for a thread would allocate and associate a ParkEvent and return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3986
// immediately.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3987
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3988
volatile int ParkEvent::ListLock = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3989
ParkEvent * volatile ParkEvent::FreeList = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3990
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3991
ParkEvent * ParkEvent::Allocate (Thread * t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3992
  // In rare cases -- JVM_RawMonitor* operations -- we can find t == null.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3993
  ParkEvent * ev ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3995
  // Start by trying to recycle an existing but unassociated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3996
  // ParkEvent from the global free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3997
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3998
    ev = FreeList ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3999
    if (ev == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4000
    // 1: Detach - sequester or privatize the list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4001
    // Tantamount to ev = Swap (&FreeList, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4002
    if (Atomic::cmpxchg_ptr (NULL, &FreeList, ev) != ev) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4003
       continue ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4004
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4006
    // We've detached the list.  The list in-hand is now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4007
    // local to this thread.   This thread can operate on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4008
    // list without risk of interference from other threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4009
    // 2: Extract -- pop the 1st element from the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4010
    ParkEvent * List = ev->FreeNext ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4011
    if (List == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4012
    for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4013
        // 3: Try to reattach the residual list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4014
        guarantee (List != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4015
        ParkEvent * Arv =  (ParkEvent *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4016
        if (Arv == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4018
        // New nodes arrived.  Try to detach the recent arrivals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4019
        if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4020
            continue ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4021
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4022
        guarantee (Arv != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4023
        // 4: Merge Arv into List
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4024
        ParkEvent * Tail = List ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4025
        while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4026
        Tail->FreeNext = Arv ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4027
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4028
    break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4029
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4031
  if (ev != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4032
    guarantee (ev->AssociatedWith == NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4033
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4034
    // Do this the hard way -- materialize a new ParkEvent.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4035
    // In rare cases an allocating thread might detach a long list --
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4036
    // installing null into FreeList -- and then stall or be obstructed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4037
    // A 2nd thread calling Allocate() would see FreeList == null.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4038
    // The list held privately by the 1st thread is unavailable to the 2nd thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4039
    // In that case the 2nd thread would have to materialize a new ParkEvent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4040
    // even though free ParkEvents existed in the system.  In this case we end up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4041
    // with more ParkEvents in circulation than we need, but the race is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4042
    // rare and the outcome is benign.  Ideally, the # of extant ParkEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4043
    // is equal to the maximum # of threads that existed at any one time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4044
    // Because of the race mentioned above, segments of the freelist
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4045
    // can be transiently inaccessible.  At worst we may end up with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4046
    // # of ParkEvents in circulation slightly above the ideal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4047
    // Note that if we didn't have the TSM/immortal constraint, then
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4048
    // when reattaching, above, we could trim the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4049
    ev = new ParkEvent () ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4050
    guarantee ((intptr_t(ev) & 0xFF) == 0, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4051
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4052
  ev->reset() ;                     // courtesy to caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4053
  ev->AssociatedWith = t ;          // Associate ev with t
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4054
  ev->FreeNext       = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4055
  return ev ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4056
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4058
void ParkEvent::Release (ParkEvent * ev) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4059
  if (ev == NULL) return ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4060
  guarantee (ev->FreeNext == NULL      , "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4061
  ev->AssociatedWith = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4062
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4063
    // Push ev onto FreeList
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4064
    // The mechanism is "half" lock-free.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4065
    ParkEvent * List = FreeList ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4066
    ev->FreeNext = List ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4067
    if (Atomic::cmpxchg_ptr (ev, &FreeList, List) == List) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4068
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4069
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4070
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4071
// Override operator new and delete so we can ensure that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4072
// least significant byte of ParkEvent addresses is 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4073
// Beware that excessive address alignment is undesirable
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4074
// as it can result in D$ index usage imbalance as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4075
// well as bank access imbalance on Niagara-like platforms,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4076
// although Niagara's hash function should help.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4078
void * ParkEvent::operator new (size_t sz) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4079
  return (void *) ((intptr_t (CHeapObj::operator new (sz + 256)) + 256) & -256) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4080
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4082
void ParkEvent::operator delete (void * a) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4083
  // ParkEvents are type-stable and immortal ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4084
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4085
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4088
// 6399321 As a temporary measure we copied & modified the ParkEvent::
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4089
// allocate() and release() code for use by Parkers.  The Parker:: forms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4090
// will eventually be removed as we consolide and shift over to ParkEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4091
// for both builtin synchronization and JSR166 operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4093
volatile int Parker::ListLock = 0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4094
Parker * volatile Parker::FreeList = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4096
Parker * Parker::Allocate (JavaThread * t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4097
  guarantee (t != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4098
  Parker * p ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4100
  // Start by trying to recycle an existing but unassociated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4101
  // Parker from the global free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4102
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4103
    p = FreeList ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4104
    if (p  == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4105
    // 1: Detach
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4106
    // Tantamount to p = Swap (&FreeList, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4107
    if (Atomic::cmpxchg_ptr (NULL, &FreeList, p) != p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4108
       continue ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4109
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4111
    // We've detached the list.  The list in-hand is now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4112
    // local to this thread.   This thread can operate on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4113
    // list without risk of interference from other threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4114
    // 2: Extract -- pop the 1st element from the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4115
    Parker * List = p->FreeNext ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4116
    if (List == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4117
    for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4118
        // 3: Try to reattach the residual list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4119
        guarantee (List != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4120
        Parker * Arv =  (Parker *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4121
        if (Arv == NULL) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4123
        // New nodes arrived.  Try to detach the recent arrivals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4124
        if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4125
            continue ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4126
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4127
        guarantee (Arv != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4128
        // 4: Merge Arv into List
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4129
        Parker * Tail = List ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4130
        while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4131
        Tail->FreeNext = Arv ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4133
    break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4134
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4136
  if (p != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4137
    guarantee (p->AssociatedWith == NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4138
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4139
    // Do this the hard way -- materialize a new Parker..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4140
    // In rare cases an allocating thread might detach
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4141
    // a long list -- installing null into FreeList --and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4142
    // then stall.  Another thread calling Allocate() would see
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4143
    // FreeList == null and then invoke the ctor.  In this case we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4144
    // end up with more Parkers in circulation than we need, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4145
    // the race is rare and the outcome is benign.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4146
    // Ideally, the # of extant Parkers is equal to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4147
    // maximum # of threads that existed at any one time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4148
    // Because of the race mentioned above, segments of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4149
    // freelist can be transiently inaccessible.  At worst
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4150
    // we may end up with the # of Parkers in circulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4151
    // slightly above the ideal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4152
    p = new Parker() ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4153
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4154
  p->AssociatedWith = t ;          // Associate p with t
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4155
  p->FreeNext       = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4156
  return p ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4157
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4160
void Parker::Release (Parker * p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4161
  if (p == NULL) return ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4162
  guarantee (p->AssociatedWith != NULL, "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4163
  guarantee (p->FreeNext == NULL      , "invariant") ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4164
  p->AssociatedWith = NULL ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4165
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4166
    // Push p onto FreeList
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4167
    Parker * List = FreeList ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4168
    p->FreeNext = List ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4169
    if (Atomic::cmpxchg_ptr (p, &FreeList, List) == List) break ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4171
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4173
void Threads::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4174
  ALL_JAVA_THREADS(p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4175
    p->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4176
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4177
  VMThread* thread = VMThread::vm_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4178
  if (thread != NULL) thread->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4179
}