1 /* 2 * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef OS_WINDOWS_VM_OS_WINDOWS_HPP 26 #define OS_WINDOWS_VM_OS_WINDOWS_HPP 27 // Win32_OS defines the interface to windows operating systems 28 29 // Information about the protection of the page at address '0' on this os. 30 static bool zero_page_read_protected() { return true; } 31 32 // File conventions 33 static const char* file_separator() { return "\\"; } 34 static const char* line_separator() { return "\r\n"; } 35 static const char* path_separator() { return ";"; } 36 37 class win32 { 38 friend class os; 39 friend unsigned __stdcall thread_native_entry(class Thread*); 40 41 protected: 42 static int _vm_page_size; 43 static int _vm_allocation_granularity; 44 static int _processor_type; 45 static int _processor_level; 46 static julong _physical_memory; 47 static size_t _default_stack_size; 48 static bool _is_windows_server; 49 static bool _has_exit_bug; 50 51 static void print_windows_version(outputStream* st); 52 53 public: 54 // Windows-specific interface: 55 static void initialize_system_info(); 56 static void setmode_streams(); 57 58 // Processor info as provided by NT 59 static int processor_type() { return _processor_type; } 60 static int processor_level() { 61 return _processor_level; 62 } 63 static julong available_memory(); 64 static julong physical_memory() { return _physical_memory; } 65 66 // load dll from Windows system directory or Windows directory 67 static HINSTANCE load_Windows_dll(const char* name, char *ebuf, int ebuflen); 68 69 private: 70 enum Ept { EPT_THREAD, EPT_PROCESS, EPT_PROCESS_DIE }; 71 // Wrapper around _endthreadex(), exit() and _exit() 72 static int exit_process_or_thread(Ept what, int exit_code); 73 74 static void initialize_performance_counter(); 75 76 public: 77 // Generic interface: 78 79 // Trace number of created threads 80 static intx _os_thread_limit; 81 static volatile intx _os_thread_count; 82 83 // Tells whether this is a server version of Windows 84 static bool is_windows_server() { return _is_windows_server; } 85 86 // Tells whether there can be the race bug during process exit on this platform 87 static bool has_exit_bug() { return _has_exit_bug; } 88 89 // Returns the byte size of a virtual memory page 90 static int vm_page_size() { return _vm_page_size; } 91 92 // Returns the size in bytes of memory blocks which can be allocated. 93 static int vm_allocation_granularity() { return _vm_allocation_granularity; } 94 95 // Read the headers for the executable that started the current process into 96 // the structure passed in (see winnt.h). 97 static void read_executable_headers(PIMAGE_NT_HEADERS); 98 99 // Default stack size for the current process. 100 static size_t default_stack_size() { return _default_stack_size; } 101 102 static bool get_frame_at_stack_banging_point(JavaThread* thread, 103 struct _EXCEPTION_POINTERS* exceptionInfo, 104 address pc, frame* fr); 105 106 #ifndef _WIN64 107 // A wrapper to install a structured exception handler for fast JNI accesors. 108 static address fast_jni_accessor_wrapper(BasicType); 109 #endif 110 111 // filter function to ignore faults on serializations page 112 static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e); 113 114 // Fast access to current thread 115 protected: 116 static int _thread_ptr_offset; 117 private: 118 static void initialize_thread_ptr_offset(); 119 public: 120 static inline void set_thread_ptr_offset(int offset) { 121 _thread_ptr_offset = offset; 122 } 123 static inline int get_thread_ptr_offset() { return _thread_ptr_offset; } 124 }; 125 126 /* 127 * Crash protection for the watcher thread. Wrap the callback 128 * with a __try { call() } 129 * To be able to use this - don't take locks, don't rely on destructors, 130 * don't make OS library calls, don't allocate memory, don't print, 131 * don't call code that could leave the heap / memory in an inconsistent state, 132 * or anything else where we are not in control if we suddenly jump out. 133 */ 134 class WatcherThreadCrashProtection : public StackObj { 135 public: 136 WatcherThreadCrashProtection(); 137 bool call(os::CrashProtectionCallback& cb); 138 }; 139 140 class PlatformEvent : public CHeapObj<mtInternal> { 141 private: 142 double CachePad [4] ; // increase odds that _Event is sole occupant of cache line 143 volatile int _Event ; 144 HANDLE _ParkHandle ; 145 146 public: // TODO-FIXME: make dtor private 147 ~PlatformEvent() { guarantee (0, "invariant") ; } 148 149 public: 150 PlatformEvent() { 151 _Event = 0 ; 152 _ParkHandle = CreateEvent (NULL, false, false, NULL) ; 153 guarantee (_ParkHandle != NULL, "invariant") ; 154 } 155 156 // Exercise caution using reset() and fired() - they may require MEMBARs 157 void reset() { _Event = 0 ; } 158 int fired() { return _Event; } 159 void park () ; 160 void unpark () ; 161 int park (jlong millis) ; 162 } ; 163 164 165 166 class PlatformParker : public CHeapObj<mtInternal> { 167 protected: 168 HANDLE _ParkEvent ; 169 170 public: 171 ~PlatformParker () { guarantee (0, "invariant") ; } 172 PlatformParker () { 173 _ParkEvent = CreateEvent (NULL, true, false, NULL) ; 174 guarantee (_ParkEvent != NULL, "invariant") ; 175 } 176 177 } ; 178 179 #endif // OS_WINDOWS_VM_OS_WINDOWS_HPP