From 8a39ee361feb9bf46d728ff1ba4f07ca1d9610b1 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 19 Jun 2014 09:22:53 +0200 Subject: Imported Upstream version 1.3 --- src/pkg/runtime/msize.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) (limited to 'src/pkg/runtime/msize.c') diff --git a/src/pkg/runtime/msize.c b/src/pkg/runtime/msize.c index 50b372b61..2fbd5e104 100644 --- a/src/pkg/runtime/msize.c +++ b/src/pkg/runtime/msize.c @@ -28,8 +28,11 @@ #include "runtime.h" #include "arch_GOARCH.h" #include "malloc.h" +#include "../../cmd/ld/textflag.h" +#pragma dataflag NOPTR int32 runtime·class_to_size[NumSizeClasses]; +#pragma dataflag NOPTR int32 runtime·class_to_allocnpages[NumSizeClasses]; // The SizeToClass lookup is implemented using two arrays, @@ -41,11 +44,15 @@ int32 runtime·class_to_allocnpages[NumSizeClasses]; // size divided by 128 (rounded up). The arrays are filled in // by InitSizes. +#pragma dataflag NOPTR int8 runtime·size_to_class8[1024/8 + 1]; +#pragma dataflag NOPTR int8 runtime·size_to_class128[(MaxSmallSize-1024)/128 + 1]; -static int32 -SizeToClass(int32 size) +void runtime·testdefersizes(void); + +int32 +runtime·SizeToClass(int32 size) { if(size > MaxSmallSize) runtime·throw("SizeToClass - invalid size"); @@ -90,9 +97,9 @@ runtime·InitSizes(void) // objects into the page, we might as well // use just this size instead of having two // different sizes. - if(sizeclass > 1 - && npages == runtime·class_to_allocnpages[sizeclass-1] - && allocsize/size == allocsize/runtime·class_to_size[sizeclass-1]) { + if(sizeclass > 1 && + npages == runtime·class_to_allocnpages[sizeclass-1] && + allocsize/size == allocsize/runtime·class_to_size[sizeclass-1]) { runtime·class_to_size[sizeclass-1] = size; continue; } @@ -119,7 +126,7 @@ runtime·InitSizes(void) // Double-check SizeToClass. if(0) { for(n=0; n < MaxSmallSize; n++) { - sizeclass = SizeToClass(n); + sizeclass = runtime·SizeToClass(n); if(sizeclass < 1 || sizeclass >= NumSizeClasses || runtime·class_to_size[sizeclass] < n) { runtime·printf("size=%d sizeclass=%d runtime·class_to_size=%d\n", n, sizeclass, runtime·class_to_size[sizeclass]); runtime·printf("incorrect SizeToClass"); @@ -133,6 +140,8 @@ runtime·InitSizes(void) } } + runtime·testdefersizes(); + // Copy out for statistics table. for(i=0; i>3]]; + else + return runtime·class_to_size[runtime·size_to_class128[(size-1024+127) >> 7]]; + } + if(size + PageSize < size) + return size; + return ROUND(size, PageSize); +} -- cgit v1.2.3