@@ -1414,6 +1414,7 @@ end
14141414mutable 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
14181419end
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
15761574end
15771575
0 commit comments