Make uenvarea thread exclusive
This commit is contained in:
parent
8c943e3be8
commit
9299703b39
@ -91,6 +91,7 @@ static char *w32_getenv(const char *name, UINT cp);
|
|||||||
#define dln_find_exe_r(fname, path, buf, size) rb_w32_udln_find_exe_r(fname, path, buf, size, cp)
|
#define dln_find_exe_r(fname, path, buf, size) rb_w32_udln_find_exe_r(fname, path, buf, size, cp)
|
||||||
#define dln_find_file_r(fname, path, buf, size) rb_w32_udln_find_file_r(fname, path, buf, size, cp)
|
#define dln_find_file_r(fname, path, buf, size) rb_w32_udln_find_file_r(fname, path, buf, size, cp)
|
||||||
#undef CharNext /* no default cp version */
|
#undef CharNext /* no default cp version */
|
||||||
|
#undef getenv
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
# if defined MAX_PATH
|
# if defined MAX_PATH
|
||||||
@ -709,6 +710,7 @@ static st_table *conlist = NULL;
|
|||||||
exclusive_for_##obj; \
|
exclusive_for_##obj; \
|
||||||
exclusive_for_##obj = (LeaveCriticalSection(&obj##_mutex), false))
|
exclusive_for_##obj = (LeaveCriticalSection(&obj##_mutex), false))
|
||||||
|
|
||||||
|
static CRITICAL_SECTION uenvarea_mutex;
|
||||||
static char *uenvarea;
|
static char *uenvarea;
|
||||||
|
|
||||||
/* License: Ruby's */
|
/* License: Ruby's */
|
||||||
@ -750,10 +752,13 @@ exit_handler(void)
|
|||||||
DeleteCriticalSection(&select_mutex);
|
DeleteCriticalSection(&select_mutex);
|
||||||
DeleteCriticalSection(&socklist_mutex);
|
DeleteCriticalSection(&socklist_mutex);
|
||||||
DeleteCriticalSection(&conlist_mutex);
|
DeleteCriticalSection(&conlist_mutex);
|
||||||
|
thread_exclusive(uenvarea) {
|
||||||
if (uenvarea) {
|
if (uenvarea) {
|
||||||
free(uenvarea);
|
free(uenvarea);
|
||||||
uenvarea = NULL;
|
uenvarea = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
DeleteCriticalSection(&uenvarea_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* License: Ruby's */
|
/* License: Ruby's */
|
||||||
@ -905,6 +910,7 @@ rb_w32_sysinit(int *argc, char ***argv)
|
|||||||
|
|
||||||
tzset();
|
tzset();
|
||||||
|
|
||||||
|
InitializeCriticalSection(&uenvarea_mutex);
|
||||||
init_env();
|
init_env();
|
||||||
|
|
||||||
init_stdhandle();
|
init_stdhandle();
|
||||||
@ -5261,11 +5267,18 @@ w32_getenv(const char *name, UINT cp)
|
|||||||
{
|
{
|
||||||
WCHAR *wenvarea, *wenv;
|
WCHAR *wenvarea, *wenv;
|
||||||
int len = strlen(name);
|
int len = strlen(name);
|
||||||
char *env;
|
char *env, *found = NULL;
|
||||||
int wlen;
|
int wlen;
|
||||||
|
|
||||||
if (len == 0) return NULL;
|
if (len == 0) return NULL;
|
||||||
|
|
||||||
|
if (!NTLoginName) {
|
||||||
|
/* initialized in init_env, uenvarea_mutex should have been
|
||||||
|
* initialized before it */
|
||||||
|
return getenv(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
thread_exclusive(uenvarea) {
|
||||||
if (uenvarea) {
|
if (uenvarea) {
|
||||||
free(uenvarea);
|
free(uenvarea);
|
||||||
uenvarea = NULL;
|
uenvarea = NULL;
|
||||||
@ -5273,20 +5286,24 @@ w32_getenv(const char *name, UINT cp)
|
|||||||
wenvarea = GetEnvironmentStringsW();
|
wenvarea = GetEnvironmentStringsW();
|
||||||
if (!wenvarea) {
|
if (!wenvarea) {
|
||||||
map_errno(GetLastError());
|
map_errno(GetLastError());
|
||||||
return NULL;
|
continue;
|
||||||
}
|
}
|
||||||
for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1)
|
for (wenv = wenvarea, wlen = 1; *wenv; wenv += lstrlenW(wenv) + 1)
|
||||||
wlen += lstrlenW(wenv) + 1;
|
wlen += lstrlenW(wenv) + 1;
|
||||||
uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL);
|
uenvarea = wstr_to_mbstr(cp, wenvarea, wlen, NULL);
|
||||||
FreeEnvironmentStringsW(wenvarea);
|
FreeEnvironmentStringsW(wenvarea);
|
||||||
if (!uenvarea)
|
if (!uenvarea)
|
||||||
return NULL;
|
continue;
|
||||||
|
|
||||||
for (env = uenvarea; *env; env += strlen(env) + 1)
|
for (env = uenvarea; *env; env += strlen(env) + 1) {
|
||||||
if (strncasecmp(env, name, len) == 0 && *(env + len) == '=')
|
if (strncasecmp(env, name, len) == 0 && *(env + len) == '=') {
|
||||||
return env + len + 1;
|
found = env + len + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* License: Ruby's */
|
/* License: Ruby's */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user