Skip to content

Commit

Permalink
Merge pull request #48586 from JuliaLang/kc/ext_idem
Browse files Browse the repository at this point in the history
make `insert_extension_triggers` idempotent
  • Loading branch information
KristofferC committed Feb 13, 2023
2 parents 4a75129 + 6bd658e commit 983b007
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions base/loading.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1020,11 +1020,9 @@ function _include_from_serialized(pkg::PkgId, path::String, ocachepath::Union{No
elapsed = round((time_ns() - t_before) / 1e6, digits = 1)
comp_time, recomp_time = cumulative_compile_time_ns() .- t_comp_before
print(lpad(elapsed, 9), " ms ")
for extid in EXT_DORMITORY
if extid.id == pkg
print(extid.parentid.name, "")
break
end
parentid = get(EXT_PRIMED, pkg, nothing)
if parentid !== nothing
print(parentid.name, "")
end
print(pkg.name)
if comp_time > 0
Expand Down Expand Up @@ -1104,18 +1102,18 @@ mutable struct ExtensionId
ntriggers::Int # how many more packages must be defined until this is loaded
end

const EXT_DORMITORY = Dict{PkgId,Vector{ExtensionId}}()
const EXT_PRIMED = Dict{PkgId, PkgId}() # Extension -> Parent
const EXT_DORMITORY = Dict{PkgId,Vector{ExtensionId}}() # Trigger -> Extensions that can be triggered by it
const EXT_DORMITORY_FAILED = ExtensionId[]

function insert_extension_triggers(pkg::PkgId)
pkg.uuid === nothing && return
extensions_added = Set{PkgId}()
for env in load_path()
insert_extension_triggers!(extensions_added, env, pkg)
insert_extension_triggers(env, pkg)
end
end

function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, pkg::PkgId)::Union{Nothing,Missing}
function insert_extension_triggers(env::String, pkg::PkgId)::Union{Nothing,Missing}
project_file = env_project_file(env)
if project_file isa String
manifest_file = project_file_manifest_path(project_file)
Expand All @@ -1133,7 +1131,7 @@ function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, p
extensions === nothing && return
weakdeps === nothing && return
if weakdeps isa Dict{String, Any}
return _insert_extension_triggers!(extensions_added, pkg, extensions, weakdeps)
return _insert_extension_triggers(pkg, extensions, weakdeps)
end

d_weakdeps = Dict{String, String}()
Expand All @@ -1148,21 +1146,22 @@ function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, p
d_weakdeps[dep_name] = uuid
end
@assert length(d_weakdeps) == length(weakdeps)
return _insert_extension_triggers!(extensions_added, pkg, extensions, d_weakdeps)
return _insert_extension_triggers(pkg, extensions, d_weakdeps)
end
end
end
end
return nothing
end

function _insert_extension_triggers!(extensions_added::Set{PkgId}, parent::PkgId, extensions::Dict{String, <:Any}, weakdeps::Dict{String, <:Any})
function _insert_extension_triggers(parent::PkgId, extensions::Dict{String, <:Any}, weakdeps::Dict{String, <:Any})
for (ext::String, triggers::Union{String, Vector{String}}) in extensions
triggers isa String && (triggers = [triggers])
id = PkgId(uuid5(parent.uuid, ext), ext)
# Only add triggers for an extension from one env.
id in extensions_added && continue
push!(extensions_added, id)
if id in keys(EXT_PRIMED) || haskey(Base.loaded_modules, id)
continue # extension is already primed or loaded, don't add it again
end
EXT_PRIMED[id] = parent
gid = ExtensionId(id, parent, 1 + length(triggers))
trigger1 = get!(Vector{ExtensionId}, EXT_DORMITORY, parent)
push!(trigger1, gid)
Expand Down

0 comments on commit 983b007

Please sign in to comment.