mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: new itab lookup table
Keep itabs in a growable hash table. Use a simple open-addressable hash table, quadratic probing, power of two sized. Synchronization gets a bit more tricky. The common read path now has two atomic reads, one to get the table pointer and one to read the entry out of the table. I set the max load factor to 75%, kind of arbitrarily. There's a space-speed tradeoff here, and I'm not sure where we should land. Because we use open addressing the itab.link field is no longer needed. I'll remove it in a separate CL. Fixes #20505 Change-Id: Ifb3d9a337512d6cf968c1fceb1eeaf89559afebf Reviewed-on: https://go-review.googlesource.com/44472 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
parent
e098e5142d
commit
3d1699ea78
5 changed files with 174 additions and 97 deletions
|
|
@ -624,14 +624,13 @@ type _func struct {
|
|||
// Needs to be in sync with
|
||||
// ../cmd/compile/internal/gc/reflect.go:/^func.dumptypestructs.
|
||||
type itab struct {
|
||||
inter *interfacetype
|
||||
_type *_type
|
||||
link *itab
|
||||
hash uint32 // copy of _type.hash. Used for type switches.
|
||||
bad bool // type does not implement interface
|
||||
inhash bool // has this itab been added to hash?
|
||||
unused [2]byte
|
||||
fun [1]uintptr // variable sized
|
||||
inter *interfacetype
|
||||
_type *_type
|
||||
_ uintptr
|
||||
hash uint32 // copy of _type.hash. Used for type switches.
|
||||
bad bool // type does not implement interface
|
||||
_ [3]byte
|
||||
fun [1]uintptr // variable sized
|
||||
}
|
||||
|
||||
// Lock-free stack node.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue