Skip to content

Commit c558d26

Browse files
KristofferCKristofferCtopolarity
committed
load extensions with fewer triggers earlier (#49891)
Aimed to support the use case in #48734 (comment). https://github.com/KristofferC/ExtSquared.jl is an example, see specifically https://github.com/KristofferC/ExtSquared.jl/blob/ded7c57d6f799674e3310b8174dfb07591bbe025/ext/BExt.jl#L4. I think this makes sense, happy for a second pair of eyes though. cc @termi-official --------- Co-authored-by: KristofferC <[email protected]> Co-authored-by: Cody Tapscott <[email protected]>
1 parent 05182dc commit c558d26

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

base/loading.jl

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,7 @@ end
14141414
mutable struct ExtensionId
14151415
const id::PkgId
14161416
const parentid::PkgId # just need the name, for printing
1417+
const n_total_triggers::Int
14171418
ntriggers::Int # how many more packages must be defined until this is loaded
14181419
end
14191420

@@ -1509,7 +1510,7 @@ function _insert_extension_triggers(parent::PkgId, extensions::Dict{String, Any}
15091510
continue # extension is already primed or loaded, don't add it again
15101511
end
15111512
EXT_PRIMED[id] = parent
1512-
gid = ExtensionId(id, parent, 1 + length(triggers))
1513+
gid = ExtensionId(id, parent, 1 + length(triggers), 1 + length(triggers))
15131514
trigger1 = get!(Vector{ExtensionId}, EXT_DORMITORY, parent)
15141515
push!(trigger1, gid)
15151516
for trigger in triggers
@@ -1553,25 +1554,22 @@ function run_extension_callbacks(pkgid::PkgId)
15531554
# take ownership of extids that depend on this pkgid
15541555
extids = pop!(EXT_DORMITORY, pkgid, nothing)
15551556
extids === nothing && return
1557+
extids_to_load = Vector{ExtensionId}()
15561558
for extid in extids
1557-
if extid.ntriggers > 0
1558-
# indicate pkgid is loaded
1559-
extid.ntriggers -= 1
1560-
end
1561-
if extid.ntriggers < 0
1562-
# indicate pkgid is loaded
1563-
extid.ntriggers += 1
1564-
succeeded = false
1565-
else
1566-
succeeded = true
1567-
end
1559+
@assert extid.ntriggers > 0
1560+
extid.ntriggers -= 1
15681561
if extid.ntriggers == 0
1569-
# actually load extid, now that all dependencies are met,
1570-
# and record the result
1571-
succeeded = succeeded && run_extension_callbacks(extid)
1572-
succeeded || push!(EXT_DORMITORY_FAILED, extid)
1562+
push!(extids_to_load, extid)
15731563
end
15741564
end
1565+
# Load extensions with the fewest triggers first
1566+
sort!(extids_to_load, by=extid->extid.n_total_triggers)
1567+
for extid in extids_to_load
1568+
# actually load extid, now that all dependencies are met,
1569+
succeeded = run_extension_callbacks(extid)
1570+
succeeded || push!(EXT_DORMITORY_FAILED, extid)
1571+
end
1572+
15751573
return
15761574
end
15771575

0 commit comments

Comments
 (0)