os.hpp revision 196:d1605aabd0a1
155714Skris/*
255714Skris * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
355714Skris * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
455714Skris *
555714Skris * This code is free software; you can redistribute it and/or modify it
655714Skris * under the terms of the GNU General Public License version 2 only, as
755714Skris * published by the Free Software Foundation.
8296465Sdelphij *
955714Skris * This code is distributed in the hope that it will be useful, but WITHOUT
1055714Skris * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1155714Skris * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1255714Skris * version 2 for more details (a copy is included in the LICENSE file that
1355714Skris * accompanied this code).
1455714Skris *
15296465Sdelphij * You should have received a copy of the GNU General Public License version
1655714Skris * 2 along with this work; if not, write to the Free Software Foundation,
1755714Skris * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1855714Skris *
1955714Skris * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
2055714Skris * CA 95054 USA or visit www.sun.com if you need additional information or
2155714Skris * have any questions.
22296465Sdelphij *
2355714Skris */
2455714Skris
2555714Skris// os defines the interface to operating system; this includes traditional
2655714Skris// OS services (time, I/O) as well as other functionality with system-
2755714Skris// dependent code.
2855714Skris
2955714Skristypedef void (*dll_func)(...);
3055714Skris
3155714Skrisclass Thread;
3255714Skrisclass JavaThread;
3355714Skrisclass Event;
3455714Skrisclass DLL;
3555714Skrisclass FileHandle;
3655714Skristemplate<class E> class GrowableArray;
37296465Sdelphij
3855714Skris// %%%%% Moved ThreadState, START_FN, OSThread to new osThread.hpp. -- Rose
3955714Skris
40296465Sdelphij// Platform-independent error return values from OS functions
4155714Skrisenum OSReturn {
4255714Skris  OS_OK         =  0,        // Operation was successful
4355714Skris  OS_ERR        = -1,        // Operation failed
4455714Skris  OS_INTRPT     = -2,        // Operation was interrupted
4555714Skris  OS_TIMEOUT    = -3,        // Operation timed out
4655714Skris  OS_NOMEM      = -5,        // Operation failed for lack of memory
4755714Skris  OS_NORESOURCE = -6         // Operation failed for lack of nonmemory resource
4855714Skris};
4955714Skris
5055714Skrisenum ThreadPriority {        // JLS 20.20.1-3
5155714Skris  NoPriority       = -1,     // Initial non-priority value
52296465Sdelphij  MinPriority      =  1,     // Minimum priority
5355714Skris  NormPriority     =  5,     // Normal (non-daemon) priority
5455714Skris  NearMaxPriority  =  9,     // High priority, used for VMThread
5555714Skris  MaxPriority      = 10      // Highest priority, used for WatcherThread
5655714Skris                             // ensures that VMThread doesn't starve profiler
5755714Skris};
5855714Skris
5955714Skris// Typedef for structured exception handling support
6055714Skristypedef void (*java_call_t)(JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
6155714Skris
62296465Sdelphijclass os: AllStatic {
63296465Sdelphij private:
64296465Sdelphij  enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
65296465Sdelphij
6655714Skris  static OSThread*          _starting_thread;
6755714Skris  static address            _polling_page;
6855714Skris  static volatile int32_t * _mem_serialize_page;
69296465Sdelphij  static uintptr_t          _serialize_page_mask;
7055714Skris  static size_t             _page_sizes[page_sizes_max];
7155714Skris
7255714Skris  static void init_page_sizes(size_t default_page_size) {
7359191Skris    _page_sizes[0] = default_page_size;
74296465Sdelphij    _page_sizes[1] = 0; // sentinel
7555714Skris  }
76296465Sdelphij
77296465Sdelphij public:
7855714Skris
79296465Sdelphij  static void init(void);                       // Called before command line parsing
80296465Sdelphij  static jint init_2(void);                    // Called after command line parsing
81296465Sdelphij
82296465Sdelphij  // File names are case-insensitive on windows only
8355714Skris  // Override me as needed
84296465Sdelphij  static int    file_name_strcmp(const char* s1, const char* s2);
85296465Sdelphij
86296465Sdelphij  static bool getenv(const char* name, char* buffer, int len);
87296465Sdelphij  static bool have_special_privileges();
88296465Sdelphij
89296465Sdelphij  static jlong  javaTimeMillis();
90296465Sdelphij  static jlong  javaTimeNanos();
91296465Sdelphij  static void   javaTimeNanos_info(jvmtiTimerInfo *info_ptr);
92296465Sdelphij  static void   run_periodic_checks();
93296465Sdelphij
94296465Sdelphij
95296465Sdelphij  // Returns the elapsed time in seconds since the vm started.
96296465Sdelphij  static double elapsedTime();
97296465Sdelphij
98296465Sdelphij  // Returns real time in seconds since an arbitrary point
99296465Sdelphij  // in the past.
100296465Sdelphij  static bool getTimesSecs(double* process_real_time,
101296465Sdelphij                           double* process_user_time,
102296465Sdelphij                           double* process_system_time);
103296465Sdelphij
104296465Sdelphij  // Interface to the performance counter
105296465Sdelphij  static jlong elapsed_counter();
106296465Sdelphij  static jlong elapsed_frequency();
107296465Sdelphij
10855714Skris  // Return current local time in a string (YYYY-MM-DD HH:MM:SS).
109296465Sdelphij  // It is MT safe, but not async-safe, as reading time zone
110296465Sdelphij  // information may require a lock on some platforms.
11155714Skris  static char* local_time_string(char *buf, size_t buflen);
112296465Sdelphij  // Fill in buffer with current local time as an ISO-8601 string.
11355714Skris  // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
114296465Sdelphij  // Returns buffer, or NULL if it failed.
115296465Sdelphij  static char* iso8601_time(char* buffer, size_t buffer_length);
116296465Sdelphij
11755714Skris  // Interface for detecting multiprocessor system
118296465Sdelphij  static inline bool is_MP() {
119296465Sdelphij    assert(_processor_count > 0, "invalid processor count");
120296465Sdelphij    return _processor_count > 1;
121296465Sdelphij  }
122296465Sdelphij  static julong available_memory();
123296465Sdelphij  static julong physical_memory();
124296465Sdelphij  static julong allocatable_physical_memory(julong size);
125296465Sdelphij  static bool is_server_class_machine();
126296465Sdelphij
127296465Sdelphij  // number of CPUs
128296465Sdelphij  static int processor_count() {
129296465Sdelphij    return _processor_count;
130296465Sdelphij  }
131296465Sdelphij
132296465Sdelphij  // Returns the number of CPUs this process is currently allowed to run on.
133296465Sdelphij  // Note that on some OSes this can change dynamically.
134296465Sdelphij  static int active_processor_count();
135296465Sdelphij
136296465Sdelphij  // Bind processes to processors.
137296465Sdelphij  //     This is a two step procedure:
138296465Sdelphij  //     first you generate a distribution of processes to processors,
139296465Sdelphij  //     then you bind processes according to that distribution.
140296465Sdelphij  // Compute a distribution for number of processes to processors.
141296465Sdelphij  //    Stores the processor id's into the distribution array argument.
14255714Skris  //    Returns true if it worked, false if it didn't.
143296465Sdelphij  static bool distribute_processes(uint length, uint* distribution);
144296465Sdelphij  // Binds the current process to a processor.
14555714Skris  //    Returns true if it worked, false if it didn't.
146296465Sdelphij  static bool bind_to_processor(uint processor_id);
14755714Skris
14855714Skris  // Interface for stack banging (predetect possible stack overflow for
14955714Skris  // exception processing)  There are guard pages, and above that shadow
15059191Skris  // pages for stack overflow checking.
151296465Sdelphij  static bool uses_stack_guard_pages();
152296465Sdelphij  static bool allocate_stack_guard_pages();
153296465Sdelphij  static void bang_stack_shadow_pages();
154296465Sdelphij  static bool stack_shadow_pages_available(Thread *thread, methodHandle method);
15555714Skris
156296465Sdelphij  // OS interface to Virtual Memory
157296465Sdelphij
158296465Sdelphij  // Return the default page size.
159296465Sdelphij  static int    vm_page_size();
16055714Skris
161296465Sdelphij  // Return the page size to use for a region of memory.  The min_pages argument
162296465Sdelphij  // is a hint intended to limit fragmentation; it says the returned page size
163296465Sdelphij  // should be <= region_max_size / min_pages.  Because min_pages is a hint,
164296465Sdelphij  // this routine may return a size larger than region_max_size / min_pages.
165296465Sdelphij  //
166296465Sdelphij  // The current implementation ignores min_pages if a larger page size is an
167296465Sdelphij  // exact multiple of both region_min_size and region_max_size.  This allows
168296465Sdelphij  // larger pages to be used when doing so would not cause fragmentation; in
169296465Sdelphij  // particular, a single page can be used when region_min_size ==
170296465Sdelphij  // region_max_size == a supported page size.
171296465Sdelphij  static size_t page_size_for_region(size_t region_min_size,
172296465Sdelphij                                     size_t region_max_size,
173296465Sdelphij                                     uint min_pages);
174296465Sdelphij
175296465Sdelphij  // Method for tracing page sizes returned by the above method; enabled by
176296465Sdelphij  // TracePageSizes.  The region_{min,max}_size parameters should be the values
177296465Sdelphij  // passed to page_size_for_region() and page_size should be the result of that
178296465Sdelphij  // call.  The (optional) base and size parameters should come from the
179296465Sdelphij  // ReservedSpace base() and size() methods.
180296465Sdelphij  static void trace_page_sizes(const char* str, const size_t region_min_size,
181296465Sdelphij                               const size_t region_max_size,
182296465Sdelphij                               const size_t page_size,
183296465Sdelphij                               const char* base = NULL,
184296465Sdelphij                               const size_t size = 0) PRODUCT_RETURN;
18555714Skris
186296465Sdelphij  static int    vm_allocation_granularity();
187296465Sdelphij  static char*  reserve_memory(size_t bytes, char* addr = 0,
188296465Sdelphij                               size_t alignment_hint = 0);
189296465Sdelphij  static char*  attempt_reserve_memory_at(size_t bytes, char* addr);
19055714Skris  static void   split_reserved_memory(char *base, size_t size,
191296465Sdelphij                                      size_t split, bool realloc);
192296465Sdelphij  static bool   commit_memory(char* addr, size_t bytes);
193296465Sdelphij  static bool   commit_memory(char* addr, size_t size, size_t alignment_hint);
19455714Skris  static bool   uncommit_memory(char* addr, size_t bytes);
195296465Sdelphij  static bool   release_memory(char* addr, size_t bytes);
196296465Sdelphij  static bool   protect_memory(char* addr, size_t bytes);
197296465Sdelphij  static bool   guard_memory(char* addr, size_t bytes);
198296465Sdelphij  static bool   unguard_memory(char* addr, size_t bytes);
199296465Sdelphij  static char*  map_memory(int fd, const char* file_name, size_t file_offset,
200296465Sdelphij                           char *addr, size_t bytes, bool read_only = false,
201296465Sdelphij                           bool allow_exec = false);
202296465Sdelphij  static char*  remap_memory(int fd, const char* file_name, size_t file_offset,
203296465Sdelphij                             char *addr, size_t bytes, bool read_only,
204296465Sdelphij                             bool allow_exec);
205296465Sdelphij  static bool   unmap_memory(char *addr, size_t bytes);
206296465Sdelphij  static void   free_memory(char *addr, size_t bytes);
207296465Sdelphij  static void   realign_memory(char *addr, size_t bytes, size_t alignment_hint);
208296465Sdelphij
209296465Sdelphij  // NUMA-specific interface
210296465Sdelphij  static bool   numa_has_static_binding();
211296465Sdelphij  static bool   numa_has_group_homing();
212296465Sdelphij  static void   numa_make_local(char *addr, size_t bytes, int lgrp_hint);
213296465Sdelphij  static void   numa_make_global(char *addr, size_t bytes);
214296465Sdelphij  static size_t numa_get_groups_num();
215296465Sdelphij  static size_t numa_get_leaf_groups(int *ids, size_t size);
216296465Sdelphij  static bool   numa_topology_changed();
217296465Sdelphij  static int    numa_get_group_id();
218296465Sdelphij
21955714Skris  // Page manipulation
220296465Sdelphij  struct page_info {
221296465Sdelphij    size_t size;
222296465Sdelphij    int lgrp_id;
223296465Sdelphij  };
22455714Skris  static bool   get_page_info(char *start, page_info* info);
22559191Skris  static char*  scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found);
226296465Sdelphij
227296465Sdelphij  static char*  non_memory_address_word();
228296465Sdelphij  // reserve, commit and pin the entire memory region
229296465Sdelphij  static char*  reserve_memory_special(size_t size);
230296465Sdelphij  static bool   release_memory_special(char* addr, size_t bytes);
231296465Sdelphij  static bool   large_page_init();
23255714Skris  static size_t large_page_size();
233296465Sdelphij  static bool   can_commit_large_page_memory();
234296465Sdelphij  static bool   can_execute_large_page_memory();
235296465Sdelphij
236296465Sdelphij  // OS interface to polling page
237296465Sdelphij  static address get_polling_page()             { return _polling_page; }
238296465Sdelphij  static void    set_polling_page(address page) { _polling_page = page; }
239296465Sdelphij  static bool    is_poll_address(address addr)  { return addr >= _polling_page && addr < (_polling_page + os::vm_page_size()); }
240296465Sdelphij  static void    make_polling_page_unreadable();
241296465Sdelphij  static void    make_polling_page_readable();
242296465Sdelphij
243296465Sdelphij  // Routines used to serialize the thread state without using membars
244296465Sdelphij  static void    serialize_thread_states();
245296465Sdelphij
246296465Sdelphij  // Since we write to the serialize page from every thread, we
247296465Sdelphij  // want stores to be on unique cache lines whenever possible
248296465Sdelphij  // in order to minimize CPU cross talk.  We pre-compute the
249296465Sdelphij  // amount to shift the thread* to make this offset unique to
250296465Sdelphij  // each thread.
251296465Sdelphij  static int     get_serialize_page_shift_count() {
252296465Sdelphij    return SerializePageShiftCount;
253296465Sdelphij  }
254296465Sdelphij
255296465Sdelphij  static void     set_serialize_page_mask(uintptr_t mask) {
256296465Sdelphij    _serialize_page_mask = mask;
257296465Sdelphij  }
258296465Sdelphij
259296465Sdelphij  static unsigned int  get_serialize_page_mask() {
260296465Sdelphij    return _serialize_page_mask;
261296465Sdelphij  }
262296465Sdelphij
263296465Sdelphij  static void    set_memory_serialize_page(address page);
264296465Sdelphij
265296465Sdelphij  static address get_memory_serialize_page() {
266296465Sdelphij    return (address)_mem_serialize_page;
267296465Sdelphij  }
268296465Sdelphij
269296465Sdelphij  static inline void write_memory_serialize_page(JavaThread *thread) {
270296465Sdelphij    uintptr_t page_offset = ((uintptr_t)thread >>
271296465Sdelphij                            get_serialize_page_shift_count()) &
272296465Sdelphij                            get_serialize_page_mask();
273296465Sdelphij    *(volatile int32_t *)((uintptr_t)_mem_serialize_page+page_offset) = 1;
274296465Sdelphij  }
275296465Sdelphij
276296465Sdelphij  static bool    is_memory_serialize_page(JavaThread *thread, address addr) {
277296465Sdelphij    address thr_addr;
278296465Sdelphij    if (UseMembar) return false;
279296465Sdelphij    // Calculate thread specific address
280296465Sdelphij    if (thread == NULL) return false;
281296465Sdelphij    // TODO-FIXME: some platforms mask off faulting addresses to the base pagesize.
282296465Sdelphij    // Instead of using a test for equality we should probably use something
283296465Sdelphij    // of the form:
284296465Sdelphij    // return ((_mem_serialize_page ^ addr) & -pagesize) == 0
285296465Sdelphij    //
286296465Sdelphij    thr_addr  = (address)(((uintptr_t)thread >>
287296465Sdelphij                get_serialize_page_shift_count()) &
288296465Sdelphij                get_serialize_page_mask()) + (uintptr_t)_mem_serialize_page;
289296465Sdelphij    return  (thr_addr == addr);
290296465Sdelphij  }
291296465Sdelphij
292296465Sdelphij  static void block_on_serialize_page_trap();
293296465Sdelphij
294296465Sdelphij  // threads
295296465Sdelphij
296296465Sdelphij  enum ThreadType {
297296465Sdelphij    vm_thread,
298296465Sdelphij    cgc_thread,        // Concurrent GC thread
29955714Skris    pgc_thread,        // Parallel GC thread
30055714Skris    java_thread,
301    compiler_thread,
302    watcher_thread
303  };
304
305  static bool create_thread(Thread* thread,
306                            ThreadType thr_type,
307                            size_t stack_size = 0);
308  static bool create_main_thread(JavaThread* thread);
309  static bool create_attached_thread(JavaThread* thread);
310  static void pd_start_thread(Thread* thread);
311  static void start_thread(Thread* thread);
312
313  static void initialize_thread();
314  static void free_thread(OSThread* osthread);
315
316  // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit
317  static intx current_thread_id();
318  static int current_process_id();
319  // hpi::read for calls from non native state
320  // For performance, hpi::read is only callable from _thread_in_native
321  static size_t read(int fd, void *buf, unsigned int nBytes);
322  static int sleep(Thread* thread, jlong ms, bool interruptable);
323  static int naked_sleep();
324  static void infinite_sleep(); // never returns, use with CAUTION
325  static void yield();        // Yields to all threads with same priority
326  enum YieldResult {
327    YIELD_SWITCHED = 1,         // caller descheduled, other ready threads exist & ran
328    YIELD_NONEREADY = 0,        // No other runnable/ready threads.
329                                // platform-specific yield return immediately
330    YIELD_UNKNOWN = -1          // Unknown: platform doesn't support _SWITCHED or _NONEREADY
331    // YIELD_SWITCHED and YIELD_NONREADY imply the platform supports a "strong"
332    // yield that can be used in lieu of blocking.
333  } ;
334  static YieldResult NakedYield () ;
335  static void yield_all(int attempts = 0); // Yields to all other threads including lower priority
336  static void loop_breaker(int attempts);  // called from within tight loops to possibly influence time-sharing
337  static OSReturn set_priority(Thread* thread, ThreadPriority priority);
338  static OSReturn get_priority(const Thread* const thread, ThreadPriority& priority);
339
340  static void interrupt(Thread* thread);
341  static bool is_interrupted(Thread* thread, bool clear_interrupted);
342
343  static int pd_self_suspend_thread(Thread* thread);
344
345  static ExtendedPC fetch_frame_from_context(void* ucVoid, intptr_t** sp, intptr_t** fp);
346  static frame      fetch_frame_from_context(void* ucVoid);
347
348  static ExtendedPC get_thread_pc(Thread *thread);
349  static void breakpoint();
350
351  static address current_stack_pointer();
352  static address current_stack_base();
353  static size_t current_stack_size();
354
355  static int message_box(const char* title, const char* message);
356  static char* do_you_want_to_debug(const char* message);
357
358  // run cmd in a separate process and return its exit code; or -1 on failures
359  static int fork_and_exec(char *cmd);
360
361  // Set file to send error reports.
362  static void set_error_file(const char *logfile);
363
364  // os::exit() is merged with vm_exit()
365  // static void exit(int num);
366
367  // Terminate the VM, but don't exit the process
368  static void shutdown();
369
370  // Terminate with an error.  Default is to generate a core file on platforms
371  // that support such things.  This calls shutdown() and then aborts.
372  static void abort(bool dump_core = true);
373
374  // Die immediately, no exit hook, no abort hook, no cleanup.
375  static void die();
376
377  // Reading directories.
378  static DIR*           opendir(const char* dirname);
379  static int            readdir_buf_size(const char *path);
380  static struct dirent* readdir(DIR* dirp, dirent* dbuf);
381  static int            closedir(DIR* dirp);
382
383  // Dynamic library extension
384  static const char*    dll_file_extension();
385
386  static const char*    get_temp_directory();
387  static const char*    get_current_directory(char *buf, int buflen);
388
389  // Symbol lookup, find nearest function name; basically it implements
390  // dladdr() for all platforms. Name of the nearest function is copied
391  // to buf. Distance from its base address is returned as offset.
392  // If function name is not found, buf[0] is set to '\0' and offset is
393  // set to -1.
394  static bool dll_address_to_function_name(address addr, char* buf,
395                                           int buflen, int* offset);
396
397  // Locate DLL/DSO. On success, full path of the library is copied to
398  // buf, and offset is set to be the distance between addr and the
399  // library's base address. On failure, buf[0] is set to '\0' and
400  // offset is set to -1.
401  static bool dll_address_to_library_name(address addr, char* buf,
402                                          int buflen, int* offset);
403
404  // Find out whether the pc is in the static code for jvm.dll/libjvm.so.
405  static bool address_is_in_vm(address addr);
406
407  // Loads .dll/.so and
408  // in case of error it checks if .dll/.so was built for the
409  // same architecture as Hotspot is running on
410  static void* dll_load(const char *name, char *ebuf, int ebuflen);
411
412  // Print out system information; they are called by fatal error handler.
413  // Output format may be different on different platforms.
414  static void print_os_info(outputStream* st);
415  static void print_cpu_info(outputStream* st);
416  static void print_memory_info(outputStream* st);
417  static void print_dll_info(outputStream* st);
418  static void print_environment_variables(outputStream* st, const char** env_list, char* buffer, int len);
419  static void print_context(outputStream* st, void* context);
420  static void print_siginfo(outputStream* st, void* siginfo);
421  static void print_signal_handlers(outputStream* st, char* buf, size_t buflen);
422  static void print_date_and_time(outputStream* st);
423
424  // The following two functions are used by fatal error handler to trace
425  // native (C) frames. They are not part of frame.hpp/frame.cpp because
426  // frame.hpp/cpp assume thread is JavaThread, and also because different
427  // OS/compiler may have different convention or provide different API to
428  // walk C frames.
429  //
430  // We don't attempt to become a debugger, so we only follow frames if that
431  // does not require a lookup in the unwind table, which is part of the binary
432  // file but may be unsafe to read after a fatal error. So on x86, we can
433  // only walk stack if %ebp is used as frame pointer; on ia64, it's not
434  // possible to walk C stack without having the unwind table.
435  static bool is_first_C_frame(frame *fr);
436  static frame get_sender_for_C_frame(frame *fr);
437
438  // return current frame. pc() and sp() are set to NULL on failure.
439  static frame      current_frame();
440
441  static void print_hex_dump(outputStream* st, address start, address end, int unitsize);
442
443  // returns a string to describe the exception/signal;
444  // returns NULL if exception_code is not an OS exception/signal.
445  static const char* exception_name(int exception_code, char* buf, size_t buflen);
446
447  // Returns native Java library, loads if necessary
448  static void*    native_java_library();
449
450  // Fills in path to jvm.dll/libjvm.so (this info used to find hpi).
451  static void     jvm_path(char *buf, jint buflen);
452
453  // JNI names
454  static void     print_jni_name_prefix_on(outputStream* st, int args_size);
455  static void     print_jni_name_suffix_on(outputStream* st, int args_size);
456
457  // File conventions
458  static const char* file_separator();
459  static const char* line_separator();
460  static const char* path_separator();
461
462  // Init os specific system properties values
463  static void init_system_properties_values();
464
465  // IO operations, non-JVM_ version.
466  static int stat(const char* path, struct stat* sbuf);
467  static bool dir_is_empty(const char* path);
468
469  // IO operations on binary files
470  static int create_binary_file(const char* path, bool rewrite_existing);
471  static jlong current_file_offset(int fd);
472  static jlong seek_to_file_offset(int fd, jlong offset);
473
474  // Thread Local Storage
475  static int   allocate_thread_local_storage();
476  static void  thread_local_storage_at_put(int index, void* value);
477  static void* thread_local_storage_at(int index);
478  static void  free_thread_local_storage(int index);
479
480  // General allocation (must be MT-safe)
481  static void* malloc  (size_t size);
482  static void* realloc (void *memblock, size_t size);
483  static void  free    (void *memblock);
484  static bool  check_heap(bool force = false);      // verify C heap integrity
485  static char* strdup(const char *);  // Like strdup
486
487#ifndef PRODUCT
488  static int  num_mallocs;            // # of calls to malloc/realloc
489  static size_t  alloc_bytes;         // # of bytes allocated
490  static int  num_frees;              // # of calls to free
491#endif
492
493  // Printing 64 bit integers
494  static const char* jlong_format_specifier();
495  static const char* julong_format_specifier();
496
497  // Support for signals (see JVM_RaiseSignal, JVM_RegisterSignal)
498  static void  signal_init();
499  static void  signal_init_pd();
500  static void  signal_notify(int signal_number);
501  static void* signal(int signal_number, void* handler);
502  static void  signal_raise(int signal_number);
503  static int   signal_wait();
504  static int   signal_lookup();
505  static void* user_handler();
506  static void  terminate_signal_thread();
507  static int   sigexitnum_pd();
508
509  // random number generation
510  static long random();                    // return 32bit pseudorandom number
511  static void init_random(long initval);   // initialize random sequence
512
513  // Structured OS Exception support
514  static void os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
515
516  // JVMTI & JVM monitoring and management support
517  // The thread_cpu_time() and current_thread_cpu_time() are only
518  // supported if is_thread_cpu_time_supported() returns true.
519  // They are not supported on Solaris T1.
520
521  // Thread CPU Time - return the fast estimate on a platform
522  // On Solaris - call gethrvtime (fast) - user time only
523  // On Linux   - fast clock_gettime where available - user+sys
524  //            - otherwise: very slow /proc fs - user+sys
525  // On Windows - GetThreadTimes - user+sys
526  static jlong current_thread_cpu_time();
527  static jlong thread_cpu_time(Thread* t);
528
529  // Thread CPU Time with user_sys_cpu_time parameter.
530  //
531  // If user_sys_cpu_time is true, user+sys time is returned.
532  // Otherwise, only user time is returned
533  static jlong current_thread_cpu_time(bool user_sys_cpu_time);
534  static jlong thread_cpu_time(Thread* t, bool user_sys_cpu_time);
535
536  // Return a bunch of info about the timers.
537  // Note that the returned info for these two functions may be different
538  // on some platforms
539  static void current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
540  static void thread_cpu_time_info(jvmtiTimerInfo *info_ptr);
541
542  static bool is_thread_cpu_time_supported();
543
544  // System loadavg support.  Returns -1 if load average cannot be obtained.
545  static int loadavg(double loadavg[], int nelem);
546
547  // Hook for os specific jvm options that we don't want to abort on seeing
548  static bool obsolete_option(const JavaVMOption *option);
549
550  // Platform dependent stuff
551  #include "incls/_os_pd.hpp.incl"
552
553  // debugging support (mostly used by debug.cpp)
554  static bool find(address pc) PRODUCT_RETURN0; // OS specific function to make sense out of an address
555
556  static bool dont_yield();                     // when true, JVM_Yield() is nop
557  static void print_statistics();
558
559  // Thread priority helpers (implemented in OS-specific part)
560  static OSReturn set_native_priority(Thread* thread, int native_prio);
561  static OSReturn get_native_priority(const Thread* const thread, int* priority_ptr);
562  static int java_to_os_priority[MaxPriority + 1];
563  // Hint to the underlying OS that a task switch would not be good.
564  // Void return because it's a hint and can fail.
565  static void hint_no_preempt();
566
567  // Used at creation if requested by the diagnostic flag PauseAtStartup.
568  // Causes the VM to wait until an external stimulus has been applied
569  // (for Unix, that stimulus is a signal, for Windows, an external
570  // ResumeThread call)
571  static void pause();
572
573 protected:
574  static long _rand_seed;                   // seed for random number generator
575  static int _processor_count;              // number of processors
576
577  static char* format_boot_path(const char* format_string,
578                                const char* home,
579                                int home_len,
580                                char fileSep,
581                                char pathSep);
582  static bool set_boot_path(char fileSep, char pathSep);
583};
584
585// Note that "PAUSE" is almost always used with synchronization
586// so arguably we should provide Atomic::SpinPause() instead
587// of the global SpinPause() with C linkage.
588// It'd also be eligible for inlining on many platforms.
589
590extern "C" int SpinPause () ;
591extern "C" int SafeFetch32 (int * adr, int errValue) ;
592extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t errValue) ;
593