aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runtime/proc.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index e94de3a43a..83f3d5226f 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -5209,6 +5209,15 @@ func doInit(t *initTask) {
throw("recursive call during initialization - linker skew")
default: // not initialized yet
t.state = 1 // initialization in progress
+ if raceenabled {
+ // Randomize initialization order of packages t depends on.
+ // TODO: enable always instead of just for race?
+ s := *(*[]uintptr)(unsafe.Pointer(&slice{array: add(unsafe.Pointer(t), 3*sys.PtrSize), len: int(t.ndeps), cap: int(t.ndeps)}))
+ for i := len(s) - 1; i > 0; i-- {
+ j := int(fastrandn(uint32(i + 1)))
+ s[i], s[j] = s[j], s[i]
+ }
+ }
for i := uintptr(0); i < t.ndeps; i++ {
p := add(unsafe.Pointer(t), (3+i)*sys.PtrSize)
t2 := *(**initTask)(p)