mirror of
https://github.com/traefik/yaegi.git
synced 2026-06-01 18:37:56 +00:00
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.
11 lines
119 B
Go
11 lines
119 B
Go
package main
|
|
|
|
import "time"
|
|
|
|
func main() {
|
|
go func() {
|
|
time.Sleep(3 * time.Second)
|
|
println("hello world2")
|
|
}()
|
|
}
|