| // 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 cgotest |
| |
| //void testHandleLeaks(); |
| import "C" |
| |
| import ( |
| "syscall" |
| "testing" |
| "unsafe" |
| ) |
| |
| var issue8517counter int |
| |
| var ( |
| kernel32 = syscall.MustLoadDLL("kernel32.dll") |
| getProcessHandleCount = kernel32.MustFindProc("GetProcessHandleCount") |
| ) |
| |
| func processHandleCount(t *testing.T) int { |
| const current_process = ^uintptr(0) |
| var c uint32 |
| r, _, err := getProcessHandleCount.Call(current_process, uintptr(unsafe.Pointer(&c))) |
| if r == 0 { |
| t.Fatal(err) |
| } |
| return int(c) |
| } |
| |
| func test8517(t *testing.T) { |
| c1 := processHandleCount(t) |
| C.testHandleLeaks() |
| c2 := processHandleCount(t) |
| if c1+issue8517counter <= c2 { |
| t.Fatalf("too many handles leaked: issue8517counter=%v c1=%v c2=%v", issue8517counter, c1, c2) |
| } |
| } |
| |
| //export testHandleLeaksCallback |
| func testHandleLeaksCallback() { |
| issue8517counter++ |
| } |