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
32inline ClassPathEntry* ClassPathEntry::next() const { return OrderAccess::load_acquire(&_next); }
33
34inline void ClassPathEntry::set_next(ClassPathEntry* next) {
35 // may have unlocked readers, so ensure visibility.
36 OrderAccess::release_store(&_next, next);
37}
38
39inline 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
64inline 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
77inline 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.
87inline 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
102