mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: factor out bitmap, finalizer code from malloc/mgc
The code in mfinal.go is moved from malloc*.go and mgc*.go and substantially unchanged. The code in mbitmap.go is also moved from those files, but cleaned up so that it can be called from those files (in most cases the code being moved was not already a standalone function). I also renamed the constants and wrote comments describing the format. The result is a significant cleanup and isolation of the bitmap code, but, roughly speaking, it should be treated and reviewed as new code. The other files changed only as much as necessary to support this code movement. This CL does NOT change the semantics of the heap or type bitmaps at all, although there are now some obvious opportunities to do so in followup CLs. Change-Id: I41b8d5de87ad1d3cd322709931ab25e659dbb21d Reviewed-on: https://go-review.googlesource.com/2991 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
fd880f8d26
commit
3965d7508e
13 changed files with 1426 additions and 1439 deletions
|
|
@ -296,9 +296,9 @@ func stackfree(stk stack) {
|
|||
var maxstacksize uintptr = 1 << 20 // enough until runtime.main sets it for real
|
||||
|
||||
var mapnames = []string{
|
||||
_BitsDead: "---",
|
||||
_BitsScalar: "scalar",
|
||||
_BitsPointer: "ptr",
|
||||
typeDead: "---",
|
||||
typeScalar: "scalar",
|
||||
typePointer: "ptr",
|
||||
}
|
||||
|
||||
// Stack frame layout
|
||||
|
|
@ -371,7 +371,7 @@ func adjustpointers(scanp unsafe.Pointer, cbv *bitvector, adjinfo *adjustinfo, f
|
|||
minp := adjinfo.old.lo
|
||||
maxp := adjinfo.old.hi
|
||||
delta := adjinfo.delta
|
||||
num := uintptr(bv.n / _BitsPerPointer)
|
||||
num := uintptr(bv.n) / typeBitsWidth
|
||||
for i := uintptr(0); i < num; i++ {
|
||||
if stackDebug >= 4 {
|
||||
print(" ", add(scanp, i*ptrSize), ":", mapnames[ptrbits(&bv, i)], ":", hex(*(*uintptr)(add(scanp, i*ptrSize))), " # ", i, " ", bv.bytedata[i/4], "\n")
|
||||
|
|
@ -379,13 +379,13 @@ func adjustpointers(scanp unsafe.Pointer, cbv *bitvector, adjinfo *adjustinfo, f
|
|||
switch ptrbits(&bv, i) {
|
||||
default:
|
||||
throw("unexpected pointer bits")
|
||||
case _BitsDead:
|
||||
case typeDead:
|
||||
if debug.gcdead != 0 {
|
||||
*(*unsafe.Pointer)(add(scanp, i*ptrSize)) = unsafe.Pointer(uintptr(poisonStack))
|
||||
}
|
||||
case _BitsScalar:
|
||||
case typeScalar:
|
||||
// ok
|
||||
case _BitsPointer:
|
||||
case typePointer:
|
||||
p := *(*unsafe.Pointer)(add(scanp, i*ptrSize))
|
||||
up := uintptr(p)
|
||||
if f != nil && 0 < up && up < _PageSize && debug.invalidptr != 0 || up == poisonStack {
|
||||
|
|
@ -453,7 +453,7 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool {
|
|||
throw("bad symbol table")
|
||||
}
|
||||
bv = stackmapdata(stackmap, pcdata)
|
||||
size = (uintptr(bv.n) * ptrSize) / _BitsPerPointer
|
||||
size = (uintptr(bv.n) / typeBitsWidth) * ptrSize
|
||||
if stackDebug >= 3 {
|
||||
print(" locals ", pcdata, "/", stackmap.n, " ", size/ptrSize, " words ", bv.bytedata, "\n")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue