Skip to content

Commit 2828d78

Browse files
committed
Track loaded modules qualified for refresh eval
Track loaded modules that are qualified for a refresh evaluation. Refresh evaluation is only useful if module defines volatile environment changes: shell completion, alias or function. An internal state, named refresh_qualified, marks loading modules defining such volatile environment changes. Such modules are then added to the __MODULES_LMREFRESH environment variable to track this property once module is loaded. Code is also added to remove module from __MODULES_LMREFRESH when it is unloaded.
1 parent 3b1faeb commit 2828d78

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

tcl/mfinterp.tcl.in

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,9 @@ proc set-alias {alias what} {
16121612
set ::g_Aliases($alias) $what
16131613
set ::g_stateAliases($alias) new
16141614

1615+
# current module is qualified for refresh evaluation
1616+
lappendState -nodup refresh_qualified [currentState modulename]
1617+
16151618
return {}
16161619
}
16171620

@@ -1631,6 +1634,9 @@ proc set-function {function what} {
16311634
set ::g_Functions($function) $what
16321635
set ::g_stateFunctions($function) new
16331636

1637+
# current module is qualified for refresh evaluation
1638+
lappendState -nodup refresh_qualified [currentState modulename]
1639+
16341640
return {}
16351641
}
16361642

@@ -2677,6 +2683,9 @@ proc complete {shell name body} {
26772683
# also some shells may set multiple definitions for a single name
26782684
lappend ::g_Completes($name) $shell $body
26792685
set ::g_stateCompletes($name) new
2686+
2687+
# current module is qualified for refresh evaluation
2688+
lappendState -nodup refresh_qualified [currentState modulename]
26802689
}
26812690
26822691
# undo complete in unload mode

