import (
"internal/cpu"
"internal/goarch"
+ "internal/goexperiment"
"internal/runtime/atomic"
"internal/runtime/gc"
"unsafe"
throw("p mcache not flushed")
}
// Initialize ptrBuf if necessary.
- if p.gcw.ptrBuf == nil {
+ if goexperiment.GreenTeaGC && p.gcw.ptrBuf == nil {
p.gcw.ptrBuf = (*[gc.PageSize / goarch.PtrSize]uintptr)(persistentalloc(gc.PageSize, goarch.PtrSize, &memstats.gcMiscSys))
}
}
})
}
if debug.gctrace > 1 {
- for i := range pp.gcw.stats {
- memstats.lastScanStats[i].spansDenseScanned += pp.gcw.stats[i].spansDenseScanned
- memstats.lastScanStats[i].spanObjsDenseScanned += pp.gcw.stats[i].spanObjsDenseScanned
- memstats.lastScanStats[i].spansSparseScanned += pp.gcw.stats[i].spansSparseScanned
- memstats.lastScanStats[i].spanObjsSparseScanned += pp.gcw.stats[i].spanObjsSparseScanned
- memstats.lastScanStats[i].sparseObjsScanned += pp.gcw.stats[i].sparseObjsScanned
- }
- clear(pp.gcw.stats[:])
+ pp.gcw.flushScanStats(&memstats.lastScanStats)
}
pp.pinnerCache = nil
})
print("\n")
if debug.gctrace > 1 {
- var (
- spansDenseScanned uint64
- spanObjsDenseScanned uint64
- spansSparseScanned uint64
- spanObjsSparseScanned uint64
- sparseObjsScanned uint64
- )
- for _, stats := range memstats.lastScanStats {
- spansDenseScanned += stats.spansDenseScanned
- spanObjsDenseScanned += stats.spanObjsDenseScanned
- spansSparseScanned += stats.spansSparseScanned
- spanObjsSparseScanned += stats.spanObjsSparseScanned
- sparseObjsScanned += stats.sparseObjsScanned
- }
- totalObjs := sparseObjsScanned + spanObjsSparseScanned + spanObjsDenseScanned
- totalSpans := spansSparseScanned + spansDenseScanned
- print("scan: total ", sparseObjsScanned, "+", spanObjsSparseScanned, "+", spanObjsDenseScanned, "=", totalObjs, " objs")
- print(", ", spansSparseScanned, "+", spansDenseScanned, "=", totalSpans, " spans\n")
- for i, stats := range memstats.lastScanStats {
- if stats == (sizeClassScanStats{}) {
- continue
- }
- totalObjs := stats.sparseObjsScanned + stats.spanObjsSparseScanned + stats.spanObjsDenseScanned
- totalSpans := stats.spansSparseScanned + stats.spansDenseScanned
- if i == 0 {
- print("scan: class L ")
- } else {
- print("scan: class ", gc.SizeClassToSize[i], "B ")
- }
- print(stats.sparseObjsScanned, "+", stats.spanObjsSparseScanned, "+", stats.spanObjsDenseScanned, "=", totalObjs, " objs")
- print(", ", stats.spansSparseScanned, "+", stats.spansDenseScanned, "=", totalSpans, " spans\n")
- }
+ dumpScanStats()
}
printunlock()
}
}
return read
}
+
+type sizeClassScanStats struct {
+ spansDenseScanned uint64
+ spanObjsDenseScanned uint64
+ spansSparseScanned uint64
+ spanObjsSparseScanned uint64
+ sparseObjsScanned uint64
+}
+
+func dumpScanStats() {
+ var (
+ spansDenseScanned uint64
+ spanObjsDenseScanned uint64
+ spansSparseScanned uint64
+ spanObjsSparseScanned uint64
+ sparseObjsScanned uint64
+ )
+ for _, stats := range memstats.lastScanStats {
+ spansDenseScanned += stats.spansDenseScanned
+ spanObjsDenseScanned += stats.spanObjsDenseScanned
+ spansSparseScanned += stats.spansSparseScanned
+ spanObjsSparseScanned += stats.spanObjsSparseScanned
+ sparseObjsScanned += stats.sparseObjsScanned
+ }
+ totalObjs := sparseObjsScanned + spanObjsSparseScanned + spanObjsDenseScanned
+ totalSpans := spansSparseScanned + spansDenseScanned
+ print("scan: total ", sparseObjsScanned, "+", spanObjsSparseScanned, "+", spanObjsDenseScanned, "=", totalObjs, " objs")
+ print(", ", spansSparseScanned, "+", spansDenseScanned, "=", totalSpans, " spans\n")
+ for i, stats := range memstats.lastScanStats {
+ if stats == (sizeClassScanStats{}) {
+ continue
+ }
+ totalObjs := stats.sparseObjsScanned + stats.spanObjsSparseScanned + stats.spanObjsDenseScanned
+ totalSpans := stats.spansSparseScanned + stats.spansDenseScanned
+ if i == 0 {
+ print("scan: class L ")
+ } else {
+ print("scan: class ", gc.SizeClassToSize[i], "B ")
+ }
+ print(stats.sparseObjsScanned, "+", stats.spanObjsSparseScanned, "+", stats.spanObjsDenseScanned, "=", totalObjs, " objs")
+ print(", ", stats.spansSparseScanned, "+", stats.spansDenseScanned, "=", totalSpans, " spans\n")
+ }
+}
+
+func (w *gcWork) flushScanStats(dst *[gc.NumSizeClasses]sizeClassScanStats) {
+ for i := range w.stats {
+ dst[i].spansDenseScanned += w.stats[i].spansDenseScanned
+ dst[i].spanObjsDenseScanned += w.stats[i].spanObjsDenseScanned
+ dst[i].spansSparseScanned += w.stats[i].spansSparseScanned
+ dst[i].spanObjsSparseScanned += w.stats[i].spanObjsSparseScanned
+ dst[i].sparseObjsScanned += w.stats[i].sparseObjsScanned
+ }
+ clear(w.stats[:])
+}
package runtime
+import "internal/runtime/gc"
+
func (s *mspan) markBitsForIndex(objIndex uintptr) markBits {
bytep, mask := s.gcmarkBits.bitp(objIndex)
return markBits{bytep, mask, objIndex}
func scanSpan(p objptr, gcw *gcWork) {
throw("unimplemented")
}
+
+type sizeClassScanStats struct {
+ sparseObjsScanned uint64
+}
+
+func dumpScanStats() {
+ var sparseObjsScanned uint64
+ for _, stats := range memstats.lastScanStats {
+ sparseObjsScanned += stats.sparseObjsScanned
+ }
+ print("scan: total ", sparseObjsScanned, " objs\n")
+ for i, stats := range memstats.lastScanStats {
+ if stats == (sizeClassScanStats{}) {
+ continue
+ }
+ if i == 0 {
+ print("scan: class L ")
+ } else {
+ print("scan: class ", gc.SizeClassToSize[i], "B ")
+ }
+ print(stats.sparseObjsScanned, " objs\n")
+ }
+}
+
+func (w *gcWork) flushScanStats(dst *[gc.NumSizeClasses]sizeClassScanStats) {
+ for i := range w.stats {
+ dst[i].sparseObjsScanned += w.stats[i].sparseObjsScanned
+ }
+ clear(w.stats[:])
+}
enablegc bool
}
-type sizeClassScanStats struct {
- spansDenseScanned uint64
- spanObjsDenseScanned uint64
- spansSparseScanned uint64
- spanObjsSparseScanned uint64
- sparseObjsScanned uint64
-}
-
var memstats mstats
// A MemStats records statistics about the memory allocator.