comparison src/os/windows/vm/os_windows.cpp @ 8872:53028d751155

7034299: Faulty winsock initialization code Reviewed-by: dholmes, sla, ctornqvi
author neliasso
date Tue, 02 Apr 2013 09:30:07 +0200
parents 6b803ba47588
children 0ca3dd0ffaba
comparison
equal deleted inserted replaced
8871:6b19fe41b577 8872:53028d751155
3766 static void perfMemory_exit_helper() { 3766 static void perfMemory_exit_helper() {
3767 perfMemory_exit(); 3767 perfMemory_exit();
3768 } 3768 }
3769 } 3769 }
3770 3770
3771 static jint initSock();
3772
3771 // this is called _after_ the global arguments have been parsed 3773 // this is called _after_ the global arguments have been parsed
3772 jint os::init_2(void) { 3774 jint os::init_2(void) {
3773 // Allocate a single page and mark it as readable for safepoint polling 3775 // Allocate a single page and mark it as readable for safepoint polling
3774 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY); 3776 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3775 guarantee( polling_page != NULL, "Reserve Failed for polling page"); 3777 guarantee( polling_page != NULL, "Reserve Failed for polling page");
3894 3896
3895 if (UseNUMAInterleaving) { 3897 if (UseNUMAInterleaving) {
3896 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag 3898 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3897 bool success = numa_interleaving_init(); 3899 bool success = numa_interleaving_init();
3898 if (!success) UseNUMAInterleaving = false; 3900 if (!success) UseNUMAInterleaving = false;
3901 }
3902
3903 if (initSock() != JNI_OK) {
3904 return JNI_ERR;
3899 } 3905 }
3900 3906
3901 return JNI_OK; 3907 return JNI_OK;
3902 } 3908 }
3903 3909
4892 } 4898 }
4893 4899
4894 // We don't build a headless jre for Windows 4900 // We don't build a headless jre for Windows
4895 bool os::is_headless_jre() { return false; } 4901 bool os::is_headless_jre() { return false; }
4896 4902
4897 4903 static jint initSock() {
4898 typedef CRITICAL_SECTION mutex_t;
4899 #define mutexInit(m) InitializeCriticalSection(m)
4900 #define mutexDestroy(m) DeleteCriticalSection(m)
4901 #define mutexLock(m) EnterCriticalSection(m)
4902 #define mutexUnlock(m) LeaveCriticalSection(m)
4903
4904 static bool sock_initialized = FALSE;
4905 static mutex_t sockFnTableMutex;
4906
4907 static void initSock() {
4908 WSADATA wsadata; 4904 WSADATA wsadata;
4909 4905
4910 if (!os::WinSock2Dll::WinSock2Available()) { 4906 if (!os::WinSock2Dll::WinSock2Available()) {
4911 jio_fprintf(stderr, "Could not load Winsock 2 (error: %d)\n", 4907 jio_fprintf(stderr, "Could not load Winsock (error: %d)\n",
4912 ::GetLastError()); 4908 ::GetLastError());
4913 return; 4909 return JNI_ERR;
4914 } 4910 }
4915 if (sock_initialized == TRUE) return; 4911
4916 4912 if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
4917 ::mutexInit(&sockFnTableMutex); 4913 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n",
4918 ::mutexLock(&sockFnTableMutex); 4914 ::GetLastError());
4919 if (os::WinSock2Dll::WSAStartup(MAKEWORD(1,1), &wsadata) != 0) { 4915 return JNI_ERR;
4920 jio_fprintf(stderr, "Could not initialize Winsock\n"); 4916 }
4921 } 4917 return JNI_OK;
4922 sock_initialized = TRUE;
4923 ::mutexUnlock(&sockFnTableMutex);
4924 } 4918 }
4925 4919
4926 struct hostent* os::get_host_by_name(char* name) { 4920 struct hostent* os::get_host_by_name(char* name) {
4927 if (!sock_initialized) {
4928 initSock();
4929 }
4930 if (!os::WinSock2Dll::WinSock2Available()) {
4931 return NULL;
4932 }
4933 return (struct hostent*)os::WinSock2Dll::gethostbyname(name); 4921 return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
4934 } 4922 }
4935 4923
4936 int os::socket_close(int fd) { 4924 int os::socket_close(int fd) {
4937 return ::closesocket(fd); 4925 return ::closesocket(fd);