tcl/modeval.tcl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ proc pushSettings {} {
537537
g_stateFunctions g_Functions g_stateCompletes g_Completes\
538538
g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\
539539
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
540-
g_loadedModuleAltname g_loadedModuleAutoAltname\
540+
g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
541541
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
542542
g_moduleNPODepend g_dependNPOHash g_prereqViolation\
543543
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\
@@ -564,7 +564,7 @@ proc popSettings {} {
564564
g_newXResources g_delXResources g_changeDir g_stdoutPuts\
565565
g_prestdoutPuts g_return_text g_loadedModules g_loadedModuleFiles\
566566
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
567-
g_loadedModuleAltname g_loadedModuleAutoAltname\
567+
g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
568568
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
569569
g_moduleNPODepend g_dependNPOHash g_prereqViolation\
570570
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\
@@ -580,7 +580,7 @@ proc restoreSettings {} {
580580
g_stateFunctions g_Functions g_stateCompletes g_Completes\
581581
g_newXResources g_delXResources g_loadedModules g_loadedModuleFiles\
582582
g_loadedModuleVariant g_loadedModuleConflict g_loadedModulePrereq\
583-
g_loadedModuleAltname g_loadedModuleAutoAltname\
583+
g_loadedModulesRefresh g_loadedModuleAltname g_loadedModuleAutoAltname\
584584
g_loadedModuleAliasAltname g_moduleDepend g_dependHash\
585585
g_moduleNPODepend g_dependNPOHash g_prereqViolation\
586586
g_prereqNPOViolation g_conflictViolation g_moduleUnmetDep\

tcl/modfind.tcl.in

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ proc getLoadedModulePropertyList {prop {filter_empty 1}} {
435435
}
436436
default {
437437
set envvar __MODULES_LM[string toupper $prop]
438-
set subsplit [expr {$prop ni {init}}]
438+
set subsplit [expr {$prop ni {init refresh}}]
439439
if {$prop in {altname conflict}} {
440440
set nosubsubsplit 1
441441
}
@@ -1141,7 +1141,11 @@ proc getModuleFromLoadingModulefile {modfile {idx all}} {
11411141
}
11421142
}
11431143

1144-
proc setLoadedModule {mod modfile uasked {modvr {}}} {
1144+
proc isModuleRefreshQualified {mod} {
1145+
return $::g_loadedModulesRefresh($mod)
1146+
}
1147+
1148+
proc setLoadedModule {mod modfile uasked {modvr {}} refresh} {
11451149
set ::g_loadedModules($mod) $modfile
11461150
# a loaded modfile may correspond to multiple loaded virtual modules
11471151
lappend ::g_loadedModuleFiles($modfile) $mod
@@ -1154,6 +1158,9 @@ proc setLoadedModule {mod modfile uasked {modvr {}}} {
11541158
setModuleTag $modvr $loadedtag
11551159
}
11561160

1161+
# is module qualified for refresh evaluation
1162+
set ::g_loadedModulesRefresh($mod) $refresh
1163+
11571164
# build dependency chain
11581165
setModuleDependency $mod
11591166
}
@@ -1167,6 +1174,9 @@ proc unsetLoadedModule {mod modfile} {
11671174
set ::g_loadedModuleFiles($modfile) [replaceFromList\
11681175
$::g_loadedModuleFiles($modfile) $mod]
11691176
}
1177+
1178+
unset ::g_loadedModulesRefresh($mod)
1179+
11701180
# update dependencies
11711181
unsetModuleDependency $mod
11721182
}
@@ -1991,6 +2001,7 @@ proc cacheCurrentModules {{exitonerr 1}} {
19912001
set i 0
19922002
set modfilelist [getLoadedModulePropertyList file]
19932003
set modlist [getLoadedModulePropertyList name]
2004+
set refreshlist [getLoadedModulePropertyList refresh]
19942005

19952006
if {[llength $modlist] == [llength $modfilelist]} {
19962007
# cache declared variant of loaded modules
@@ -2060,7 +2071,8 @@ proc cacheCurrentModules {{exitonerr 1}} {
20602071
set modvr {}
20612072
}
20622073
setLoadedModule $mod [lindex $modfilelist $i] [expr\
2063-
{![isModuleTagged $mod auto-loaded 1]}] $modvr
2074+
{![isModuleTagged $mod auto-loaded 1]}] $modvr [expr {$mod in\
2075+
$refreshlist}]
20642076
incr i
20652077
}
20662078

tcl/subcmd.tcl.in

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,8 @@ proc cmdModuleLoad {context uasked tryload loadany tag_list args} {
11511151
# allow duplicate modfile entries for virtual modules
11521152
append-path --duplicates _LMFILES_ $modfile
11531153
# update cache arrays
1154-
setLoadedModule $modname $modfile $uasked $modnamevr
1154+
setLoadedModule $modname $modfile $uasked $modnamevr [expr {$modname\
1155+
in [getState refresh_qualified]}]
11551156

11561157
# register declared source-sh in environment
11571158
if {[set modsrcsh [getLoadedSourceSh $modname 1]] ne {}} {
@@ -1186,6 +1187,11 @@ proc cmdModuleLoad {context uasked tryload loadany tag_list args} {
11861187
append-path __MODULES_LMEXTRATAG $modtag
11871188
}
11881189

1190+
# declare module qualified for refresh evaluation
1191+
if {[isModuleRefreshQualified $modname]} {
1192+
append-path __MODULES_LMREFRESH $modname
1193+
}
1194+
11891195
# Load phase of dependent module reloading. These modules can adapt
11901196
# now that mod is seen loaded. Except if switch action ongoing (DepRe
11911197
# load phase will occur from switch)
@@ -1479,6 +1485,11 @@ proc cmdModuleUnload {context match auto force onlyureq onlyndep args} {
14791485
# module was asked by user if tagged loaded instead of auto-loaded
14801486
set uasked [isModuleTagged $modname loaded 1]
14811487

1488+
# unset module from list of loaded modules qualified for refresh eval
1489+
if {[isModuleRefreshQualified $modname]} {
1490+
remove-path __MODULES_LMREFRESH $modname
1491+
}
1492+
14821493
# get module position in loaded list to remove corresponding loaded
14831494
# modulefile (entry at same position in _LMFILES_)
14841495
# need the unfiltered loaded module list to get correct index

0 commit comments

Comments
 (0)