aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2018-05-26 09:08:51 +1000
committerAlex Brainman <alex.brainman@gmail.com>2018-05-26 03:56:12 +0000
commitdbafdac0c11fa569b2143f896f169d1e37fc311c (patch)
tree0b3579b0dde83964187ea6d7ee752aad18c2dc61 /src/runtime
parent1ba26a33ceef7600e9801bbccf529b1112013c1a (diff)
downloadgo-dbafdac0c11fa569b2143f896f169d1e37fc311c.tar.xz
runtime: implement TestCallbackInAnotherThread
Updates #6751 Change-Id: Ibb176a17e67c67f855bc4f3e5462dddaedaa8a58 Reviewed-on: https://go-review.googlesource.com/114755 Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/syscall_windows_test.go34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/runtime/syscall_windows_test.go b/src/runtime/syscall_windows_test.go
index dfde12a211..2b057213f2 100644
--- a/src/runtime/syscall_windows_test.go
+++ b/src/runtime/syscall_windows_test.go
@@ -251,7 +251,39 @@ func TestBlockingCallback(t *testing.T) {
}
func TestCallbackInAnotherThread(t *testing.T) {
- // TODO: test a function which calls back in another thread: QueueUserAPC() or CreateThread()
+ t.Skip("Skipping failing test (see golang.org/issue/6751 for details)")
+
+ d := GetDLL(t, "kernel32.dll")
+
+ f := func(p uintptr) uintptr {
+ return p
+ }
+ r, _, err := d.Proc("CreateThread").Call(0, 0, syscall.NewCallback(f), 123, 0, 0)
+ if r == 0 {
+ t.Fatalf("CreateThread failed: %v", err)
+ }
+ h := syscall.Handle(r)
+ defer syscall.CloseHandle(h)
+
+ switch s, err := syscall.WaitForSingleObject(h, 100); s {
+ case syscall.WAIT_OBJECT_0:
+ break
+ case syscall.WAIT_TIMEOUT:
+ t.Fatal("timeout waiting for thread to exit")
+ case syscall.WAIT_FAILED:
+ t.Fatalf("WaitForSingleObject failed: %v", err)
+ default:
+ t.Fatalf("WaitForSingleObject returns unexpected value %v", s)
+ }
+
+ var ec uint32
+ r, _, err = d.Proc("GetExitCodeThread").Call(uintptr(h), uintptr(unsafe.Pointer(&ec)))
+ if r == 0 {
+ t.Fatalf("GetExitCodeThread failed: %v", err)
+ }
+ if ec != 123 {
+ t.Fatalf("expected 123, but got %d", ec)
+ }
}
type cbDLLFunc int // int determines number of callback parameters