mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-17 19:23:25 +00:00
runtime: lock output in print/println
This ensures that calls to print/println happening in different threads are not interleaved. It's a task.PMutex, so this should only change things when threading is used. This matches the Go compiler, which does the same thing: https://godbolt.org/z/na5KzE7en The locks are not recursive, which means that we need to be careful to not call `print` or `println` inside a runtime.print* implementation, inside putchar (recursively), and inside signal handlers. Making them recursive might be useful to do in the future, but it's not really necessary.
This commit is contained in:
committed by
Ron Evans
parent
09a22ac4b4
commit
26c36d0a2e
@@ -1686,6 +1686,7 @@ func (b *builder) createBuiltin(argTypes []types.Type, argValues []llvm.Value, c
|
||||
b.createRuntimeInvoke("_panic", argValues, "")
|
||||
return llvm.Value{}, nil
|
||||
case "print", "println":
|
||||
b.createRuntimeCall("printlock", nil, "")
|
||||
for i, value := range argValues {
|
||||
if i >= 1 && callName == "println" {
|
||||
b.createRuntimeCall("printspace", nil, "")
|
||||
@@ -1746,6 +1747,7 @@ func (b *builder) createBuiltin(argTypes []types.Type, argValues []llvm.Value, c
|
||||
if callName == "println" {
|
||||
b.createRuntimeCall("printnl", nil, "")
|
||||
}
|
||||
b.createRuntimeCall("printunlock", nil, "")
|
||||
return llvm.Value{}, nil // print() or println() returns void
|
||||
case "real":
|
||||
cplx := argValues[0]
|
||||
|
||||
Reference in New Issue
Block a user