src/share/vm/prims/jvmtiThreadState.cpp

Wed, 23 Jan 2013 13:02:39 -0500

author
jprovino
date
Wed, 23 Jan 2013 13:02:39 -0500
changeset 4542
db9981fd3124
parent 4037
da91efe96a93
child 6876
710a3c8b516e
permissions
-rw-r--r--

8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
Summary: Rename INCLUDE_ALTERNATE_GCS to INCLUDE_ALL_GCS and replace SERIALGC with INCLUDE_ALL_GCS.
Reviewed-by: coleenp, stefank

     1 /*
     2  * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "jvmtifiles/jvmtiEnv.hpp"
    27 #include "memory/gcLocker.hpp"
    28 #include "memory/resourceArea.hpp"
    29 #include "prims/jvmtiEventController.inline.hpp"
    30 #include "prims/jvmtiImpl.hpp"
    31 #include "prims/jvmtiThreadState.inline.hpp"
    32 #include "runtime/vframe.hpp"
    34 // marker for when the stack depth has been reset and is now unknown.
    35 // any negative number would work but small ones might obscure an
    36 // underrun error.
    37 static const int UNKNOWN_STACK_DEPTH = -99;
    39 ///////////////////////////////////////////////////////////////
    40 //
    41 // class JvmtiThreadState
    42 //
    43 // Instances of JvmtiThreadState hang off of each thread.
    44 // Thread local storage for JVMTI.
    45 //
    47 JvmtiThreadState *JvmtiThreadState::_head = NULL;
    49 JvmtiThreadState::JvmtiThreadState(JavaThread* thread)
    50   : _thread_event_enable() {
    51   assert(JvmtiThreadState_lock->is_locked(), "sanity check");
    52   _thread               = thread;
    53   _exception_detected   = false;
    54   _exception_caught     = false;
    55   _debuggable           = true;
    56   _hide_single_stepping = false;
    57   _hide_level           = 0;
    58   _pending_step_for_popframe = false;
    59   _class_being_redefined = NULL;
    60   _class_load_kind = jvmti_class_load_kind_load;
    61   _head_env_thread_state = NULL;
    62   _dynamic_code_event_collector = NULL;
    63   _vm_object_alloc_event_collector = NULL;
    64   _the_class_for_redefinition_verification = NULL;
    65   _scratch_class_for_redefinition_verification = NULL;
    67   // JVMTI ForceEarlyReturn support
    68   _pending_step_for_earlyret = false;
    69   _earlyret_state = earlyret_inactive;
    70   _earlyret_tos = ilgl;
    71   _earlyret_value.j = 0L;
    72   _earlyret_oop = NULL;
    74   // add all the JvmtiEnvThreadState to the new JvmtiThreadState
    75   {
    76     JvmtiEnvIterator it;
    77     for (JvmtiEnvBase* env = it.first(); env != NULL; env = it.next(env)) {
    78       if (env->is_valid()) {
    79         add_env(env);
    80       }
    81     }
    82   }
    84   // link us into the list
    85   {
    86     // The thread state list manipulation code must not have safepoints.
    87     // See periodic_clean_up().
    88     debug_only(No_Safepoint_Verifier nosafepoint;)
    90     _prev = NULL;
    91     _next = _head;
    92     if (_head != NULL) {
    93       _head->_prev = this;
    94     }
    95     _head = this;
    96   }
    98   // set this as the state for the thread
    99   thread->set_jvmti_thread_state(this);
   100 }
   103 JvmtiThreadState::~JvmtiThreadState()   {
   104   assert(JvmtiThreadState_lock->is_locked(), "sanity check");
   106   // clear this as the state for the thread
   107   get_thread()->set_jvmti_thread_state(NULL);
   109   // zap our env thread states
   110   {
   111     JvmtiEnvBase::entering_dying_thread_env_iteration();
   112     JvmtiEnvThreadStateIterator it(this);
   113     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ) {
   114       JvmtiEnvThreadState* zap = ets;
   115       ets = it.next(ets);
   116       delete zap;
   117     }
   118     JvmtiEnvBase::leaving_dying_thread_env_iteration();
   119   }
   121   // remove us from the list
   122   {
   123     // The thread state list manipulation code must not have safepoints.
   124     // See periodic_clean_up().
   125     debug_only(No_Safepoint_Verifier nosafepoint;)
   127     if (_prev == NULL) {
   128       assert(_head == this, "sanity check");
   129       _head = _next;
   130     } else {
   131       assert(_head != this, "sanity check");
   132       _prev->_next = _next;
   133     }
   134     if (_next != NULL) {
   135       _next->_prev = _prev;
   136     }
   137     _next = NULL;
   138     _prev = NULL;
   139   }
   140 }
   143 void
   144 JvmtiThreadState::periodic_clean_up() {
   145   assert(SafepointSynchronize::is_at_safepoint(), "at safepoint");
   147   // This iteration is initialized with "_head" instead of "JvmtiThreadState::first()"
   148   // because the latter requires the JvmtiThreadState_lock.
   149   // This iteration is safe at a safepoint as well, see the No_Safepoint_Verifier
   150   // asserts at all list manipulation sites.
   151   for (JvmtiThreadState *state = _head; state != NULL; state = state->next()) {
   152     // For each environment thread state corresponding to an invalid environment
   153     // unlink it from the list and deallocate it.
   154     JvmtiEnvThreadStateIterator it(state);
   155     JvmtiEnvThreadState* previous_ets = NULL;
   156     JvmtiEnvThreadState* ets = it.first();
   157     while (ets != NULL) {
   158       if (ets->get_env()->is_valid()) {
   159         previous_ets = ets;
   160         ets = it.next(ets);
   161       } else {
   162         // This one isn't valid, remove it from the list and deallocate it
   163         JvmtiEnvThreadState* defunct_ets = ets;
   164         ets = ets->next();
   165         if (previous_ets == NULL) {
   166           assert(state->head_env_thread_state() == defunct_ets, "sanity check");
   167           state->set_head_env_thread_state(ets);
   168         } else {
   169           previous_ets->set_next(ets);
   170         }
   171         delete defunct_ets;
   172       }
   173     }
   174   }
   175 }
   177 void JvmtiThreadState::add_env(JvmtiEnvBase *env) {
   178   assert(JvmtiThreadState_lock->is_locked(), "sanity check");
   180   JvmtiEnvThreadState *new_ets = new JvmtiEnvThreadState(_thread, env);
   181   // add this environment thread state to the end of the list (order is important)
   182   {
   183     // list deallocation (which occurs at a safepoint) cannot occur simultaneously
   184     debug_only(No_Safepoint_Verifier nosafepoint;)
   186     JvmtiEnvThreadStateIterator it(this);
   187     JvmtiEnvThreadState* previous_ets = NULL;
   188     for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
   189       previous_ets = ets;
   190     }
   191     if (previous_ets == NULL) {
   192       set_head_env_thread_state(new_ets);
   193     } else {
   194       previous_ets->set_next(new_ets);
   195     }
   196   }
   197 }
   202 void JvmtiThreadState::enter_interp_only_mode() {
   203   assert(_thread->get_interp_only_mode() == 0, "entering interp only when mode not zero");
   204   _thread->increment_interp_only_mode();
   205 }
   208 void JvmtiThreadState::leave_interp_only_mode() {
   209   assert(_thread->get_interp_only_mode() == 1, "leaving interp only when mode not one");
   210   _thread->decrement_interp_only_mode();
   211 }
   214 // Helper routine used in several places
   215 int JvmtiThreadState::count_frames() {
   216 #ifdef ASSERT
   217   uint32_t debug_bits = 0;
   218 #endif
   219   assert(SafepointSynchronize::is_at_safepoint() ||
   220          JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
   221          "at safepoint or must be suspended");
   223   if (!get_thread()->has_last_Java_frame()) return 0;  // no Java frames
   225   ResourceMark rm;
   226   RegisterMap reg_map(get_thread());
   227   javaVFrame *jvf = get_thread()->last_java_vframe(&reg_map);
   228   int n = 0;
   229   // tty->print_cr("CSD: counting frames on %s ...",
   230   //               JvmtiTrace::safe_get_thread_name(get_thread()));
   231   while (jvf != NULL) {
   232     Method* method = jvf->method();
   233     // tty->print_cr("CSD: frame - method %s.%s - loc %d",
   234     //               method->klass_name()->as_C_string(),
   235     //               method->name()->as_C_string(),
   236     //               jvf->bci() );
   237     jvf = jvf->java_sender();
   238     n++;
   239   }
   240   // tty->print_cr("CSD: frame count: %d", n);
   241   return n;
   242 }
   245 void JvmtiThreadState::invalidate_cur_stack_depth() {
   246   Thread *cur = Thread::current();
   247   uint32_t debug_bits = 0;
   249   // The caller can be the VMThread at a safepoint, the current thread
   250   // or the target thread must be suspended.
   251   guarantee((cur->is_VM_thread() && SafepointSynchronize::is_at_safepoint()) ||
   252     (JavaThread *)cur == get_thread() ||
   253     JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
   254     "sanity check");
   256   _cur_stack_depth = UNKNOWN_STACK_DEPTH;
   257 }
   259 void JvmtiThreadState::incr_cur_stack_depth() {
   260   guarantee(JavaThread::current() == get_thread(), "must be current thread");
   262   if (!is_interp_only_mode()) {
   263     _cur_stack_depth = UNKNOWN_STACK_DEPTH;
   264   }
   265   if (_cur_stack_depth != UNKNOWN_STACK_DEPTH) {
   266     ++_cur_stack_depth;
   267   }
   268 }
   270 void JvmtiThreadState::decr_cur_stack_depth() {
   271   guarantee(JavaThread::current() == get_thread(), "must be current thread");
   273   if (!is_interp_only_mode()) {
   274     _cur_stack_depth = UNKNOWN_STACK_DEPTH;
   275   }
   276   if (_cur_stack_depth != UNKNOWN_STACK_DEPTH) {
   277     --_cur_stack_depth;
   278     assert(_cur_stack_depth >= 0, "incr/decr_cur_stack_depth mismatch");
   279   }
   280 }
   282 int JvmtiThreadState::cur_stack_depth() {
   283   uint32_t debug_bits = 0;
   284   guarantee(JavaThread::current() == get_thread() ||
   285     JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
   286     "must be current thread or suspended");
   288   if (!is_interp_only_mode() || _cur_stack_depth == UNKNOWN_STACK_DEPTH) {
   289     _cur_stack_depth = count_frames();
   290   } else {
   291     // heavy weight assert
   292     assert(_cur_stack_depth == count_frames(),
   293            "cur_stack_depth out of sync");
   294   }
   295   return _cur_stack_depth;
   296 }
   298 bool JvmtiThreadState::may_be_walked() {
   299   return (get_thread()->is_being_ext_suspended() || (JavaThread::current() == get_thread()));
   300 }
   303 void JvmtiThreadState::process_pending_step_for_popframe() {
   304   // We are single stepping as the last part of the PopFrame() dance
   305   // so we have some house keeping to do.
   307   JavaThread *thr = get_thread();
   308   if (thr->popframe_condition() != JavaThread::popframe_inactive) {
   309     // If the popframe_condition field is not popframe_inactive, then
   310     // we missed all of the popframe_field cleanup points:
   311     //
   312     // - unpack_frames() was not called (nothing to deopt)
   313     // - remove_activation_preserving_args_entry() was not called
   314     //   (did not get suspended in a call_vm() family call and did
   315     //   not complete a call_vm() family call on the way here)
   316     thr->clear_popframe_condition();
   317   }
   319   // clearing the flag indicates we are done with the PopFrame() dance
   320   clr_pending_step_for_popframe();
   322   // If exception was thrown in this frame, need to reset jvmti thread state.
   323   // Single stepping may not get enabled correctly by the agent since
   324   // exception state is passed in MethodExit event which may be sent at some
   325   // time in the future. JDWP agent ignores MethodExit events if caused by
   326   // an exception.
   327   //
   328   if (is_exception_detected()) {
   329     clear_exception_detected();
   330   }
   331   // If step is pending for popframe then it may not be
   332   // a repeat step. The new_bci and method_id is same as current_bci
   333   // and current method_id after pop and step for recursive calls.
   334   // Force the step by clearing the last location.
   335   JvmtiEnvThreadStateIterator it(this);
   336   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
   337     ets->clear_current_location();
   338   }
   339 }
   342 // Class:     JvmtiThreadState
   343 // Function:  update_for_pop_top_frame
   344 // Description:
   345 //   This function removes any frame pop notification request for
   346 //   the top frame and invalidates both the current stack depth and
   347 //   all cached frameIDs.
   348 //
   349 // Called by: PopFrame
   350 //
   351 void JvmtiThreadState::update_for_pop_top_frame() {
   352   if (is_interp_only_mode()) {
   353     // remove any frame pop notification request for the top frame
   354     // in any environment
   355     int popframe_number = cur_stack_depth();
   356     {
   357       JvmtiEnvThreadStateIterator it(this);
   358       for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
   359         if (ets->is_frame_pop(popframe_number)) {
   360           ets->clear_frame_pop(popframe_number);
   361         }
   362       }
   363     }
   364     // force stack depth to be recalculated
   365     invalidate_cur_stack_depth();
   366   } else {
   367     assert(!is_enabled(JVMTI_EVENT_FRAME_POP), "Must have no framepops set");
   368   }
   369 }
   372 void JvmtiThreadState::process_pending_step_for_earlyret() {
   373   // We are single stepping as the last part of the ForceEarlyReturn
   374   // dance so we have some house keeping to do.
   376   if (is_earlyret_pending()) {
   377     // If the earlyret_state field is not earlyret_inactive, then
   378     // we missed all of the earlyret_field cleanup points:
   379     //
   380     // - remove_activation() was not called
   381     //   (did not get suspended in a call_vm() family call and did
   382     //   not complete a call_vm() family call on the way here)
   383     //
   384     // One legitimate way for us to miss all the cleanup points is
   385     // if we got here right after handling a compiled return. If that
   386     // is the case, then we consider our return from compiled code to
   387     // complete the ForceEarlyReturn request and we clear the condition.
   388     clr_earlyret_pending();
   389     set_earlyret_oop(NULL);
   390     clr_earlyret_value();
   391   }
   393   // clearing the flag indicates we are done with
   394   // the ForceEarlyReturn() dance
   395   clr_pending_step_for_earlyret();
   397   // If exception was thrown in this frame, need to reset jvmti thread state.
   398   // Single stepping may not get enabled correctly by the agent since
   399   // exception state is passed in MethodExit event which may be sent at some
   400   // time in the future. JDWP agent ignores MethodExit events if caused by
   401   // an exception.
   402   //
   403   if (is_exception_detected()) {
   404     clear_exception_detected();
   405   }
   406   // If step is pending for earlyret then it may not be a repeat step.
   407   // The new_bci and method_id is same as current_bci and current
   408   // method_id after earlyret and step for recursive calls.
   409   // Force the step by clearing the last location.
   410   JvmtiEnvThreadStateIterator it(this);
   411   for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
   412     ets->clear_current_location();
   413   }
   414 }
   416 void JvmtiThreadState::oops_do(OopClosure* f) {
   417   f->do_oop((oop*) &_earlyret_oop);
   418 }

mercurial