diff options
author | Rick Hudson <rlh@golang.org> | 2016-02-04 11:41:48 -0500 |
---|---|---|
committer | Rick Hudson <rlh@golang.org> | 2016-04-27 21:54:35 +0000 |
commit | 2ac8bdc52ae1ea0418df465de3f1ef36f49e2274 (patch) | |
tree | f7b3cf58fd7187ac66214efc18c7260e79b33bba /src/runtime/msize.go | |
parent | 6d6e16001bb04d4bf60c6d14d1f64684a043ef6c (diff) | |
download | go-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.go | 28 |
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") } |