Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This change fixes two distinct data races: 1) some global vars of type *itype of the interp package are actually mutated during the lifecycle of an Interpreter. Even worse: if more than one Interpreter instance are created and used at a given time, they are actually racing each other for these global vars. Therefore, this change replaces these global vars with generator functions that create the needed type on the fly. 2) the symbols given as argument of Interpreter.Use were directly copied as reference (since they're maps) when mapped inside an Interpreter instance. Since the usual case is to give the symbols from the stdlib package, it means when the interpreter mutates its own symbols in fixStdio, it would actually mutate the corresponding global vars of the stdlib package. Again, this is at least racy as soon as several instances of an Intepreter are concurrently running. This change fixes the race by making sure Interpreter.Use actually copies the symbol values instead of copying the references.
- Loading branch information
Showing
5 changed files
with
235 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package main | ||
|
||
import "time" | ||
|
||
func main() { | ||
go func() { | ||
time.Sleep(3 * time.Second) | ||
println("hello world1") | ||
}() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package main | ||
|
||
import "time" | ||
|
||
func main() { | ||
go func() { | ||
time.Sleep(3 * time.Second) | ||
println("hello world2") | ||
}() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters