]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix MemStats on 32-bits
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 19 Aug 2014 07:53:20 +0000 (11:53 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Tue, 19 Aug 2014 07:53:20 +0000 (11:53 +0400)
Int64's do not fit into uintptr's.

LGTM=khr
R=golang-codereviews, khr, rsc
CC=golang-codereviews, rlh
https://golang.org/cl/128380043

src/pkg/runtime/gc_test.go
src/pkg/runtime/malloc.go
src/pkg/runtime/mgc0.c

index 073d9fa75847111e5f6ee239862d2128a2902f69..383af5be3ddbd5dfc4780205f01a3df11ea5f1db 100644 (file)
@@ -164,6 +164,10 @@ func TestGcLastTime(t *testing.T) {
        if t0 > last || last > t1 {
                t.Fatalf("bad last GC time: got %v, want [%v, %v]", last, t0, t1)
        }
+       pause := ms.PauseNs[(ms.NumGC+255)%256]
+       if pause == 0 || pause > 10e9 {
+               t.Fatalf("bad last GC pause: got %v, want [0, 10e9]", pause)
+       }
 }
 
 var hugeSink interface{}
index ce7e0621092b1bb5dcdd19e40c8e2fd412c044e6..84c69abde706d91385c689289fc741785aa42cc5 100644 (file)
@@ -477,11 +477,12 @@ func gogc(force int32) {
                        startTime = gonanotime()
                }
                // switch to g0, call gc, then switch back
-               mp.scalararg[0] = uint(startTime)
+               mp.scalararg[0] = uint(uint32(startTime)) // low 32 bits
+               mp.scalararg[1] = uint(startTime >> 32)   // high 32 bits
                if force >= 2 {
-                       mp.scalararg[1] = 1 // eagersweep
+                       mp.scalararg[2] = 1 // eagersweep
                } else {
-                       mp.scalararg[1] = 0
+                       mp.scalararg[2] = 0
                }
                onM(&gc_m)
        }
index 3583d77d19550ae94338e5d6122c6a9b6fbb2ee0..60a6181fc94cb68f1c60f1923cd843184530e02d 100644 (file)
@@ -1401,8 +1401,8 @@ runtime·gc_m(void)
        gp->status = Gwaiting;
        gp->waitreason = "garbage collection";
 
-       a.start_time = g->m->scalararg[0];
-       a.eagersweep = g->m->scalararg[1];
+       a.start_time = (uint64)(g->m->scalararg[0]) | ((uint64)(g->m->scalararg[1]) << 32);
+       a.eagersweep = g->m->scalararg[2];
        gc(&a);
 
        gp->status = Grunning;