annotate src/os/bsd/vm/os_bsd.hpp @ 8854:754c24457b20

7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method. Reviewed-by: jmasa, tamao
author tschatzl
date Wed, 27 Mar 2013 19:21:18 +0100
parents 63e54c37ac64
children f2110083203d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 /*
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25 #ifndef OS_BSD_VM_OS_BSD_HPP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26 #define OS_BSD_VM_OS_BSD_HPP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28 // Bsd_OS defines the interface to Bsd operating systems
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 /* pthread_getattr_np comes with BsdThreads-0.9-7 on RedHat 7.1 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 // Mac OS X doesn't support clock_gettime. Stub out the type, it is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 // unused
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 typedef int clockid_t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 class Bsd {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 friend class os;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 // For signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 #define MAXSIGNUM 32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 static struct sigaction sigact[MAXSIGNUM]; // saved preinstalled sigactions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 static unsigned int sigs; // mask of signals that have
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 // preinstalled signal handlers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 static bool libjsig_is_loaded; // libjsig that interposes sigaction(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 // __sigaction(), signal() is loaded
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 static struct sigaction *(*get_signal_action)(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 static struct sigaction *get_preinstalled_handler(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 static void save_preinstalled_handler(int, struct sigaction&);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 static void check_signal_handler(int sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 // For signal flags diagnostics
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 static int sigflags[MAXSIGNUM];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 static int (*_clock_gettime)(clockid_t, struct timespec *);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 static GrowableArray<int>* _cpu_to_node;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 protected:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 static julong _physical_memory;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 static pthread_t _main_thread;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 static int _page_size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 static julong available_memory();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 static julong physical_memory() { return _physical_memory; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 static void initialize_system_info();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 static bool supports_variable_stack_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 static void rebuild_cpu_to_node_map();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 static bool hugetlbfs_sanity_check(bool warn, size_t page_size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 public:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 static void init_thread_fpu_state();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 static pthread_t main_thread(void) { return _main_thread; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 static void hotspot_sigmask(Thread* thread);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 static bool is_initial_thread(void);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 static int page_size(void) { return _page_size; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 static void set_page_size(int val) { _page_size = val; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 static address ucontext_get_pc(ucontext_t* uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 static intptr_t* ucontext_get_sp(ucontext_t* uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 static intptr_t* ucontext_get_fp(ucontext_t* uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 // For Analyzer Forte AsyncGetCallTrace profiling support:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 // This interface should be declared in os_bsd_i486.hpp, but
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 // that file provides extensions to the os class and not the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 // Bsd class.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 static ExtendedPC fetch_frame_from_ucontext(Thread* thread, ucontext_t* uc,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 intptr_t** ret_sp, intptr_t** ret_fp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 // This boolean allows users to forward their own non-matching signals
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 // to JVM_handle_bsd_signal, harmlessly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 static bool signal_handlers_are_installed;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 static int get_our_sigflags(int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 static void set_our_sigflags(int, int);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109 static void signal_sets_init();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 static void install_signal_handlers();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 static void set_signal_handler(int, bool);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 static bool is_sig_ignored(int sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
114 static sigset_t* unblocked_signals();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115 static sigset_t* vm_signals();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 static sigset_t* allowdebug_blocked_signals();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118 // For signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119 static struct sigaction *get_chained_signal_action(int sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 // Minimum stack size a thread can be created with (allowing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 // the VM to completely create the thread and enter user code)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 static size_t min_stack_allowed;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 // Return default stack size or guard size for the specified thread type
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 static size_t default_stack_size(os::ThreadType thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 static size_t default_guard_size(os::ThreadType thr_type);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 // Real-time clock functions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 static void clock_init(void);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132
6630
fa9253dcd4df 7194409: os::javaTimeNanos() shows hot on CPU_CLK_UNHALTED profiles
johnc
parents: 6197
diff changeset
133 static inline bool supports_monotonic_clock() {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 return _clock_gettime != NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137 static int clock_gettime(clockid_t clock_id, struct timespec *tp) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138 return _clock_gettime ? _clock_gettime(clock_id, tp) : -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 // Stack repair handling
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 // none present
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145 // BsdThreads work-around for 6292965
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 // Bsd suspend/resume support - this helper is a shadow of its former
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150 // self now that low-level suspension is barely used, and old workarounds
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 // for BsdThreads are no longer needed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 class SuspendResume {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 private:
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
154 volatile int _suspend_action;
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
155 volatile jint _state;
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
156 public:
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 // values for suspend_action:
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
158 enum {
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
159 SR_NONE = 0x00,
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
160 SR_SUSPEND = 0x01, // suspend request
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
161 SR_CONTINUE = 0x02, // resume request
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
162 SR_SUSPENDED = 0x20 // values for _state: + SR_NONE
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
163 };
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 SuspendResume() { _suspend_action = SR_NONE; _state = SR_NONE; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 int suspend_action() const { return _suspend_action; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168 void set_suspend_action(int x) { _suspend_action = x; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170 // atomic updates for _state
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
171 inline void set_suspended();
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 6918
diff changeset
172 inline void clear_suspended();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 bool is_suspended() { return _state & SR_SUSPENDED; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 #undef SR_SUSPENDED
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 private:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 typedef int (*sched_getcpu_func_t)(void);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181 typedef int (*numa_max_node_func_t)(void);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182 typedef int (*numa_available_func_t)(void);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 static sched_getcpu_func_t _sched_getcpu;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 static numa_node_to_cpus_func_t _numa_node_to_cpus;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 static numa_max_node_func_t _numa_max_node;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189 static numa_available_func_t _numa_available;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 static numa_tonode_memory_func_t _numa_tonode_memory;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 static numa_interleave_memory_func_t _numa_interleave_memory;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 static unsigned long* _numa_all_nodes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 public:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 static int numa_tonode_memory(void *start, size_t size, int node) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 static void numa_interleave_memory(void *start, size_t size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 _numa_interleave_memory(start, size, _numa_all_nodes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 static int get_node_by_cpu(int cpu_id);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 3960
diff changeset
220 class PlatformEvent : public CHeapObj<mtInternal> {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
221 private:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
222 double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
223 volatile int _Event ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
224 volatile int _nParked ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
225 pthread_mutex_t _mutex [1] ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226 pthread_cond_t _cond [1] ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227 double PostPad [2] ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 Thread * _Assoc ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 public: // TODO-FIXME: make dtor private
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 ~PlatformEvent() { guarantee (0, "invariant") ; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233 public:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 PlatformEvent() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 int status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 status = pthread_cond_init (_cond, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 assert_status(status == 0, status, "cond_init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 status = pthread_mutex_init (_mutex, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 assert_status(status == 0, status, "mutex_init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240 _Event = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 _nParked = 0 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 _Assoc = NULL ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245 // Use caution with reset() and fired() -- they may require MEMBARs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246 void reset() { _Event = 0 ; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
247 int fired() { return _Event; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 void park () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 void unpark () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 int TryPark () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 int park (jlong millis) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 void SetAssociation (Thread * a) { _Assoc = a ; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
253 } ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 3960
diff changeset
255 class PlatformParker : public CHeapObj<mtInternal> {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 protected:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 pthread_mutex_t _mutex [1] ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258 pthread_cond_t _cond [1] ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 public: // TODO-FIXME: make dtor private
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 ~PlatformParker() { guarantee (0, "invariant") ; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263 public:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 PlatformParker() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 int status;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 status = pthread_cond_init (_cond, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 assert_status(status == 0, status, "cond_init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 status = pthread_mutex_init (_mutex, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 assert_status(status == 0, status, "mutex_init");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
271 } ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
272
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
273 #endif // OS_BSD_VM_OS_BSD_HPP