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:
Ayke van Laethem
2024-11-07 13:38:28 +01:00
committed by Ron Evans
parent 09a22ac4b4
commit 26c36d0a2e
7 changed files with 90 additions and 24 deletions
+6
View File
@@ -37,6 +37,12 @@ func main() {
// print interface
println(interface{}(nil))
println(interface{}(true))
println(interface{}("foobar"))
println(interface{}(int64(-3)))
println(interface{}(uint64(3)))
println(interface{}(int(-3)))
println(interface{}(uint(3)))
// print map
println(map[string]int{"three": 3, "five": 5})
+6
View File
@@ -19,6 +19,12 @@ a b c
+3.140000e+000
(+5.000000e+000+1.234500e+000i)
(0:nil)
true
foobar
-3
3
-3
3
map[2]
true false
[0/0]nil