This repository was archived by the owner on Jul 31, 2023. It is now read-only.
Commit 1789eaf
trace: reorder defaultIDGenerator fields for 8byte alignment (#866)
Fixes #865
This bug manifested as a consequence of
https://golang.org/pkg/sync/atomic/#pkg-note-BUG
and was exposed by PR #851 which switched to atomically
incrementing defaultIDGenerator.nextSpanID
The organization of the fields was misaligned on 32-bit
machines because the field `traceIDRand *rand.Rand`, a
pointer was included as the second field of the struct.
This is because the size of a pointer on 32-bit machines
is 4 bytes, hence after the second field, we'll have
offset from 12 bytes and for atomic access of *int64
fields, which are accessed in 4 byte increments by
atomic operations, on 32-bit machines, their addresses
are on non-8-byte divisible alignments i.e.
* nextSpanID -- [28, 36]
* spanIDInc -- [36, 44]
but on 64-bit machines, sizeof(pointer) = 8 bytes hence
their addresses are on 8-byte divisible alignments i.e.
* nextSpanID -- [32, 40]
* spanIDInc -- [40, 48]
Thus the required reorganization but making the pointer
the last field fixes the problem for both 32-bit and 64-bit.
This fix can be verified by prefixing `GOARCH=386` before
running code or tests.1 parent 457d67e commit 1789eaf
1 file changed
+13
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
470 | 470 | | |
471 | 471 | | |
472 | 472 | | |
473 | | - | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
474 | 485 | | |
475 | | - | |
476 | | - | |
| 486 | + | |
477 | 487 | | |
478 | 488 | | |
479 | 489 | | |
| |||
0 commit comments