Files
wazero/internal/wasm/store_module_list.go
Takeshi Yoneda 50723a0fd2 Refactors spectest harness (#1489)
Signed-off-by: Takeshi Yoneda <t.y.mathetake@gmail.com>
2023-05-23 09:59:49 +10:00

98 lines
2.3 KiB
Go

package wasm
import (
"errors"
"fmt"
"github.com/tetratelabs/wazero/api"
)
// deleteModule makes the moduleName available for instantiation again.
func (s *Store) deleteModule(m *ModuleInstance) error {
s.mux.Lock()
defer s.mux.Unlock()
// Remove this module name.
if m.prev != nil {
m.prev.next = m.next
}
if m.next != nil {
m.next.prev = m.prev
}
if s.moduleList == m {
s.moduleList = m.next
}
// Clear the m state so it does not enter any other branch
// on subsequent calls to deleteModule.
m.prev = nil
m.next = nil
if m.ModuleName != "" {
delete(s.nameToModule, m.ModuleName)
// Shrink the map if it's allocated more than twice the size of the list
newCap := len(s.nameToModule)
if newCap < nameToModuleShrinkThreshold {
newCap = nameToModuleShrinkThreshold
}
if newCap*2 <= s.nameToModuleCap {
nameToModule := make(map[string]*ModuleInstance, newCap)
for k, v := range s.nameToModule {
nameToModule[k] = v
}
s.nameToModule = nameToModule
s.nameToModuleCap = newCap
}
}
return nil
}
// module returns the module of the given name or error if not in this store
func (s *Store) module(moduleName string) (*ModuleInstance, error) {
s.mux.RLock()
defer s.mux.RUnlock()
m, ok := s.nameToModule[moduleName]
if !ok {
return nil, fmt.Errorf("module[%s] not instantiated", moduleName)
}
return m, nil
}
// registerModule registers a ModuleInstance into the store.
// This makes the ModuleInstance visible for import if it's not anonymous, and ensures it is closed when the store is.
func (s *Store) registerModule(m *ModuleInstance) error {
s.mux.Lock()
defer s.mux.Unlock()
if s.nameToModule == nil {
return errors.New("already closed")
}
if m.ModuleName != "" {
if _, ok := s.nameToModule[m.ModuleName]; ok {
return fmt.Errorf("module[%s] has already been instantiated", m.ModuleName)
}
s.nameToModule[m.ModuleName] = m
if len(s.nameToModule) > s.nameToModuleCap {
s.nameToModuleCap = len(s.nameToModule)
}
}
// Add the newest node to the moduleNamesList as the head.
m.next = s.moduleList
if m.next != nil {
m.next.prev = m
}
s.moduleList = m
return nil
}
// Module implements wazero.Runtime Module
func (s *Store) Module(moduleName string) api.Module {
m, err := s.module(moduleName)
if err != nil {
return nil
}
return m
}