Skip to content

Commit

Permalink
threads: lock around invocations of memory.Grow
Browse files Browse the repository at this point in the history
Signed-off-by: Anuraag Agrawal <[email protected]>
  • Loading branch information
anuraaga committed Jul 4, 2024
1 parent 26d3aeb commit adb840a
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion internal/wasm/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ type MemoryInstance struct {
definition api.MemoryDefinition

// Mux is used in interpreter mode to prevent overlapping calls to atomic instructions,
// introduced with WebAssembly threads proposal.
// introduced with WebAssembly threads proposal, and in compiler mode to make memory modifications
// within Grow non-racy for the Go race detector.
Mux sync.Mutex

// waiters implements atomic wait and notify. It is implemented similarly to golang.org/x/sync/semaphore,
Expand Down Expand Up @@ -227,6 +228,11 @@ func MemoryPagesToBytesNum(pages uint32) (bytesNum uint64) {

// Grow implements the same method as documented on api.Memory.
func (m *MemoryInstance) Grow(delta uint32) (result uint32, ok bool) {
if m.Shared {
m.Mux.Lock()
defer m.Mux.Unlock()
}

currentPages := m.Pages()
if delta == 0 {
return currentPages, true
Expand Down

0 comments on commit adb840a

Please sign in to comment.