|  | // 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++ | 
|  | } |