1 /* 2 * Copyright (c) 2018, 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 * 23 */ 24 25 #ifndef SHARE_CLASSFILE_CLASSLOADER_INLINE_HPP 26 #define SHARE_CLASSFILE_CLASSLOADER_INLINE_HPP 27 28 #include "classfile/classLoader.hpp" 29 #include "runtime/orderAccess.hpp" 30 31 // Next entry in class path 32 inline ClassPathEntry* ClassPathEntry::next() const { return OrderAccess::load_acquire(&_next); } 33 34 inline void ClassPathEntry::set_next(ClassPathEntry* next) { 35 // may have unlocked readers, so ensure visibility. 36 OrderAccess::release_store(&_next, next); 37 } 38 39 inline ClassPathEntry* ClassLoader::classpath_entry(int n) { 40 assert(n >= 0, "sanity"); 41 if (n == 0) { 42 assert(has_jrt_entry(), "No class path entry at 0 for exploded module builds"); 43 return ClassLoader::_jrt_entry; 44 } else { 45 // The java runtime image is always the first entry 46 // in the FileMapInfo::_classpath_entry_table. Even though 47 // the _jrt_entry is not included in the _first_append_entry 48 // linked list, it must be accounted for when comparing the 49 // class path vs. the shared archive class path. 50 ClassPathEntry* e = ClassLoader::_first_append_entry; 51 while (--n >= 1) { 52 assert(e != NULL, "Not that many classpath entries."); 53 e = e->next(); 54 } 55 return e; 56 } 57 } 58 59 #if INCLUDE_CDS 60 61 // Helper function used by CDS code to get the number of boot classpath 62 // entries during shared classpath setup time. 63 64 inline int ClassLoader::num_boot_classpath_entries() { 65 assert(DumpSharedSpaces || DynamicDumpSharedSpaces, 66 "Should only be called at CDS dump time"); 67 assert(has_jrt_entry(), "must have a java runtime image"); 68 int num_entries = 1; // count the runtime image 69 ClassPathEntry* e = ClassLoader::_first_append_entry; 70 while (e != NULL) { 71 num_entries ++; 72 e = e->next(); 73 } 74 return num_entries; 75 } 76 77 inline ClassPathEntry* ClassLoader::get_next_boot_classpath_entry(ClassPathEntry* e) { 78 if (e == ClassLoader::_jrt_entry) { 79 return ClassLoader::_first_append_entry; 80 } else { 81 return e->next(); 82 } 83 } 84 85 // Helper function used by CDS code to get the number of app classpath 86 // entries during shared classpath setup time. 87 inline int ClassLoader::num_app_classpath_entries() { 88 assert(DumpSharedSpaces || DynamicDumpSharedSpaces, 89 "Should only be called at CDS dump time"); 90 int num_entries = 0; 91 ClassPathEntry* e= ClassLoader::_app_classpath_entries; 92 while (e != NULL) { 93 num_entries ++; 94 e = e->next(); 95 } 96 return num_entries; 97 } 98 99 #endif // INCLUDE_CDS 100 101 #endif // SHARE_CLASSFILE_CLASSLOADER_INLINE_HPP