aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mfinal.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2017-12-04 10:43:11 -0500
committerAustin Clements <austin@google.com>2018-02-15 21:12:12 +0000
commit41e6abdc61dd23ede4d3509aebf7b5a638f53712 (patch)
tree1b3d2b040bc1a97f159af33faf14d410dcbcbb42 /src/runtime/mfinal.go
parentb1d94c118fd163381537a22be4913742103baece (diff)
downloadgo-41e6abdc61dd23ede4d3509aebf7b5a638f53712.tar.gz
go-41e6abdc61dd23ede4d3509aebf7b5a638f53712.zip
runtime: replace mlookup and findObject with heapBitsForObject
These functions all serve essentially the same purpose. mlookup is used in only one place and findObject in only three. Use heapBitsForObject instead, which is the most optimized implementation. (This may seem slightly silly because none of these uses care about the heap bits, but we're about to split up the functionality of heapBitsForObject anyway. At that point, findObject will rise from the ashes.) Change-Id: I906468c972be095dd23cf2404a7d4434e802f250 Reviewed-on: https://go-review.googlesource.com/85877 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
Diffstat (limited to 'src/runtime/mfinal.go')
-rw-r--r--src/runtime/mfinal.go46
1 files changed, 3 insertions, 43 deletions
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go
index c11a6f15a4..e7ca5d669f 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -326,9 +326,9 @@ func SetFinalizer(obj interface{}, finalizer interface{}) {
}
// find the containing object
- _, base, _ := findObject(e.data)
+ base, _, _, _ := heapBitsForObject(uintptr(e.data), 0, 0)
- if base == nil {
+ if base == 0 {
// 0-length objects are okay.
if e.data == unsafe.Pointer(&zerobase) {
return
@@ -353,7 +353,7 @@ func SetFinalizer(obj interface{}, finalizer interface{}) {
throw("runtime.SetFinalizer: pointer not in allocated block")
}
- if e.data != base {
+ if uintptr(e.data) != base {
// As an implementation detail we allow to set finalizers for an inner byte
// of an object if it could come from tiny alloc (see mallocgc for details).
if ot.elem == nil || ot.elem.kind&kindNoPointers == 0 || ot.elem.size >= maxTinySize {
@@ -421,46 +421,6 @@ okarg:
})
}
-// Look up pointer v in heap. Return the span containing the object,
-// the start of the object, and the size of the object. If the object
-// does not exist, return nil, nil, 0.
-func findObject(v unsafe.Pointer) (s *mspan, x unsafe.Pointer, n uintptr) {
- c := gomcache()
- c.local_nlookup++
- if sys.PtrSize == 4 && c.local_nlookup >= 1<<30 {
- // purge cache stats to prevent overflow
- lock(&mheap_.lock)
- purgecachedstats(c)
- unlock(&mheap_.lock)
- }
-
- // find span
- arena_start := mheap_.arena_start
- arena_used := mheap_.arena_used
- if uintptr(v) < arena_start || uintptr(v) >= arena_used {
- return
- }
- p := uintptr(v) >> pageShift
- q := p - arena_start>>pageShift
- s = mheap_.spans[q]
- if s == nil {
- return
- }
- x = unsafe.Pointer(s.base())
-
- if uintptr(v) < uintptr(x) || uintptr(v) >= uintptr(unsafe.Pointer(s.limit)) || s.state != mSpanInUse {
- s = nil
- x = nil
- return
- }
-
- n = s.elemsize
- if s.spanclass.sizeclass() != 0 {
- x = add(x, (uintptr(v)-uintptr(x))/n*n)
- }
- return
-}
-
// Mark KeepAlive as noinline so that it is easily detectable as an intrinsic.
//go:noinline