From 94e61ab94d4ab865cd3f9f73062a1c201bb6584d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 14 Jan 2020 19:13:47 +0000 Subject: [PATCH] runtime/runtime2: pack the sudog struct This commit moves the isSelect bool below the ticket uint32. The boolean was consuming 8 bytes of the struct. The uint32 was also consuming 8 bytes, so we can pack isSelect below the uint32 and save 8 bytes. This reduces the sudog struct from 96 bytes to 88 bytes. Change-Id: If555cdaf2f5eaa125e2590fc4d113dbc99750738 GitHub-Last-Rev: d63b4e086b17da74e185046dfecb12d58e4f19ac GitHub-Pull-Request: golang/go#36552 Reviewed-on: https://go-review.googlesource.com/c/go/+/214677 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/export_test.go | 2 ++ src/runtime/runtime2.go | 8 +++++--- src/runtime/sizeof_test.go | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 4c1150acd4..f2461f0cb0 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -483,6 +483,8 @@ func GetNextArenaHint() uintptr { type G = g +type Sudog = sudog + func Getg() *G { return getg() } diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 2c566b5424..1fe41cf5b2 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -349,9 +349,6 @@ type sudog struct { g *g - // isSelect indicates g is participating in a select, so - // g.selectDone must be CAS'd to win the wake-up race. - isSelect bool next *sudog prev *sudog elem unsafe.Pointer // data element (may point to stack) @@ -364,6 +361,11 @@ type sudog struct { acquiretime int64 releasetime int64 ticket uint32 + + // isSelect indicates g is participating in a select, so + // g.selectDone must be CAS'd to win the wake-up race. + isSelect bool + parent *sudog // semaRoot binary tree waitlink *sudog // g.waiting list or semaRoot waittail *sudog // semaRoot diff --git a/src/runtime/sizeof_test.go b/src/runtime/sizeof_test.go index 852244d425..d6156902c1 100644 --- a/src/runtime/sizeof_test.go +++ b/src/runtime/sizeof_test.go @@ -22,6 +22,7 @@ func TestSizeof(t *testing.T) { _64bit uintptr // size on 64bit platforms }{ {runtime.G{}, 216, 376}, // g, but exported for testing + {runtime.Sudog{}, 56, 88}, // sudog, but exported for testing } for _, tt := range tests {