]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix empty heap dump bug on windows.
authorShenghou Ma <minux.ma@gmail.com>
Sat, 31 May 2014 08:09:48 +0000 (01:09 -0700)
committerShenghou Ma <minux.ma@gmail.com>
Sat, 31 May 2014 08:09:48 +0000 (01:09 -0700)
Fixes #8119.

LGTM=khr, rsc
R=alex.brainman, khr, bradfitz, rsc
CC=golang-codereviews
https://golang.org/cl/93640044

src/pkg/runtime/debug/heapdump_test.go [new file with mode: 0644]
src/pkg/runtime/os_plan9.c
src/pkg/runtime/os_solaris.c
src/pkg/runtime/os_windows.c
src/pkg/runtime/runtime.h

diff --git a/src/pkg/runtime/debug/heapdump_test.go b/src/pkg/runtime/debug/heapdump_test.go
new file mode 100644 (file)
index 0000000..6ded7e9
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package debug
+
+import (
+       "io/ioutil"
+       "os"
+       "testing"
+)
+
+func TestWriteHeapDumpNonempty(t *testing.T) {
+       f, err := ioutil.TempFile("", "heapdumptest")
+       if err != nil {
+               t.Fatalf("TempFile failed: %v", err)
+       }
+       defer os.Remove(f.Name())
+       defer f.Close()
+       WriteHeapDump(f.Fd())
+       fi, err := f.Stat()
+       if err != nil {
+               t.Fatalf("Stat failed: %v", err)
+       }
+       const minSize = 1
+       if size := fi.Size(); size < minSize {
+               t.Fatalf("Heap dump size %d bytes, expected at least %d bytes", size, minSize)
+       }
+}
index ec88738c3884a1cf2a8661252f177c0001c6f8fb..14d4fae4868889f2a917557297143e90f7194e88 100644 (file)
@@ -394,9 +394,9 @@ runtime·read(int32 fd, void *buf, int32 nbytes)
 }
 
 int32
-runtime·write(int32 fd, void *buf, int32 nbytes)
+runtime·write(uintptr fd, void *buf, int32 nbytes)
 {
-       return runtime·pwrite(fd, buf, nbytes, -1LL);
+       return runtime·pwrite((int32)fd, buf, nbytes, -1LL);
 }
 
 uintptr
index 3575f693db1338bba1c17a534748b63b511e0837..75e7c18f4fdaf3d4a7b8b7f86153c39b823a5c7a 100644 (file)
@@ -570,7 +570,7 @@ runtime·usleep(uint32 us)
 }
 
 int32
-runtime·write(int32 fd, void* buf, int32 nbyte)
+runtime·write(uintptr fd, void* buf, int32 nbyte)
 {
        return runtime·sysvicall6(libc·write, 3, (uintptr)fd, (uintptr)buf, (uintptr)nbyte);
 }
index 4d5ea3bf45155a0da2708f8e327255318e4b2324..0dd44ed1b976c6ebace5e35807b1d7271c137acb 100644 (file)
@@ -166,7 +166,7 @@ runtime·exit(int32 code)
 }
 
 int32
-runtime·write(int32 fd, void *buf, int32 n)
+runtime·write(uintptr fd, void *buf, int32 n)
 {
        void *handle;
        uint32 written;
@@ -180,7 +180,9 @@ runtime·write(int32 fd, void *buf, int32 n)
                handle = runtime·stdcall(runtime·GetStdHandle, 1, (uintptr)-12);
                break;
        default:
-               return -1;
+               // assume fd is real windows handle.
+               handle = (void*)fd;
+               break;
        }
        runtime·stdcall(runtime·WriteFile, 5, handle, buf, (uintptr)n, &written, (uintptr)0);
        return written;
index 39a849c80588d97e996ba092c890708199901189..fa6b6ffa0424220bc485326734d82e4d3cc54038 100644 (file)
@@ -838,7 +838,7 @@ int32       runtime·gotraceback(bool *crash);
 void   runtime·goroutineheader(G*);
 int32  runtime·open(int8*, int32, int32);
 int32  runtime·read(int32, void*, int32);
-int32  runtime·write(int32, void*, int32);
+int32  runtime·write(uintptr, void*, int32); // use uintptr to accommodate windows.
 int32  runtime·close(int32);
 int32  runtime·mincore(void*, uintptr, byte*);
 void   runtime·jmpdefer(FuncVal*, void*);