github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/cmds/core/elvish/sys/wait_windows.go (about) 1 package sys 2 3 import ( 4 "errors" 5 "unsafe" 6 7 "golang.org/x/sys/windows" 8 ) 9 10 const ( 11 INFINITE = 0xFFFFFFFF 12 ) 13 14 const ( 15 WAIT_OBJECT_0 = 0 16 WAIT_ABANDONED_0 = 0x00000080 17 WAIT_TIMEOUT = 0x00000102 18 WAIT_FAILED = 0xFFFFFFFF 19 ) 20 21 var ( 22 waitForMultipleObjects = kernel32.NewProc("WaitForMultipleObjects") 23 errTimeout = errors.New("WaitForMultipleObjects timeout") 24 ) 25 26 // WaitForMultipleObjects blocks until any of the objects is triggerd or 27 // timeout. 28 // 29 // DWORD WINAPI WaitForMultipleObjects( 30 // _In_ DWORD nCount, 31 // _In_ const HANDLE *lpHandles, 32 // _In_ BOOL bWaitAll, 33 // _In_ DWORD dwMilliseconds 34 // ); 35 func WaitForMultipleObjects(handles []windows.Handle, waitAll bool, 36 timeout uint32) (trigger int, abandoned bool, err error) { 37 38 count := uintptr(len(handles)) 39 ret, _, err := waitForMultipleObjects.Call(count, 40 uintptr(unsafe.Pointer(&handles[0])), boolToUintptr(waitAll), uintptr(timeout)) 41 switch { 42 case WAIT_OBJECT_0 <= ret && ret < WAIT_OBJECT_0+count: 43 return int(ret - WAIT_OBJECT_0), false, nil 44 case WAIT_ABANDONED_0 <= ret && ret < WAIT_ABANDONED_0+count: 45 return int(ret - WAIT_ABANDONED_0), true, nil 46 case ret == WAIT_TIMEOUT: 47 return -1, false, errTimeout 48 default: 49 return -1, false, err 50 } 51 } 52 53 func boolToUintptr(b bool) uintptr { 54 if b { 55 return 1 56 } 57 return 0 58 }