[前][次][番号順一覧][スレッド一覧]

ruby-changes:65329

From: Nobuyoshi <ko1@a...>
Date: Tue, 23 Feb 2021 21:24:50 +0900 (JST)
Subject: [ruby-changes:65329] 5a4742a0b4 (master): Make uenvarea thread exclusive

https://git.ruby-lang.org/ruby.git/commit/?id=5a4742a0b4

From 5a4742a0b4d57e95d6ed7e27c786a74e7cb55977 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Tue, 23 Feb 2021 20:51:02 +0900
Subject: Make uenvarea thread exclusive

---
 win32/win32.c | 55 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 23 deletions(-)

diff --git a/win32/win32.c b/win32/win32.c
index eccb7f4..0dc29f2 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -750,10 +750,13 @@ exit_handler(void) https://github.com/ruby/ruby/blob/trunk/win32/win32.c#L750
     DeleteCriticalSection(&select_mutex);
     DeleteCriticalSection(&socklist_mutex);
     DeleteCriticalSection(&conlist_mutex);
-    if (uenvarea) {
-	free(uenvarea);
-	uenvarea = NULL;
+    thread_exclusive(uenvarea) {
+	if (uenvarea) {
+	    free(uenvarea);
+	    uenvarea = NULL;
+	}
     }
+    DeleteCriticalSection(&uenvarea_mutex);
 }
 
 /* License: Ruby's */
@@ -808,6 +811,7 @@ StartSockets(void) https://github.com/ruby/ruby/blob/trunk/win32/win32.c#L811
     InitializeCriticalSection(&select_mutex);
     InitializeCriticalSection(&socklist_mutex);
     InitializeCriticalSection(&conlist_mutex);
+    InitializeCriticalSection(&uenvarea_mutex);
 
     atexit(exit_handler);
 }
@@ -5261,32 +5265,37 @@ w32_getenv(const char *name, UINT cp) https://github.com/ruby/ruby/blob/trunk/win32/win32.c#L5265
 {
     WCHAR *wenvarea, *wenv;
     int len = strlen(name);
-    char *env;
+    char *env = NULL;
     int wlen;
 
     if (len == 0) return NULL;
 
-    if (uenvarea) {
-	free(uenvarea);
-	uenvarea = NULL;
-    }
-    wenvarea = GetEnvironmentStringsW();
-    if (!wenvarea) {
-	map_errno(GetLastError());
-	return NULL;
-    }
-    for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1)
-	wlen += lstrlenW(wenv) + 1;
-    uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL);
-    FreeEnvironmentStringsW(wenvarea);
-    if (!uenvarea)
-	return NULL;
+    thread_exclusive(uenvarea) {
+	if (uenvarea) {
+	    free(uenvarea);
+	    uenvarea = NULL;
+	}
+	wenvarea = GetEnvironmentStringsW();
+	if (!wenvarea) {
+	    map_errno(GetLastError());
+	    continue;
+	}
+	for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1)
+	    wlen += lstrlenW(wenv) + 1;
+	uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL);
+	FreeEnvironmentStringsW(wenvarea);
+	if (!uenvarea)
+	    continue;
 
-    for (env = uenvarea; *env; env += strlen(env) + 1)
-	if (strncasecmp(env, name, len) == 0 && *(env + len) == '=')
-	    return env + len + 1;
+	for (env = uenvarea; *env; env += strlen(env) + 1) {
+	    if (strncasecmp(env, name, len) == 0 && *(env + len) == '=') {
+		env += len + 1;
+		break;
+	    }
+	}
+    }
 
-    return NULL;
+    return env;
 }
 
 /* License: Ruby's */
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]