Skip to content

Commit

Permalink
Cleanup aliased modules when the main module is deleted (#1365)
Browse files Browse the repository at this point in the history
Signed-off-by: Clifton Kaznocha <[email protected]>
  • Loading branch information
ckaznocha authored Apr 17, 2023
1 parent a9ec3b6 commit 00d9d88
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
5 changes: 5 additions & 0 deletions internal/wasm/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ type (
s *Store
// prev and next hold the nodes in the linked list of ModuleInstance held by Store.
prev, next *ModuleInstance
// aliases holds the module names that are aliases of this module registered in the store.
// Access to this field must be guarded by s.mux.
//
// Note: This is currently only used for spectests and will be nil in most cases.
aliases []string
// Definitions is derived from *Module, and is constructed during compilation phrase.
Definitions []FunctionDefinition
}
Expand Down
16 changes: 15 additions & 1 deletion internal/wasm/store_module_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ func (s *Store) deleteModule(m *ModuleInstance) error {
if m.ModuleName != "" {
delete(s.nameToModule, m.ModuleName)

// Under normal circumstances, m.aliases will be nil this loop will not
// be entered unless aliases have been created. See `*store.AliasModule`
for _, alias := range m.aliases {
delete(s.nameToModule, alias)
}

// Shrink the map if it's allocated more than twice the size of the list
newCap := len(s.nameToModule)
if newCap < nameToModuleShrinkThreshold {
Expand Down Expand Up @@ -93,7 +99,15 @@ func (s *Store) registerModule(m *ModuleInstance) error {
func (s *Store) AliasModule(src, dst string) error {
s.mux.Lock()
defer s.mux.Unlock()
s.nameToModule[dst] = s.nameToModule[src]
if _, ok := s.nameToModule[dst]; ok {
return nil
}
m, ok := s.nameToModule[src]
if !ok {
return nil
}
m.aliases = append(m.aliases, dst)
s.nameToModule[dst] = m
if len(s.nameToModule) > s.nameToModuleCap {
s.nameToModuleCap = len(s.nameToModule)
}
Expand Down
19 changes: 15 additions & 4 deletions internal/wasm/store_module_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,28 @@ func TestStore_module(t *testing.T) {
}

func TestStore_AliasModule(t *testing.T) {
s := newStore()
m1 := &ModuleInstance{ModuleName: "m1"}
s.nameToModule[m1.ModuleName] = m1

t.Run("alias module", func(t *testing.T) {
s := newStore()
m1 := &ModuleInstance{ModuleName: "m1"}
s.nameToModule[m1.ModuleName] = m1

require.NoError(t, s.AliasModule("m1", "m2"))
require.Equal(t, map[string]*ModuleInstance{"m1": m1, "m2": m1}, s.nameToModule)
// Doesn't affect module names
require.Nil(t, s.moduleList)
require.Equal(t, nameToModuleShrinkThreshold, s.nameToModuleCap)
})

t.Run("delete aliased module", func(t *testing.T) {
s := newStore()
m1 := &ModuleInstance{ModuleName: "m1"}
s.nameToModule[m1.ModuleName] = m1

require.NoError(t, s.AliasModule("m1", "m2"))
require.NoError(t, s.deleteModule(m1))
_, ok := s.nameToModule["m2"]
require.False(t, ok)
})
}

func TestStore_nameToModuleCap(t *testing.T) {
Expand Down

0 comments on commit 00d9d88

Please sign in to comment.