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 Atomic::load_acquire(&_next); } 33 34 inline void ClassPathEntry::set_next(ClassPathEntry* next) { 35 // may have unlocked readers, so ensure visibility. 36 Atomic::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 Arguments::assert_is_dumping_archive(); 66 assert(has_jrt_entry(), "must have a java runtime image"); 67 int num_entries = 1; // count the runtime image 68 ClassPathEntry* e = ClassLoader::_first_append_entry; 69 while (e != NULL) { 70 num_entries ++; 71 e = e->next(); 72 } 73 return num_entries; 74 } 75 76 inline ClassPathEntry* ClassLoader::get_next_boot_classpath_entry(ClassPathEntry* e) { 77 if (e == ClassLoader::_jrt_entry) { 78 return ClassLoader::_first_append_entry; 79 } else { 80 return e->next(); 81 } 82 } 83 84 // Helper function used by CDS code to get the number of app classpath 85 // entries during shared classpath setup time. 86 inline int ClassLoader::num_app_classpath_entries() { 87 Arguments::assert_is_dumping_archive(); 88 int num_entries = 0; 89 ClassPathEntry* e= ClassLoader::_app_classpath_entries; 90 while (e != NULL) { 91 num_entries ++; 92 e = e->next(); 93 } 94 return num_entries; 95 } 96 97 #endif // INCLUDE_CDS 98 99 #endif // SHARE_CLASSFILE_CLASSLOADER_INLINE_HPP