src/share/vm/prims/jvmtiManageCapabilities.cpp

Mon, 01 Feb 2010 17:35:05 -0700

author
dcubed
date
Mon, 01 Feb 2010 17:35:05 -0700
changeset 1648
6deeaebad47a
parent 1513
8e7adf982378
child 1832
b4776199210f
permissions
-rw-r--r--

6902182: 4/4 Starting with jdwp agent should not incur performance penalty
Summary: Rename can_post_exceptions support to can_post_on_exceptions. Add support for should_post_on_exceptions flag to permit per JavaThread optimizations.
Reviewed-by: never, kvn, dcubed
Contributed-by: tom.deneau@amd.com

     1 /*
     2  * Copyright 2003-2010 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    24 # include "incls/_precompiled.incl"
    25 # include "incls/_jvmtiManageCapabilities.cpp.incl"
    27 static const jint CAPA_SIZE = (JVMTI_INTERNAL_CAPABILITY_COUNT + 7) / 8;
    29   // capabilities which are always potentially available
    30 jvmtiCapabilities JvmtiManageCapabilities::always_capabilities;
    32   // capabilities which are potentially available during OnLoad
    33 jvmtiCapabilities JvmtiManageCapabilities::onload_capabilities;
    35   // capabilities which are always potentially available
    36   // but to only one environment
    37 jvmtiCapabilities JvmtiManageCapabilities::always_solo_capabilities;
    39   // capabilities which are potentially available during OnLoad
    40   // but to only one environment
    41 jvmtiCapabilities JvmtiManageCapabilities::onload_solo_capabilities;
    43   // remaining capabilities which are always potentially available
    44   // but to only one environment
    45 jvmtiCapabilities JvmtiManageCapabilities::always_solo_remaining_capabilities;
    47   // remaining capabilities which are potentially available during OnLoad
    48   // but to only one environment
    49 jvmtiCapabilities JvmtiManageCapabilities::onload_solo_remaining_capabilities;
    51   // all capabilities ever acquired
    52 jvmtiCapabilities JvmtiManageCapabilities::acquired_capabilities;
    54 void JvmtiManageCapabilities::initialize() {
    55   always_capabilities = init_always_capabilities();
    56   if (JvmtiEnv::get_phase() != JVMTI_PHASE_ONLOAD) {
    57     recompute_always_capabilities();
    58   }
    59   onload_capabilities = init_onload_capabilities();
    60   always_solo_capabilities = init_always_solo_capabilities();
    61   onload_solo_capabilities = init_onload_solo_capabilities();
    62   always_solo_remaining_capabilities = init_always_solo_capabilities();
    63   onload_solo_remaining_capabilities = init_onload_solo_capabilities();
    64   memset(&acquired_capabilities, 0, sizeof(acquired_capabilities));
    65 }
    67 // if the capability sets are initialized in the onload phase then
    68 // it happens before class data sharing (CDS) is initialized. If it
    69 // turns out that CDS gets disabled then we must adjust the always
    70 // capabilities. To ensure a consistent view of the capabililties
    71 // anything we add here should already be in the onload set.
    72 void JvmtiManageCapabilities::recompute_always_capabilities() {
    73   if (!UseSharedSpaces) {
    74     jvmtiCapabilities jc = always_capabilities;
    75     jc.can_generate_all_class_hook_events = 1;
    76     always_capabilities = jc;
    77   }
    78 }
    81 // corresponding init functions
    82 jvmtiCapabilities JvmtiManageCapabilities::init_always_capabilities() {
    83   jvmtiCapabilities jc;
    85   memset(&jc, 0, sizeof(jc));
    86   jc.can_get_bytecodes = 1;
    87   jc.can_signal_thread = 1;
    88   jc.can_get_source_file_name = 1;
    89   jc.can_get_line_numbers = 1;
    90   jc.can_get_synthetic_attribute = 1;
    91   jc.can_get_monitor_info = 1;
    92   jc.can_get_constant_pool = 1;
    93   jc.can_generate_monitor_events = 1;
    94   jc.can_generate_garbage_collection_events = 1;
    95   jc.can_generate_compiled_method_load_events = 1;
    96   jc.can_generate_native_method_bind_events = 1;
    97   jc.can_generate_vm_object_alloc_events = 1;
    98   if (os::is_thread_cpu_time_supported()) {
    99     jc.can_get_current_thread_cpu_time = 1;
   100     jc.can_get_thread_cpu_time = 1;
   101   }
   102   jc.can_redefine_classes = 1;
   103   jc.can_redefine_any_class = 1;
   104   jc.can_retransform_classes = 1;
   105   jc.can_retransform_any_class = 1;
   106   jc.can_set_native_method_prefix = 1;
   107   jc.can_tag_objects = 1;
   108   jc.can_generate_object_free_events = 1;
   109   jc.can_generate_resource_exhaustion_heap_events = 1;
   110   jc.can_generate_resource_exhaustion_threads_events = 1;
   111   return jc;
   112 }
   114 jvmtiCapabilities JvmtiManageCapabilities::init_onload_capabilities() {
   115   jvmtiCapabilities jc;
   117   memset(&jc, 0, sizeof(jc));
   118 #ifndef CC_INTERP
   119   jc.can_pop_frame = 1;
   120   jc.can_force_early_return = 1;
   121 #endif // !CC_INTERP
   122   jc.can_get_source_debug_extension = 1;
   123   jc.can_access_local_variables = 1;
   124   jc.can_maintain_original_method_order = 1;
   125   jc.can_generate_all_class_hook_events = 1;
   126   jc.can_generate_single_step_events = 1;
   127   jc.can_generate_exception_events = 1;
   128   jc.can_generate_frame_pop_events = 1;
   129   jc.can_generate_method_entry_events = 1;
   130   jc.can_generate_method_exit_events = 1;
   131   jc.can_get_owned_monitor_info = 1;
   132   jc.can_get_owned_monitor_stack_depth_info = 1;
   133   jc.can_get_current_contended_monitor = 1;
   134   // jc.can_get_monitor_info = 1;
   135   jc.can_tag_objects = 1;                 // TODO: this should have been removed
   136   jc.can_generate_object_free_events = 1; // TODO: this should have been removed
   137   return jc;
   138 }
   141 jvmtiCapabilities JvmtiManageCapabilities::init_always_solo_capabilities() {
   142   jvmtiCapabilities jc;
   144   memset(&jc, 0, sizeof(jc));
   145   jc.can_suspend = 1;
   146   return jc;
   147 }
   150 jvmtiCapabilities JvmtiManageCapabilities::init_onload_solo_capabilities() {
   151   jvmtiCapabilities jc;
   153   memset(&jc, 0, sizeof(jc));
   154   jc.can_generate_field_modification_events = 1;
   155   jc.can_generate_field_access_events = 1;
   156   jc.can_generate_breakpoint_events = 1;
   157   return jc;
   158 }
   161 jvmtiCapabilities *JvmtiManageCapabilities::either(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
   162                                                    jvmtiCapabilities *result) {
   163   char *ap = (char *)a;
   164   char *bp = (char *)b;
   165   char *resultp = (char *)result;
   167   for (int i = 0; i < CAPA_SIZE; ++i) {
   168     *resultp++ = *ap++ | *bp++;
   169   }
   171   return result;
   172 }
   175 jvmtiCapabilities *JvmtiManageCapabilities::both(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
   176                                                     jvmtiCapabilities *result) {
   177   char *ap = (char *)a;
   178   char *bp = (char *)b;
   179   char *resultp = (char *)result;
   181   for (int i = 0; i < CAPA_SIZE; ++i) {
   182     *resultp++ = *ap++ & *bp++;
   183   }
   185   return result;
   186 }
   189 jvmtiCapabilities *JvmtiManageCapabilities::exclude(const jvmtiCapabilities *a, const jvmtiCapabilities *b,
   190                                                     jvmtiCapabilities *result) {
   191   char *ap = (char *)a;
   192   char *bp = (char *)b;
   193   char *resultp = (char *)result;
   195   for (int i = 0; i < CAPA_SIZE; ++i) {
   196     *resultp++ = *ap++ & ~*bp++;
   197   }
   199   return result;
   200 }
   203 bool JvmtiManageCapabilities::has_some(const jvmtiCapabilities *a) {
   204   char *ap = (char *)a;
   206   for (int i = 0; i < CAPA_SIZE; ++i) {
   207     if (*ap++ != 0) {
   208       return true;
   209     }
   210   }
   212   return false;
   213 }
   216 void JvmtiManageCapabilities::copy_capabilities(const jvmtiCapabilities *from, jvmtiCapabilities *to) {
   217   char *ap = (char *)from;
   218   char *resultp = (char *)to;
   220   for (int i = 0; i < CAPA_SIZE; ++i) {
   221     *resultp++ = *ap++;
   222   }
   223 }
   226 void JvmtiManageCapabilities::get_potential_capabilities(const jvmtiCapabilities *current,
   227                                                          const jvmtiCapabilities *prohibited,
   228                                                          jvmtiCapabilities *result) {
   229   // exclude prohibited capabilities, must be before adding current
   230   exclude(&always_capabilities, prohibited, result);
   232   // must include current since it may possess solo capabilities and now prohibited
   233   either(result, current, result);
   235   // add other remaining
   236   either(result, &always_solo_remaining_capabilities, result);
   238   // if this is during OnLoad more capabilities are available
   239   if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
   240     either(result, &onload_capabilities, result);
   241     either(result, &onload_solo_remaining_capabilities, result);
   242   }
   243 }
   245 jvmtiError JvmtiManageCapabilities::add_capabilities(const jvmtiCapabilities *current,
   246                                                      const jvmtiCapabilities *prohibited,
   247                                                      const jvmtiCapabilities *desired,
   248                                                      jvmtiCapabilities *result) {
   249   // check that the capabilities being added are potential capabilities
   250   jvmtiCapabilities temp;
   251   get_potential_capabilities(current, prohibited, &temp);
   252   if (has_some(exclude(desired, &temp, &temp))) {
   253     return JVMTI_ERROR_NOT_AVAILABLE;
   254   }
   256   // add to the set of ever acquired capabilities
   257   either(&acquired_capabilities, desired, &acquired_capabilities);
   259   // onload capabilities that got added are now permanent - so, also remove from onload
   260   both(&onload_capabilities, desired, &temp);
   261   either(&always_capabilities, &temp, &always_capabilities);
   262   exclude(&onload_capabilities, &temp, &onload_capabilities);
   264   // same for solo capabilities (transferred capabilities in the remaining sets handled as part of standard grab - below)
   265   both(&onload_solo_capabilities, desired, &temp);
   266   either(&always_solo_capabilities, &temp, &always_solo_capabilities);
   267   exclude(&onload_solo_capabilities, &temp, &onload_solo_capabilities);
   269   // remove solo capabilities that are now taken
   270   exclude(&always_solo_remaining_capabilities, desired, &always_solo_remaining_capabilities);
   271   exclude(&onload_solo_remaining_capabilities, desired, &onload_solo_remaining_capabilities);
   273   // return the result
   274   either(current, desired, result);
   276   update();
   278   return JVMTI_ERROR_NONE;
   279 }
   282 void JvmtiManageCapabilities::relinquish_capabilities(const jvmtiCapabilities *current,
   283                                                       const jvmtiCapabilities *unwanted,
   284                                                       jvmtiCapabilities *result) {
   285   jvmtiCapabilities to_trash;
   286   jvmtiCapabilities temp;
   288   // can't give up what you don't have
   289   both(current, unwanted, &to_trash);
   291   // restore solo capabilities but only those that belong
   292   either(&always_solo_remaining_capabilities, both(&always_solo_capabilities, &to_trash, &temp),
   293          &always_solo_remaining_capabilities);
   294   either(&onload_solo_remaining_capabilities, both(&onload_solo_capabilities, &to_trash, &temp),
   295          &onload_solo_remaining_capabilities);
   297   update();
   299   // return the result
   300   exclude(current, unwanted, result);
   301 }
   304 void JvmtiManageCapabilities::update() {
   305   jvmtiCapabilities avail;
   307   // all capabilities
   308   either(&always_capabilities, &always_solo_capabilities, &avail);
   310   bool interp_events =
   311     avail.can_generate_field_access_events ||
   312     avail.can_generate_field_modification_events ||
   313     avail.can_generate_single_step_events ||
   314     avail.can_generate_frame_pop_events ||
   315     avail.can_generate_method_entry_events ||
   316     avail.can_generate_method_exit_events;
   317   bool enter_all_methods =
   318     interp_events ||
   319     avail.can_generate_breakpoint_events;
   320   UseFastEmptyMethods = !enter_all_methods;
   321   UseFastAccessorMethods = !enter_all_methods;
   323   if (avail.can_generate_breakpoint_events) {
   324     RewriteFrequentPairs = false;
   325   }
   327   // If can_redefine_classes is enabled in the onload phase then we know that the
   328   // dependency information recorded by the compiler is complete.
   329   if ((avail.can_redefine_classes || avail.can_retransform_classes) &&
   330       JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
   331     JvmtiExport::set_all_dependencies_are_recorded(true);
   332   }
   334   JvmtiExport::set_can_get_source_debug_extension(avail.can_get_source_debug_extension);
   335   JvmtiExport::set_can_examine_or_deopt_anywhere(
   336     avail.can_generate_breakpoint_events ||
   337     interp_events ||
   338     avail.can_redefine_classes ||
   339     avail.can_retransform_classes ||
   340     avail.can_access_local_variables ||
   341     avail.can_get_owned_monitor_info ||
   342     avail.can_get_current_contended_monitor ||
   343     avail.can_get_monitor_info ||
   344     avail.can_get_owned_monitor_stack_depth_info);
   345   JvmtiExport::set_can_maintain_original_method_order(avail.can_maintain_original_method_order);
   346   JvmtiExport::set_can_post_interpreter_events(interp_events);
   347   JvmtiExport::set_can_hotswap_or_post_breakpoint(
   348     avail.can_generate_breakpoint_events ||
   349     avail.can_redefine_classes ||
   350     avail.can_retransform_classes);
   351   JvmtiExport::set_can_modify_any_class(
   352     avail.can_generate_breakpoint_events ||
   353     avail.can_generate_all_class_hook_events);
   354   JvmtiExport::set_can_walk_any_space(
   355     avail.can_tag_objects);   // disable sharing in onload phase
   356   JvmtiExport::set_can_access_local_variables(
   357     avail.can_access_local_variables  ||
   358     avail.can_redefine_classes ||
   359     avail.can_retransform_classes);
   360   JvmtiExport::set_can_post_on_exceptions(
   361     avail.can_generate_exception_events ||
   362     avail.can_generate_frame_pop_events ||
   363     avail.can_generate_method_exit_events);
   364   JvmtiExport::set_can_post_breakpoint(avail.can_generate_breakpoint_events);
   365   JvmtiExport::set_can_post_field_access(avail.can_generate_field_access_events);
   366   JvmtiExport::set_can_post_field_modification(avail.can_generate_field_modification_events);
   367   JvmtiExport::set_can_post_method_entry(avail.can_generate_method_entry_events);
   368   JvmtiExport::set_can_post_method_exit(avail.can_generate_method_exit_events ||
   369                                         avail.can_generate_frame_pop_events);
   370   JvmtiExport::set_can_pop_frame(avail.can_pop_frame);
   371   JvmtiExport::set_can_force_early_return(avail.can_force_early_return);
   372   JvmtiExport::set_should_clean_up_heap_objects(avail.can_generate_breakpoint_events);
   373 }
   375 #ifndef PRODUCT
   377 void JvmtiManageCapabilities:: print(const jvmtiCapabilities* cap) {
   378   tty->print_cr("----- capabilities -----");
   379   if (cap->can_tag_objects)
   380     tty->print_cr("can_tag_objects");
   381   if (cap->can_generate_field_modification_events)
   382     tty->print_cr("can_generate_field_modification_events");
   383   if (cap->can_generate_field_access_events)
   384     tty->print_cr("can_generate_field_access_events");
   385   if (cap->can_get_bytecodes)
   386     tty->print_cr("can_get_bytecodes");
   387   if (cap->can_get_synthetic_attribute)
   388     tty->print_cr("can_get_synthetic_attribute");
   389   if (cap->can_get_owned_monitor_info)
   390     tty->print_cr("can_get_owned_monitor_info");
   391   if (cap->can_get_current_contended_monitor)
   392     tty->print_cr("can_get_current_contended_monitor");
   393   if (cap->can_get_monitor_info)
   394     tty->print_cr("can_get_monitor_info");
   395   if (cap->can_get_constant_pool)
   396     tty->print_cr("can_get_constant_pool");
   397   if (cap->can_pop_frame)
   398     tty->print_cr("can_pop_frame");
   399   if (cap->can_force_early_return)
   400     tty->print_cr("can_force_early_return");
   401   if (cap->can_redefine_classes)
   402     tty->print_cr("can_redefine_classes");
   403   if (cap->can_retransform_classes)
   404     tty->print_cr("can_retransform_classes");
   405   if (cap->can_signal_thread)
   406     tty->print_cr("can_signal_thread");
   407   if (cap->can_get_source_file_name)
   408     tty->print_cr("can_get_source_file_name");
   409   if (cap->can_get_line_numbers)
   410     tty->print_cr("can_get_line_numbers");
   411   if (cap->can_get_source_debug_extension)
   412     tty->print_cr("can_get_source_debug_extension");
   413   if (cap->can_access_local_variables)
   414     tty->print_cr("can_access_local_variables");
   415   if (cap->can_maintain_original_method_order)
   416     tty->print_cr("can_maintain_original_method_order");
   417   if (cap->can_generate_single_step_events)
   418     tty->print_cr("can_generate_single_step_events");
   419   if (cap->can_generate_exception_events)
   420     tty->print_cr("can_generate_exception_events");
   421   if (cap->can_generate_frame_pop_events)
   422     tty->print_cr("can_generate_frame_pop_events");
   423   if (cap->can_generate_breakpoint_events)
   424     tty->print_cr("can_generate_breakpoint_events");
   425   if (cap->can_suspend)
   426     tty->print_cr("can_suspend");
   427   if (cap->can_redefine_any_class )
   428     tty->print_cr("can_redefine_any_class");
   429   if (cap->can_retransform_any_class )
   430     tty->print_cr("can_retransform_any_class");
   431   if (cap->can_get_current_thread_cpu_time)
   432     tty->print_cr("can_get_current_thread_cpu_time");
   433   if (cap->can_get_thread_cpu_time)
   434     tty->print_cr("can_get_thread_cpu_time");
   435   if (cap->can_generate_method_entry_events)
   436     tty->print_cr("can_generate_method_entry_events");
   437   if (cap->can_generate_method_exit_events)
   438     tty->print_cr("can_generate_method_exit_events");
   439   if (cap->can_generate_all_class_hook_events)
   440     tty->print_cr("can_generate_all_class_hook_events");
   441   if (cap->can_generate_compiled_method_load_events)
   442     tty->print_cr("can_generate_compiled_method_load_events");
   443   if (cap->can_generate_monitor_events)
   444     tty->print_cr("can_generate_monitor_events");
   445   if (cap->can_generate_vm_object_alloc_events)
   446     tty->print_cr("can_generate_vm_object_alloc_events");
   447   if (cap->can_generate_native_method_bind_events)
   448     tty->print_cr("can_generate_native_method_bind_events");
   449   if (cap->can_generate_garbage_collection_events)
   450     tty->print_cr("can_generate_garbage_collection_events");
   451   if (cap->can_generate_object_free_events)
   452     tty->print_cr("can_generate_object_free_events");
   453   if (cap->can_generate_resource_exhaustion_heap_events)
   454     tty->print_cr("can_generate_resource_exhaustion_heap_events");
   455   if (cap->can_generate_resource_exhaustion_threads_events)
   456     tty->print_cr("can_generate_resource_exhaustion_threads_events");
   457 }
   459 #endif

mercurial