< prev index next >

src/hotspot/share/classfile/klassFactory.cpp

Print this page
   1 /*
   2 * Copyright (c) 2015, 2018, 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 *


  29 #include "classfile/classLoaderData.hpp"
  30 #include "classfile/classLoaderData.inline.hpp"
  31 #include "classfile/klassFactory.hpp"
  32 #include "memory/filemap.hpp"
  33 #include "memory/metaspaceShared.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "prims/jvmtiEnvBase.hpp"
  36 #include "prims/jvmtiRedefineClasses.hpp"
  37 #include "runtime/handles.inline.hpp"
  38 #include "utilities/macros.hpp"
  39 #if INCLUDE_JFR
  40 #include "jfr/support/jfrKlassExtension.hpp"
  41 #endif
  42 
  43 
  44 // called during initial loading of a shared class
  45 InstanceKlass* KlassFactory::check_shared_class_file_load_hook(
  46                                           InstanceKlass* ik,
  47                                           Symbol* class_name,
  48                                           Handle class_loader,
  49                                           Handle protection_domain, TRAPS) {


  50 #if INCLUDE_CDS && INCLUDE_JVMTI
  51   assert(ik != NULL, "sanity");
  52   assert(ik->is_shared(), "expecting a shared class");
  53 
  54   if (JvmtiExport::should_post_class_file_load_hook()) {
  55     assert(THREAD->is_Java_thread(), "must be JavaThread");
  56 
  57     // Post the CFLH
  58     JvmtiCachedClassFileData* cached_class_file = NULL;
  59     JvmtiCachedClassFileData* archived_class_data = ik->get_archived_class_data();
  60     assert(archived_class_data != NULL, "shared class has no archived class data");
  61     unsigned char* ptr =
  62         VM_RedefineClasses::get_cached_class_file_bytes(archived_class_data);
  63     unsigned char* end_ptr =
  64         ptr + VM_RedefineClasses::get_cached_class_file_len(archived_class_data);
  65     unsigned char* old_ptr = ptr;
  66     JvmtiExport::post_class_file_load_hook(class_name,
  67                                            class_loader,
  68                                            protection_domain,
  69                                            &ptr,
  70                                            &end_ptr,
  71                                            &cached_class_file);
  72     if (old_ptr != ptr) {
  73       // JVMTI agent has modified class file data.
  74       // Set new class file stream using JVMTI agent modified class file data.
  75       ClassLoaderData* loader_data =
  76         ClassLoaderData::class_loader_data(class_loader());
  77       int path_index = ik->shared_classpath_index();
  78       const char* pathname;
  79       if (path_index < 0) {
  80         // shared classes loaded by user defined class loader
  81         // do not have shared_classpath_index
  82         ModuleEntry* mod_entry = ik->module();
  83         if (mod_entry != NULL && (mod_entry->location() != NULL)) {
  84           ResourceMark rm;
  85           pathname = (const char*)(mod_entry->location()->as_C_string());
  86         } else {
  87           pathname = "";
  88         }
  89       } else {
  90         SharedClassPathEntry* ent =
  91           (SharedClassPathEntry*)FileMapInfo::shared_path(path_index);
  92         pathname = ent == NULL ? NULL : ent->name();
  93       }
  94       ClassFileStream* stream = new ClassFileStream(ptr,
  95                                                     end_ptr - ptr,
  96                                                     pathname,
  97                                                     ClassFileStream::verify);
  98       ClassFileParser parser(stream,
  99                              class_name,
 100                              loader_data,
 101                              protection_domain,
 102                              NULL,
 103                              NULL,
 104                              ClassFileParser::BROADCAST, // publicity level
 105                              CHECK_NULL);
 106       InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
 107                                                            CHECK_NULL);
 108       if (cached_class_file != NULL) {
 109         new_ik->set_cached_class_file(cached_class_file);
 110       }
 111 
 112       if (class_loader.is_null()) {
 113         ResourceMark rm;
 114         ClassLoader::add_package(class_name->as_C_string(), path_index, THREAD);
 115       }
 116 


 219                          ClassFileParser::BROADCAST, // publicity level
 220                          CHECK_NULL);
 221 
 222   InstanceKlass* result = parser.create_instance_klass(old_stream != stream, CHECK_NULL);
 223   assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant");
 224 
 225   if (result == NULL) {
 226     return NULL;
 227   }
 228 
 229   if (cached_class_file != NULL) {
 230     // JVMTI: we have an InstanceKlass now, tell it about the cached bytes
 231     result->set_cached_class_file(cached_class_file);
 232   }
 233 
 234   JFR_ONLY(ON_KLASS_CREATION(result, parser, THREAD);)
 235 
 236 #if INCLUDE_CDS
 237   if (DumpSharedSpaces) {
 238     ClassLoader::record_result(result, stream, THREAD);
 239 #if INCLUDE_JVMTI
 240     assert(cached_class_file == NULL, "Sanity");
 241     // Archive the class stream data into the optional data section
 242     JvmtiCachedClassFileData *p;
 243     int len;
 244     const unsigned char *bytes;
 245     // event based tracing might set cached_class_file
 246     if ((bytes = result->get_cached_class_file_bytes()) != NULL) {
 247       len = result->get_cached_class_file_len();
 248     } else {
 249       len = stream->length();
 250       bytes = stream->buffer();
 251     }
 252     p = (JvmtiCachedClassFileData*)os::malloc(offset_of(JvmtiCachedClassFileData, data) + len, mtInternal);
 253     p->length = len;
 254     memcpy(p->data, bytes, len);
 255     result->set_archived_class_data(p);
 256 #endif // INCLUDE_JVMTI
 257   }
 258 #endif // INCLUDE_CDS
 259 
 260   return result;
 261 }
   1 /*
   2 * Copyright (c) 2015, 2019, 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 *


  29 #include "classfile/classLoaderData.hpp"
  30 #include "classfile/classLoaderData.inline.hpp"
  31 #include "classfile/klassFactory.hpp"
  32 #include "memory/filemap.hpp"
  33 #include "memory/metaspaceShared.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "prims/jvmtiEnvBase.hpp"
  36 #include "prims/jvmtiRedefineClasses.hpp"
  37 #include "runtime/handles.inline.hpp"
  38 #include "utilities/macros.hpp"
  39 #if INCLUDE_JFR
  40 #include "jfr/support/jfrKlassExtension.hpp"
  41 #endif
  42 
  43 
  44 // called during initial loading of a shared class
  45 InstanceKlass* KlassFactory::check_shared_class_file_load_hook(
  46                                           InstanceKlass* ik,
  47                                           Symbol* class_name,
  48                                           Handle class_loader,
  49                                           Handle protection_domain,
  50                                           const ClassFileStream *cfs,
  51                                           TRAPS) {
  52 #if INCLUDE_CDS && INCLUDE_JVMTI
  53   assert(ik != NULL, "sanity");
  54   assert(ik->is_shared(), "expecting a shared class");

  55   if (JvmtiExport::should_post_class_file_load_hook()) {
  56     assert(THREAD->is_Java_thread(), "must be JavaThread");
  57 
  58     // Post the CFLH
  59     JvmtiCachedClassFileData* cached_class_file = NULL;
  60     if (cfs == NULL) {
  61       cfs = FileMapInfo::open_stream_for_jvmti(ik, CHECK_NULL);
  62     }
  63     unsigned char* ptr = (unsigned char*)cfs->buffer();
  64     unsigned char* end_ptr = ptr + cfs->length();

  65     unsigned char* old_ptr = ptr;
  66     JvmtiExport::post_class_file_load_hook(class_name,
  67                                            class_loader,
  68                                            protection_domain,
  69                                            &ptr,
  70                                            &end_ptr,
  71                                            &cached_class_file);
  72     if (old_ptr != ptr) {
  73       // JVMTI agent has modified class file data.
  74       // Set new class file stream using JVMTI agent modified class file data.
  75       ClassLoaderData* loader_data =
  76         ClassLoaderData::class_loader_data(class_loader());
  77       int path_index = ik->shared_classpath_index();
















  78       ClassFileStream* stream = new ClassFileStream(ptr,
  79                                                     end_ptr - ptr,
  80                                                     cfs->source(),
  81                                                     ClassFileStream::verify);
  82       ClassFileParser parser(stream,
  83                              class_name,
  84                              loader_data,
  85                              protection_domain,
  86                              NULL,
  87                              NULL,
  88                              ClassFileParser::BROADCAST, // publicity level
  89                              CHECK_NULL);
  90       InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
  91                                                            CHECK_NULL);
  92       if (cached_class_file != NULL) {
  93         new_ik->set_cached_class_file(cached_class_file);
  94       }
  95 
  96       if (class_loader.is_null()) {
  97         ResourceMark rm;
  98         ClassLoader::add_package(class_name->as_C_string(), path_index, THREAD);
  99       }
 100 


 203                          ClassFileParser::BROADCAST, // publicity level
 204                          CHECK_NULL);
 205 
 206   InstanceKlass* result = parser.create_instance_klass(old_stream != stream, CHECK_NULL);
 207   assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant");
 208 
 209   if (result == NULL) {
 210     return NULL;
 211   }
 212 
 213   if (cached_class_file != NULL) {
 214     // JVMTI: we have an InstanceKlass now, tell it about the cached bytes
 215     result->set_cached_class_file(cached_class_file);
 216   }
 217 
 218   JFR_ONLY(ON_KLASS_CREATION(result, parser, THREAD);)
 219 
 220 #if INCLUDE_CDS
 221   if (DumpSharedSpaces) {
 222     ClassLoader::record_result(result, stream, THREAD);


















 223   }
 224 #endif // INCLUDE_CDS
 225 
 226   return result;
 227 }
< prev index next >