annotate src/share/vm/runtime/os.hpp @ 94:0834225a7916

6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction Summary: The option CMSInitiatingPermOccupancyFraction now controls perm triggering threshold. Even though the actual value of the threshold has not yet been changed, so there is no change in policy, we now have the infrastructure in place for dynamically deciding when to collect the perm gen, an issue that will be addressed in the near future. Reviewed-by: jmasa
author ysr
date Sun, 16 Mar 2008 21:57:25 -0700
parents a61af66fc99e
children 5a76ab815e34
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // os defines the interface to operating system; this includes traditional
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // OS services (time, I/O) as well as other functionality with system-
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // dependent code.
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 typedef void (*dll_func)(...);
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class Thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class JavaThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class Event;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class DLL;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class FileHandle;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // %%%%% Moved ThreadState, START_FN, OSThread to new osThread.hpp. -- Rose
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Platform-independent error return values from OS functions
a61af66fc99e Initial load
duke
parents:
diff changeset
40 enum OSReturn {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 OS_OK = 0, // Operation was successful
a61af66fc99e Initial load
duke
parents:
diff changeset
42 OS_ERR = -1, // Operation failed
a61af66fc99e Initial load
duke
parents:
diff changeset
43 OS_INTRPT = -2, // Operation was interrupted
a61af66fc99e Initial load
duke
parents:
diff changeset
44 OS_TIMEOUT = -3, // Operation timed out
a61af66fc99e Initial load
duke
parents:
diff changeset
45 OS_NOMEM = -5, // Operation failed for lack of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
46 OS_NORESOURCE = -6 // Operation failed for lack of nonmemory resource
a61af66fc99e Initial load
duke
parents:
diff changeset
47 };
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 enum ThreadPriority { // JLS 20.20.1-3
a61af66fc99e Initial load
duke
parents:
diff changeset
50 NoPriority = -1, // Initial non-priority value
a61af66fc99e Initial load
duke
parents:
diff changeset
51 MinPriority = 1, // Minimum priority
a61af66fc99e Initial load
duke
parents:
diff changeset
52 NormPriority = 5, // Normal (non-daemon) priority
a61af66fc99e Initial load
duke
parents:
diff changeset
53 NearMaxPriority = 9, // High priority, used for VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
54 MaxPriority = 10 // Highest priority, used for WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // ensures that VMThread doesn't starve profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
56 };
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // Typedef for structured exception handling support
a61af66fc99e Initial load
duke
parents:
diff changeset
59 typedef void (*java_call_t)(JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class os: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
63 enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static OSThread* _starting_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static address _polling_page;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 static volatile int32_t * _mem_serialize_page;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static uintptr_t _serialize_page_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 static volatile jlong _global_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static volatile int _global_time_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static bool _use_global_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 static size_t _page_sizes[page_sizes_max];
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 static void init_page_sizes(size_t default_page_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _page_sizes[0] = default_page_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _page_sizes[1] = 0; // sentinel
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static void init(void); // Called before command line parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static jint init_2(void); // Called after command line parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // File names are case-insensitive on windows only
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Override me as needed
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static int file_name_strcmp(const char* s1, const char* s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static bool getenv(const char* name, char* buffer, int len);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 static bool have_special_privileges();
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 static jlong timeofday();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static void enable_global_time() { _use_global_time = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 static void disable_global_time() { _use_global_time = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 static jlong read_global_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 static void update_global_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static jlong javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 static jlong javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 static void javaTimeNanos_info(jvmtiTimerInfo *info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 static void run_periodic_checks();
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Returns the elapsed time in seconds since the vm started.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static double elapsedTime();
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Returns real time in seconds since an arbitrary point
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // in the past.
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static bool getTimesSecs(double* process_real_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
108 double* process_user_time,
a61af66fc99e Initial load
duke
parents:
diff changeset
109 double* process_system_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Interface to the performance counter
a61af66fc99e Initial load
duke
parents:
diff changeset
112 static jlong elapsed_counter();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static jlong elapsed_frequency();
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Return current local time in a string (YYYY-MM-DD HH:MM:SS).
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // It is MT safe, but not async-safe, as reading time zone
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // information may require a lock on some platforms.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 static char* local_time_string(char *buf, size_t buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Fill in buffer with current local time as an ISO-8601 string.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Returns buffer, or NULL if it failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 static char* iso8601_time(char* buffer, size_t buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Interface for detecting multiprocessor system
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static inline bool is_MP() {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(_processor_count > 0, "invalid processor count");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 return _processor_count > 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 static julong available_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
130 static julong physical_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
131 static julong allocatable_physical_memory(julong size);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 static bool is_server_class_machine();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // number of CPUs
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static int processor_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 return _processor_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Returns the number of CPUs this process is currently allowed to run on.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Note that on some OSes this can change dynamically.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 static int active_processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Bind processes to processors.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // This is a two step procedure:
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // first you generate a distribution of processes to processors,
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // then you bind processes according to that distribution.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Compute a distribution for number of processes to processors.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Stores the processor id's into the distribution array argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Returns true if it worked, false if it didn't.
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static bool distribute_processes(uint length, uint* distribution);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Binds the current process to a processor.
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Returns true if it worked, false if it didn't.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 static bool bind_to_processor(uint processor_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Interface for stack banging (predetect possible stack overflow for
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // exception processing) There are guard pages, and above that shadow
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // pages for stack overflow checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
158 static bool uses_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
159 static bool allocate_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 static void bang_stack_shadow_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 static bool stack_shadow_pages_available(Thread *thread, methodHandle method);
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // OS interface to Virtual Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Return the default page size.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 static int vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Return the page size to use for a region of memory. The min_pages argument
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // is a hint intended to limit fragmentation; it says the returned page size
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // should be <= region_max_size / min_pages. Because min_pages is a hint,
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // this routine may return a size larger than region_max_size / min_pages.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 //
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // The current implementation ignores min_pages if a larger page size is an
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // exact multiple of both region_min_size and region_max_size. This allows
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // larger pages to be used when doing so would not cause fragmentation; in
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // particular, a single page can be used when region_min_size ==
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // region_max_size == a supported page size.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 static size_t page_size_for_region(size_t region_min_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
179 size_t region_max_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
180 uint min_pages);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Method for tracing page sizes returned by the above method; enabled by
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // TracePageSizes. The region_{min,max}_size parameters should be the values
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // passed to page_size_for_region() and page_size should be the result of that
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // call. The (optional) base and size parameters should come from the
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // ReservedSpace base() and size() methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 static void trace_page_sizes(const char* str, const size_t region_min_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
188 const size_t region_max_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
189 const size_t page_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
190 const char* base = NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
191 const size_t size = 0) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 static int vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 static char* reserve_memory(size_t bytes, char* addr = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
195 size_t alignment_hint = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 static char* attempt_reserve_memory_at(size_t bytes, char* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 static void split_reserved_memory(char *base, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
198 size_t split, bool realloc);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 static bool commit_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 static bool commit_memory(char* addr, size_t size, size_t alignment_hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 static bool uncommit_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 static bool release_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 static bool protect_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 static bool guard_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 static bool unguard_memory(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 static char* map_memory(int fd, const char* file_name, size_t file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
207 char *addr, size_t bytes, bool read_only = false,
a61af66fc99e Initial load
duke
parents:
diff changeset
208 bool allow_exec = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 static char* remap_memory(int fd, const char* file_name, size_t file_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
210 char *addr, size_t bytes, bool read_only,
a61af66fc99e Initial load
duke
parents:
diff changeset
211 bool allow_exec);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 static bool unmap_memory(char *addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 static void free_memory(char *addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 static void realign_memory(char *addr, size_t bytes, size_t alignment_hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // NUMA-specific interface
a61af66fc99e Initial load
duke
parents:
diff changeset
217 static void numa_make_local(char *addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 static void numa_make_global(char *addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 static size_t numa_get_groups_num();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 static size_t numa_get_leaf_groups(int *ids, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 static bool numa_topology_changed();
a61af66fc99e Initial load
duke
parents:
diff changeset
222 static int numa_get_group_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Page manipulation
a61af66fc99e Initial load
duke
parents:
diff changeset
225 struct page_info {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 size_t size;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 int lgrp_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 };
a61af66fc99e Initial load
duke
parents:
diff changeset
229 static bool get_page_info(char *start, page_info* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 static char* scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found);
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 static char* non_memory_address_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // reserve, commit and pin the entire memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
234 static char* reserve_memory_special(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 static bool release_memory_special(char* addr, size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 static bool large_page_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 static size_t large_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 static bool can_commit_large_page_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // OS interface to polling page
a61af66fc99e Initial load
duke
parents:
diff changeset
241 static address get_polling_page() { return _polling_page; }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 static void set_polling_page(address page) { _polling_page = page; }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 static bool is_poll_address(address addr) { return addr >= _polling_page && addr < (_polling_page + os::vm_page_size()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static void make_polling_page_unreadable();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 static void make_polling_page_readable();
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Routines used to serialize the thread state without using membars
a61af66fc99e Initial load
duke
parents:
diff changeset
248 static void serialize_thread_states();
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Since we write to the serialize page from every thread, we
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // want stores to be on unique cache lines whenever possible
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // in order to minimize CPU cross talk. We pre-compute the
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // amount to shift the thread* to make this offset unique to
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // each thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
255 static int get_serialize_page_shift_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 return SerializePageShiftCount;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 static void set_serialize_page_mask(uintptr_t mask) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 _serialize_page_mask = mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 static unsigned int get_serialize_page_mask() {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 return _serialize_page_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 static void set_memory_serialize_page(address page);
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 static address get_memory_serialize_page() {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return (address)_mem_serialize_page;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 static inline void write_memory_serialize_page(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 uintptr_t page_offset = ((uintptr_t)thread >>
a61af66fc99e Initial load
duke
parents:
diff changeset
275 get_serialize_page_shift_count()) &
a61af66fc99e Initial load
duke
parents:
diff changeset
276 get_serialize_page_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 *(volatile int32_t *)((uintptr_t)_mem_serialize_page+page_offset) = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 static bool is_memory_serialize_page(JavaThread *thread, address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 address thr_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (UseMembar) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Calculate thread specific address
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (thread == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // TODO-FIXME: some platforms mask off faulting addresses to the base pagesize.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Instead of using a test for equality we should probably use something
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // of the form:
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // return ((_mem_serialize_page ^ addr) & -pagesize) == 0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 //
a61af66fc99e Initial load
duke
parents:
diff changeset
290 thr_addr = (address)(((uintptr_t)thread >>
a61af66fc99e Initial load
duke
parents:
diff changeset
291 get_serialize_page_shift_count()) &
a61af66fc99e Initial load
duke
parents:
diff changeset
292 get_serialize_page_mask()) + (uintptr_t)_mem_serialize_page;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 return (thr_addr == addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 static void block_on_serialize_page_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // threads
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 enum ThreadType {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 vm_thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
302 cgc_thread, // Concurrent GC thread
a61af66fc99e Initial load
duke
parents:
diff changeset
303 pgc_thread, // Parallel GC thread
a61af66fc99e Initial load
duke
parents:
diff changeset
304 java_thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
305 compiler_thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
306 watcher_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
307 };
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static bool create_thread(Thread* thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
310 ThreadType thr_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
311 size_t stack_size = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 static bool create_main_thread(JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 static bool create_attached_thread(JavaThread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static void pd_start_thread(Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static void start_thread(Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 static void initialize_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 static void free_thread(OSThread* osthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit
a61af66fc99e Initial load
duke
parents:
diff changeset
321 static intx current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
322 static int current_process_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // hpi::read for calls from non native state
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // For performance, hpi::read is only callable from _thread_in_native
a61af66fc99e Initial load
duke
parents:
diff changeset
325 static size_t read(int fd, void *buf, unsigned int nBytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 static int sleep(Thread* thread, jlong ms, bool interruptable);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 static int naked_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
328 static void infinite_sleep(); // never returns, use with CAUTION
a61af66fc99e Initial load
duke
parents:
diff changeset
329 static void yield(); // Yields to all threads with same priority
a61af66fc99e Initial load
duke
parents:
diff changeset
330 enum YieldResult {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 YIELD_SWITCHED = 1, // caller descheduled, other ready threads exist & ran
a61af66fc99e Initial load
duke
parents:
diff changeset
332 YIELD_NONEREADY = 0, // No other runnable/ready threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // platform-specific yield return immediately
a61af66fc99e Initial load
duke
parents:
diff changeset
334 YIELD_UNKNOWN = -1 // Unknown: platform doesn't support _SWITCHED or _NONEREADY
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // YIELD_SWITCHED and YIELD_NONREADY imply the platform supports a "strong"
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // yield that can be used in lieu of blocking.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } ;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 static YieldResult NakedYield () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 static void yield_all(int attempts = 0); // Yields to all other threads including lower priority
a61af66fc99e Initial load
duke
parents:
diff changeset
340 static void loop_breaker(int attempts); // called from within tight loops to possibly influence time-sharing
a61af66fc99e Initial load
duke
parents:
diff changeset
341 static OSReturn set_priority(Thread* thread, ThreadPriority priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 static OSReturn get_priority(const Thread* const thread, ThreadPriority& priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 static void interrupt(Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 static bool is_interrupted(Thread* thread, bool clear_interrupted);
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 static int pd_self_suspend_thread(Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 static ExtendedPC fetch_frame_from_context(void* ucVoid, intptr_t** sp, intptr_t** fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 static frame fetch_frame_from_context(void* ucVoid);
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 static ExtendedPC get_thread_pc(Thread *thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 static void breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 static address current_stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 static address current_stack_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 static size_t current_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 static int message_box(const char* title, const char* message);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 static char* do_you_want_to_debug(const char* message);
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // run cmd in a separate process and return its exit code; or -1 on failures
a61af66fc99e Initial load
duke
parents:
diff changeset
363 static int fork_and_exec(char *cmd);
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Set file to send error reports.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 static void set_error_file(const char *logfile);
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // os::exit() is merged with vm_exit()
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // static void exit(int num);
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // Terminate the VM, but don't exit the process
a61af66fc99e Initial load
duke
parents:
diff changeset
372 static void shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Terminate with an error. Default is to generate a core file on platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // that support such things. This calls shutdown() and then aborts.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 static void abort(bool dump_core = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Die immediately, no exit hook, no abort hook, no cleanup.
a61af66fc99e Initial load
duke
parents:
diff changeset
379 static void die();
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // Reading directories.
a61af66fc99e Initial load
duke
parents:
diff changeset
382 static DIR* opendir(const char* dirname);
a61af66fc99e Initial load
duke
parents:
diff changeset
383 static int readdir_buf_size(const char *path);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 static struct dirent* readdir(DIR* dirp, dirent* dbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 static int closedir(DIR* dirp);
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Dynamic library extension
a61af66fc99e Initial load
duke
parents:
diff changeset
388 static const char* dll_file_extension();
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 static const char* get_temp_directory();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static const char* get_current_directory(char *buf, int buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // Symbol lookup, find nearest function name; basically it implements
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // dladdr() for all platforms. Name of the nearest function is copied
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // to buf. Distance from its base address is returned as offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // If function name is not found, buf[0] is set to '\0' and offset is
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // set to -1.
a61af66fc99e Initial load
duke
parents:
diff changeset
398 static bool dll_address_to_function_name(address addr, char* buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
399 int buflen, int* offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Locate DLL/DSO. On success, full path of the library is copied to
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // buf, and offset is set to be the distance between addr and the
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // library's base address. On failure, buf[0] is set to '\0' and
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // offset is set to -1.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 static bool dll_address_to_library_name(address addr, char* buf,
a61af66fc99e Initial load
duke
parents:
diff changeset
406 int buflen, int* offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Find out whether the pc is in the static code for jvm.dll/libjvm.so.
a61af66fc99e Initial load
duke
parents:
diff changeset
409 static bool address_is_in_vm(address addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Loads .dll/.so and
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // in case of error it checks if .dll/.so was built for the
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // same architecture as Hotspot is running on
a61af66fc99e Initial load
duke
parents:
diff changeset
414 static void* dll_load(const char *name, char *ebuf, int ebuflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Print out system information; they are called by fatal error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Output format may be different on different platforms.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 static void print_os_info(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 static void print_cpu_info(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 static void print_memory_info(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 static void print_dll_info(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 static void print_environment_variables(outputStream* st, const char** env_list, char* buffer, int len);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 static void print_context(outputStream* st, void* context);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 static void print_siginfo(outputStream* st, void* siginfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
425 static void print_signal_handlers(outputStream* st, char* buf, size_t buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 static void print_date_and_time(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // The following two functions are used by fatal error handler to trace
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // native (C) frames. They are not part of frame.hpp/frame.cpp because
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // frame.hpp/cpp assume thread is JavaThread, and also because different
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // OS/compiler may have different convention or provide different API to
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // walk C frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
433 //
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // We don't attempt to become a debugger, so we only follow frames if that
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // does not require a lookup in the unwind table, which is part of the binary
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // file but may be unsafe to read after a fatal error. So on x86, we can
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // only walk stack if %ebp is used as frame pointer; on ia64, it's not
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // possible to walk C stack without having the unwind table.
a61af66fc99e Initial load
duke
parents:
diff changeset
439 static bool is_first_C_frame(frame *fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 static frame get_sender_for_C_frame(frame *fr);
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // return current frame. pc() and sp() are set to NULL on failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 static frame current_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 static void print_hex_dump(outputStream* st, address start, address end, int unitsize);
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // returns a string to describe the exception/signal;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // returns NULL if exception_code is not an OS exception/signal.
a61af66fc99e Initial load
duke
parents:
diff changeset
449 static const char* exception_name(int exception_code, char* buf, size_t buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // Returns native Java library, loads if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
452 static void* native_java_library();
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Fills in path to jvm.dll/libjvm.so (this info used to find hpi).
a61af66fc99e Initial load
duke
parents:
diff changeset
455 static void jvm_path(char *buf, jint buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // JNI names
a61af66fc99e Initial load
duke
parents:
diff changeset
458 static void print_jni_name_prefix_on(outputStream* st, int args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 static void print_jni_name_suffix_on(outputStream* st, int args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // File conventions
a61af66fc99e Initial load
duke
parents:
diff changeset
462 static const char* file_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 static const char* line_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
464 static const char* path_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Init os specific system properties values
a61af66fc99e Initial load
duke
parents:
diff changeset
467 static void init_system_properties_values();
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // IO operations, non-JVM_ version.
a61af66fc99e Initial load
duke
parents:
diff changeset
470 static int stat(const char* path, struct stat* sbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 static bool dir_is_empty(const char* path);
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // IO operations on binary files
a61af66fc99e Initial load
duke
parents:
diff changeset
474 static int create_binary_file(const char* path, bool rewrite_existing);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 static jlong current_file_offset(int fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 static jlong seek_to_file_offset(int fd, jlong offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // Thread Local Storage
a61af66fc99e Initial load
duke
parents:
diff changeset
479 static int allocate_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 static void thread_local_storage_at_put(int index, void* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 static void* thread_local_storage_at(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
482 static void free_thread_local_storage(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // General allocation (must be MT-safe)
a61af66fc99e Initial load
duke
parents:
diff changeset
485 static void* malloc (size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 static void* realloc (void *memblock, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 static void free (void *memblock);
a61af66fc99e Initial load
duke
parents:
diff changeset
488 static bool check_heap(bool force = false); // verify C heap integrity
a61af66fc99e Initial load
duke
parents:
diff changeset
489 static char* strdup(const char *); // Like strdup
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
492 static int num_mallocs; // # of calls to malloc/realloc
a61af66fc99e Initial load
duke
parents:
diff changeset
493 static size_t alloc_bytes; // # of bytes allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
494 static int num_frees; // # of calls to free
a61af66fc99e Initial load
duke
parents:
diff changeset
495 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // Printing 64 bit integers
a61af66fc99e Initial load
duke
parents:
diff changeset
498 static const char* jlong_format_specifier();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 static const char* julong_format_specifier();
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Support for signals (see JVM_RaiseSignal, JVM_RegisterSignal)
a61af66fc99e Initial load
duke
parents:
diff changeset
502 static void signal_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
503 static void signal_init_pd();
a61af66fc99e Initial load
duke
parents:
diff changeset
504 static void signal_notify(int signal_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 static void* signal(int signal_number, void* handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 static void signal_raise(int signal_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 static int signal_wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
508 static int signal_lookup();
a61af66fc99e Initial load
duke
parents:
diff changeset
509 static void* user_handler();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 static void terminate_signal_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
511 static int sigexitnum_pd();
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // random number generation
a61af66fc99e Initial load
duke
parents:
diff changeset
514 static long random(); // return 32bit pseudorandom number
a61af66fc99e Initial load
duke
parents:
diff changeset
515 static void init_random(long initval); // initialize random sequence
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Structured OS Exception support
a61af66fc99e Initial load
duke
parents:
diff changeset
518 static void os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // JVMTI & JVM monitoring and management support
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // The thread_cpu_time() and current_thread_cpu_time() are only
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // supported if is_thread_cpu_time_supported() returns true.
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // They are not supported on Solaris T1.
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Thread CPU Time - return the fast estimate on a platform
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // On Solaris - call gethrvtime (fast) - user time only
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // On Linux - fast clock_gettime where available - user+sys
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // - otherwise: very slow /proc fs - user+sys
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // On Windows - GetThreadTimes - user+sys
a61af66fc99e Initial load
duke
parents:
diff changeset
530 static jlong current_thread_cpu_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 static jlong thread_cpu_time(Thread* t);
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // Thread CPU Time with user_sys_cpu_time parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
534 //
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // If user_sys_cpu_time is true, user+sys time is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // Otherwise, only user time is returned
a61af66fc99e Initial load
duke
parents:
diff changeset
537 static jlong current_thread_cpu_time(bool user_sys_cpu_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
538 static jlong thread_cpu_time(Thread* t, bool user_sys_cpu_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // Return a bunch of info about the timers.
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // Note that the returned info for these two functions may be different
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // on some platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
543 static void current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 static void thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 static bool is_thread_cpu_time_supported();
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // System loadavg support. Returns -1 if load average cannot be obtained.
a61af66fc99e Initial load
duke
parents:
diff changeset
549 static int loadavg(double loadavg[], int nelem);
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // Hook for os specific jvm options that we don't want to abort on seeing
a61af66fc99e Initial load
duke
parents:
diff changeset
552 static bool obsolete_option(const JavaVMOption *option);
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Platform dependent stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
555 #include "incls/_os_pd.hpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // debugging support (mostly used by debug.cpp)
a61af66fc99e Initial load
duke
parents:
diff changeset
558 static bool find(address pc) PRODUCT_RETURN0; // OS specific function to make sense out of an address
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 static bool dont_yield(); // when true, JVM_Yield() is nop
a61af66fc99e Initial load
duke
parents:
diff changeset
561 static void print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Thread priority helpers (implemented in OS-specific part)
a61af66fc99e Initial load
duke
parents:
diff changeset
564 static OSReturn set_native_priority(Thread* thread, int native_prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 static OSReturn get_native_priority(const Thread* const thread, int* priority_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
566 static int java_to_os_priority[MaxPriority + 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Hint to the underlying OS that a task switch would not be good.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Void return because it's a hint and can fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
569 static void hint_no_preempt();
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // Used at creation if requested by the diagnostic flag PauseAtStartup.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // Causes the VM to wait until an external stimulus has been applied
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // (for Unix, that stimulus is a signal, for Windows, an external
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // ResumeThread call)
a61af66fc99e Initial load
duke
parents:
diff changeset
575 static void pause();
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 static long _rand_seed; // seed for random number generator
a61af66fc99e Initial load
duke
parents:
diff changeset
579 static int _processor_count; // number of processors
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 static char* format_boot_path(const char* format_string,
a61af66fc99e Initial load
duke
parents:
diff changeset
582 const char* home,
a61af66fc99e Initial load
duke
parents:
diff changeset
583 int home_len,
a61af66fc99e Initial load
duke
parents:
diff changeset
584 char fileSep,
a61af66fc99e Initial load
duke
parents:
diff changeset
585 char pathSep);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 static bool set_boot_path(char fileSep, char pathSep);
a61af66fc99e Initial load
duke
parents:
diff changeset
587 };
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // Note that "PAUSE" is almost always used with synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // so arguably we should provide Atomic::SpinPause() instead
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // of the global SpinPause() with C linkage.
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // It'd also be eligible for inlining on many platforms.
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 extern "C" int SpinPause () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 extern "C" int SafeFetch32 (int * adr, int errValue) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t errValue) ;