github.com/go-darwin/sys@v0.0.0-20220510002607-68fd01f054ca/testdata/testprog/syscall_windows.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "internal/syscall/windows" 9 "runtime" 10 "sync" 11 "syscall" 12 "unsafe" 13 ) 14 15 func init() { 16 register("RaiseException", RaiseException) 17 register("ZeroDivisionException", ZeroDivisionException) 18 register("StackMemory", StackMemory) 19 } 20 21 func RaiseException() { 22 const EXCEPTION_NONCONTINUABLE = 1 23 mod := syscall.MustLoadDLL("kernel32.dll") 24 proc := mod.MustFindProc("RaiseException") 25 proc.Call(0xbad, EXCEPTION_NONCONTINUABLE, 0, 0) 26 println("RaiseException should not return") 27 } 28 29 func ZeroDivisionException() { 30 x := 1 31 y := 0 32 z := x / y 33 println(z) 34 } 35 36 func getPagefileUsage() (uintptr, error) { 37 p, err := syscall.GetCurrentProcess() 38 if err != nil { 39 return 0, err 40 } 41 var m windows.PROCESS_MEMORY_COUNTERS 42 err = windows.GetProcessMemoryInfo(p, &m, uint32(unsafe.Sizeof(m))) 43 if err != nil { 44 return 0, err 45 } 46 return m.PagefileUsage, nil 47 } 48 49 func StackMemory() { 50 mem1, err := getPagefileUsage() 51 if err != nil { 52 panic(err) 53 } 54 const threadCount = 100 55 var wg sync.WaitGroup 56 for i := 0; i < threadCount; i++ { 57 wg.Add(1) 58 go func() { 59 runtime.LockOSThread() 60 wg.Done() 61 select {} 62 }() 63 } 64 wg.Wait() 65 mem2, err := getPagefileUsage() 66 if err != nil { 67 panic(err) 68 } 69 print((mem2 - mem1) / threadCount) 70 }