aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/msize.go
diff options
context:
space:
mode:
authorRick Hudson <rlh@golang.org>2016-02-04 11:41:48 -0500
committerRick Hudson <rlh@golang.org>2016-04-27 21:54:35 +0000
commit2ac8bdc52ae1ea0418df465de3f1ef36f49e2274 (patch)
treef7b3cf58fd7187ac66214efc18c7260e79b33bba /src/runtime/msize.go
parent6d6e16001bb04d4bf60c6d14d1f64684a043ef6c (diff)
downloadgo-2ac8bdc52ae1ea0418df465de3f1ef36f49e2274.tar.gz
go-2ac8bdc52ae1ea0418df465de3f1ef36f49e2274.zip
[dev.garbage] runtime: bitmap allocation data structs
The bitmap allocation data structure prototypes. Before this is released these underlying data structures need to be more performant but the signatures of helper functions utilizing these structures will remain stable. Change-Id: I5ace12f2fb512a7038a52bbde2bfb7e98783bcbe Reviewed-on: https://go-review.googlesource.com/19221 Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/msize.go')
-rw-r--r--src/runtime/msize.go28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/runtime/msize.go b/src/runtime/msize.go
index 21fe2f4c61..18577b309b 100644
--- a/src/runtime/msize.go
+++ b/src/runtime/msize.go
@@ -55,7 +55,7 @@ var size_to_class128 [(_MaxSmallSize-1024)/128 + 1]int8
func sizeToClass(size int32) int32 {
if size > _MaxSmallSize {
- throw("SizeToClass - invalid size")
+ throw("invalid size")
}
if size > 1024-8 {
return int32(size_to_class128[(size-1024+127)>>7])
@@ -79,7 +79,7 @@ func initSizes() {
}
}
if align&(align-1) != 0 {
- throw("InitSizes - bug")
+ throw("incorrect alignment")
}
// Make the allocnpages big enough that
@@ -106,10 +106,18 @@ func initSizes() {
sizeclass++
}
if sizeclass != _NumSizeClasses {
- print("sizeclass=", sizeclass, " NumSizeClasses=", _NumSizeClasses, "\n")
- throw("InitSizes - bad NumSizeClasses")
+ print("runtime: sizeclass=", sizeclass, " NumSizeClasses=", _NumSizeClasses, "\n")
+ throw("bad NumSizeClasses")
+ }
+ // Check maxObjsPerSpan => number of objects invariant.
+ for i, size := range class_to_size {
+ if size != 0 && class_to_allocnpages[i]*pageSize/size > maxObjsPerSpan {
+ throw("span contains too many objects")
+ }
+ if size == 0 && i != 0 {
+ throw("size is 0 but class is not 0")
+ }
}
-
// Initialize the size_to_class tables.
nextsize := 0
for sizeclass = 1; sizeclass < _NumSizeClasses; sizeclass++ {
@@ -128,12 +136,12 @@ func initSizes() {
for n := int32(0); n < _MaxSmallSize; n++ {
sizeclass := sizeToClass(n)
if sizeclass < 1 || sizeclass >= _NumSizeClasses || class_to_size[sizeclass] < n {
- print("size=", n, " sizeclass=", sizeclass, " runtime·class_to_size=", class_to_size[sizeclass], "\n")
+ print("runtime: size=", n, " sizeclass=", sizeclass, " runtime·class_to_size=", class_to_size[sizeclass], "\n")
print("incorrect SizeToClass\n")
goto dump
}
if sizeclass > 1 && class_to_size[sizeclass-1] >= n {
- print("size=", n, " sizeclass=", sizeclass, " runtime·class_to_size=", class_to_size[sizeclass], "\n")
+ print("runtime: size=", n, " sizeclass=", sizeclass, " runtime·class_to_size=", class_to_size[sizeclass], "\n")
print("SizeToClass too big\n")
goto dump
}
@@ -155,18 +163,18 @@ func initSizes() {
dump:
if true {
- print("NumSizeClasses=", _NumSizeClasses, "\n")
+ print("runtime: NumSizeClasses=", _NumSizeClasses, "\n")
print("runtime·class_to_size:")
for sizeclass = 0; sizeclass < _NumSizeClasses; sizeclass++ {
print(" ", class_to_size[sizeclass], "")
}
print("\n\n")
- print("size_to_class8:")
+ print("runtime: size_to_class8:")
for i := 0; i < len(size_to_class8); i++ {
print(" ", i*8, "=>", size_to_class8[i], "(", class_to_size[size_to_class8[i]], ")\n")
}
print("\n")
- print("size_to_class128:")
+ print("runtime: size_to_class128:")
for i := 0; i < len(size_to_class128); i++ {
print(" ", i*128, "=>", size_to_class128[i], "(", class_to_size[size_to_class128[i]], ")\n")
}