src/os/windows/vm/os_windows.hpp

Thu, 04 Jul 2013 21:10:17 -0700

author
dcubed
date
Thu, 04 Jul 2013 21:10:17 -0700
changeset 5365
59b052799158
parent 4153
b9a9ed0f8eeb
child 5424
5e3b6f79d280
permissions
-rw-r--r--

8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
Summary: Dl_info struct should only be used if dladdr() has returned non-zero (no errors) and always check the dladdr() return value; Dl_info.dli_sname and Dl_info.dli_saddr fields should only be used if non-NULL; update/improve runtime/6888954/vmerrors.sh test
Reviewed-by: dsamersoff, zgu, hseigel, coleenp

     1 /*
     2  * Copyright (c) 1997, 2013, 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  */
    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
    29 class win32 {
    30   friend class os;
    32  protected:
    33   static int    _vm_page_size;
    34   static int    _vm_allocation_granularity;
    35   static int    _processor_type;
    36   static int    _processor_level;
    37   static julong _physical_memory;
    38   static size_t _default_stack_size;
    39   static bool   _is_nt;
    40   static bool   _is_windows_2003;
    41   static bool   _is_windows_server;
    43   static void print_windows_version(outputStream* st);
    45  public:
    46   // Windows-specific interface:
    47   static void   initialize_system_info();
    48   static void   setmode_streams();
    50   // Processor info as provided by NT
    51   static int processor_type()  { return _processor_type;  }
    52   // Processor level may not be accurate on non-NT systems
    53   static int processor_level() {
    54     assert(is_nt(), "use vm_version instead");
    55     return _processor_level;
    56   }
    57   static julong available_memory();
    58   static julong physical_memory() { return _physical_memory; }
    60   // load dll from Windows system directory or Windows directory
    61   static HINSTANCE load_Windows_dll(const char* name, char *ebuf, int ebuflen);
    63  public:
    64   // Generic interface:
    66   // Trace number of created threads
    67   static          intx  _os_thread_limit;
    68   static volatile intx  _os_thread_count;
    70   // Tells whether the platform is NT or Windown95
    71   static bool is_nt() { return _is_nt; }
    73   // Tells whether this is a server version of Windows
    74   static bool is_windows_server() { return _is_windows_server; }
    76   // Tells whether the platform is Windows 2003
    77   static bool is_windows_2003() { return _is_windows_2003; }
    79   // Returns the byte size of a virtual memory page
    80   static int vm_page_size() { return _vm_page_size; }
    82   // Returns the size in bytes of memory blocks which can be allocated.
    83   static int vm_allocation_granularity() { return _vm_allocation_granularity; }
    85   // Read the headers for the executable that started the current process into
    86   // the structure passed in (see winnt.h).
    87   static void read_executable_headers(PIMAGE_NT_HEADERS);
    89   // Default stack size for the current process.
    90   static size_t default_stack_size() { return _default_stack_size; }
    92 #ifndef _WIN64
    93   // A wrapper to install a structured exception handler for fast JNI accesors.
    94   static address fast_jni_accessor_wrapper(BasicType);
    95 #endif
    97 #ifndef PRODUCT
    98   static void call_test_func_with_wrapper(void (*funcPtr)(void));
    99 #endif
   101   // filter function to ignore faults on serializations page
   102   static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e);
   103 };
   105 class PlatformEvent : public CHeapObj<mtInternal> {
   106   private:
   107     double CachePad [4] ;   // increase odds that _Event is sole occupant of cache line
   108     volatile int _Event ;
   109     HANDLE _ParkHandle ;
   111   public:       // TODO-FIXME: make dtor private
   112     ~PlatformEvent() { guarantee (0, "invariant") ; }
   114   public:
   115     PlatformEvent() {
   116       _Event   = 0 ;
   117       _ParkHandle = CreateEvent (NULL, false, false, NULL) ;
   118       guarantee (_ParkHandle != NULL, "invariant") ;
   119     }
   121     // Exercise caution using reset() and fired() - they may require MEMBARs
   122     void reset() { _Event = 0 ; }
   123     int  fired() { return _Event; }
   124     void park () ;
   125     void unpark () ;
   126     int  park (jlong millis) ;
   127 } ;
   131 class PlatformParker : public CHeapObj<mtInternal> {
   132   protected:
   133     HANDLE _ParkEvent ;
   135   public:
   136     ~PlatformParker () { guarantee (0, "invariant") ; }
   137     PlatformParker  () {
   138       _ParkEvent = CreateEvent (NULL, true, false, NULL) ;
   139       guarantee (_ParkEvent != NULL, "invariant") ;
   140     }
   142 } ;
   144 // JDK7 requires VS2010
   145 #if _MSC_VER < 1600
   146 #define JDK6_OR_EARLIER 1
   147 #endif
   151 class WinSock2Dll: AllStatic {
   152 public:
   153   static BOOL WSAStartup(WORD, LPWSADATA);
   154   static struct hostent* gethostbyname(const char *name);
   155   static BOOL WinSock2Available();
   156 #ifdef JDK6_OR_EARLIER
   157 private:
   158   static int (PASCAL FAR* _WSAStartup)(WORD, LPWSADATA);
   159   static struct hostent *(PASCAL FAR *_gethostbyname)(...);
   160   static BOOL initialized;
   162   static void initialize();
   163 #endif
   164 };
   166 class Kernel32Dll: AllStatic {
   167 public:
   168   static BOOL SwitchToThread();
   169   static SIZE_T GetLargePageMinimum();
   171   static BOOL SwitchToThreadAvailable();
   172   static BOOL GetLargePageMinimumAvailable();
   174   // Help tools
   175   static BOOL HelpToolsAvailable();
   176   static HANDLE CreateToolhelp32Snapshot(DWORD,DWORD);
   177   static BOOL Module32First(HANDLE,LPMODULEENTRY32);
   178   static BOOL Module32Next(HANDLE,LPMODULEENTRY32);
   180   static BOOL GetNativeSystemInfoAvailable();
   181   static void GetNativeSystemInfo(LPSYSTEM_INFO);
   183   // NUMA calls
   184   static BOOL NumaCallsAvailable();
   185   static LPVOID VirtualAllocExNuma(HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
   186   static BOOL GetNumaHighestNodeNumber(PULONG);
   187   static BOOL GetNumaNodeProcessorMask(UCHAR, PULONGLONG);
   189   // Stack walking
   190   static USHORT RtlCaptureStackBackTrace(ULONG, ULONG, PVOID*, PULONG);
   192 private:
   193   // GetLargePageMinimum available on Windows Vista/Windows Server 2003
   194   // and later
   195   // NUMA calls available Windows Vista/WS2008 and later
   197   static SIZE_T (WINAPI *_GetLargePageMinimum)(void);
   198   static LPVOID (WINAPI *_VirtualAllocExNuma) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
   199   static BOOL (WINAPI *_GetNumaHighestNodeNumber) (PULONG);
   200   static BOOL (WINAPI *_GetNumaNodeProcessorMask) (UCHAR, PULONGLONG);
   201   static USHORT (WINAPI *_RtlCaptureStackBackTrace)(ULONG, ULONG, PVOID*, PULONG);
   202   static BOOL initialized;
   204   static void initialize();
   205   static void initializeCommon();
   207 #ifdef JDK6_OR_EARLIER
   208 private:
   209   static BOOL (WINAPI *_SwitchToThread)(void);
   210   static HANDLE (WINAPI* _CreateToolhelp32Snapshot)(DWORD,DWORD);
   211   static BOOL (WINAPI* _Module32First)(HANDLE,LPMODULEENTRY32);
   212   static BOOL (WINAPI* _Module32Next)(HANDLE,LPMODULEENTRY32);
   213   static void (WINAPI *_GetNativeSystemInfo)(LPSYSTEM_INFO);
   214 #endif
   216 };
   218 class Advapi32Dll: AllStatic {
   219 public:
   220   static BOOL AdjustTokenPrivileges(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
   221   static BOOL OpenProcessToken(HANDLE, DWORD, PHANDLE);
   222   static BOOL LookupPrivilegeValue(LPCTSTR, LPCTSTR, PLUID);
   224   static BOOL AdvapiAvailable();
   226 #ifdef JDK6_OR_EARLIER
   227 private:
   228   static BOOL (WINAPI *_AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
   229   static BOOL (WINAPI *_OpenProcessToken)(HANDLE, DWORD, PHANDLE);
   230   static BOOL (WINAPI *_LookupPrivilegeValue)(LPCTSTR, LPCTSTR, PLUID);
   231   static BOOL initialized;
   233   static void initialize();
   234 #endif
   235 };
   237 class PSApiDll: AllStatic {
   238 public:
   239   static BOOL EnumProcessModules(HANDLE, HMODULE *, DWORD, LPDWORD);
   240   static DWORD GetModuleFileNameEx(HANDLE, HMODULE, LPTSTR, DWORD);
   241   static BOOL GetModuleInformation(HANDLE, HMODULE, LPMODULEINFO, DWORD);
   243   static BOOL PSApiAvailable();
   245 #ifdef JDK6_OR_EARLIER
   246 private:
   247   static BOOL (WINAPI *_EnumProcessModules)(HANDLE, HMODULE *, DWORD, LPDWORD);
   248   static BOOL (WINAPI *_GetModuleFileNameEx)(HANDLE, HMODULE, LPTSTR, DWORD);;
   249   static BOOL (WINAPI *_GetModuleInformation)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
   250   static BOOL initialized;
   252   static void initialize();
   253 #endif
   254 };
   256 #endif // OS_WINDOWS_VM_OS_WINDOWS_HPP

mercurial