From d3075dd0df56c7d556da0a858c0239f4c05c3fa3 Mon Sep 17 00:00:00 2001 From: KristofferC Date: Fri, 5 Jan 2024 13:30:06 +0100 Subject: [PATCH 1/4] use a Dict instead of an IdDict for caching of the `cwstring` for Windows env variables `IdDict` methods have a bunch of `nospecialize` annotations which specifically when using an `Array` value causes methods to be compiled that are very vulnerable to invalidations. --- base/env.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/env.jl b/base/env.jl index 27594acff6b7f..2a5223ef142b7 100644 --- a/base/env.jl +++ b/base/env.jl @@ -3,7 +3,7 @@ if Sys.iswindows() const ERROR_ENVVAR_NOT_FOUND = UInt32(203) - const env_dict = IdDict{String, Vector{Cwchar_t}}() + const env_dict = Dict{String, Vector{Cwchar_t}}() const env_lock = ReentrantLock() function memoized_env_lookup(str::AbstractString) From 5a3a238182d0ebc69e70ae3a06e112618c903441 Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Fri, 5 Jan 2024 16:19:09 +0100 Subject: [PATCH 2/4] also lock on access --- base/env.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/env.jl b/base/env.jl index 2a5223ef142b7..48ab3f11b8061 100644 --- a/base/env.jl +++ b/base/env.jl @@ -11,10 +11,10 @@ if Sys.iswindows() # incurred allocations because we had to convert a String to a Vector{Cwchar_t} each time # an environment variable was looked up. This function memoizes that lookup process, storing # the String => Vector{Cwchar_t} pairs in env_dict - var = get(env_dict, str, nothing) - if isnothing(var) - var = @lock env_lock begin - env_dict[str] = cwstring(str) + @lock env_lock begin + var = get(env_dict, str, nothing) + if isnothing(var) + var = env_dict[str] = cwstring(str) end end var From abdef50740c5c137064738e09eda3fa77b894caa Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Fri, 5 Jan 2024 21:56:59 +0100 Subject: [PATCH 3/4] webbrowser editing... --- base/env.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/env.jl b/base/env.jl index 48ab3f11b8061..ac3c0c2794554 100644 --- a/base/env.jl +++ b/base/env.jl @@ -16,8 +16,8 @@ if Sys.iswindows() if isnothing(var) var = env_dict[str] = cwstring(str) end + return var end - var end _getenvlen(var::Vector{UInt16}) = ccall(:GetEnvironmentVariableW,stdcall,UInt32,(Ptr{UInt16},Ptr{UInt16},UInt32),var,C_NULL,0) From 0385eaa76dfe8b0bf001625cb5a5b4af8ea9557f Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Fri, 5 Jan 2024 21:58:06 +0100 Subject: [PATCH 4/4] nicer --- base/env.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/base/env.jl b/base/env.jl index ac3c0c2794554..1bebfd2623e61 100644 --- a/base/env.jl +++ b/base/env.jl @@ -14,7 +14,8 @@ if Sys.iswindows() @lock env_lock begin var = get(env_dict, str, nothing) if isnothing(var) - var = env_dict[str] = cwstring(str) + var = cwstring(str) + env_dict[str] = var end return var end