From db054ec106f2660a4cb0fdb66012af0327dbe097 Mon Sep 17 00:00:00 2001 From: kestrelcjx Date: Sat, 20 Nov 2021 17:34:10 +0800 Subject: [PATCH] fix(process): fix the bug that the program is hung when getting the file name --- process/process_windows.go | 43 ++++++++++++++++++++++++++++--------------- v3/process/process_windows.go | 43 ++++++++++++++++++++++++++++--------------- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/process/process_windows.go b/process/process_windows.go index 9a1f548..cd86646 100644 --- a/process/process_windows.go +++ b/process/process_windows.go @@ -12,6 +12,7 @@ import ( "reflect" "strings" "syscall" + "time" "unicode/utf16" "unsafe" @@ -720,24 +721,36 @@ func (p *Process) OpenFilesWithContext(ctx context.Context) ([]OpenFilesStat, er continue } - var buf [syscall.MAX_LONG_PATH]uint16 - n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) - if err != nil { - continue - } + var fileName string + ch := make(chan struct{}) + + go func() { + var buf [syscall.MAX_LONG_PATH]uint16 + n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) + if err != nil { + return + } - fileName := string(utf16.Decode(buf[:n])) - fileInfo, _ := os.Stat(fileName) - if fileInfo.IsDir() { + fileName = string(utf16.Decode(buf[:n])) + ch <- struct{}{} + }() + + select { + case <-time.NewTimer(100 * time.Millisecond).C: continue - } + case <-ch: + fileInfo, _ := os.Stat(fileName) + if fileInfo.IsDir() { + continue + } - if _, exists := fileExists[fileName]; !exists { - files = append(files, OpenFilesStat{ - Path: fileName, - Fd: uint64(file), - }) - fileExists[fileName] = true + if _, exists := fileExists[fileName]; !exists { + files = append(files, OpenFilesStat{ + Path: fileName, + Fd: uint64(file), + }) + fileExists[fileName] = true + } } } diff --git a/v3/process/process_windows.go b/v3/process/process_windows.go index 2aaedcd..373bb3f 100644 --- a/v3/process/process_windows.go +++ b/v3/process/process_windows.go @@ -12,6 +12,7 @@ import ( "reflect" "strings" "syscall" + "time" "unicode/utf16" "unsafe" @@ -707,24 +708,36 @@ func (p *Process) OpenFilesWithContext(ctx context.Context) ([]OpenFilesStat, er continue } - var buf [syscall.MAX_LONG_PATH]uint16 - n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) - if err != nil { - continue - } + var fileName string + ch := make(chan struct{}) + + go func() { + var buf [syscall.MAX_LONG_PATH]uint16 + n, err := windows.GetFinalPathNameByHandle(windows.Handle(file), &buf[0], syscall.MAX_LONG_PATH, 0) + if err != nil { + return + } - fileName := string(utf16.Decode(buf[:n])) - fileInfo, _ := os.Stat(fileName) - if fileInfo.IsDir() { + fileName = string(utf16.Decode(buf[:n])) + ch <- struct{}{} + }() + + select { + case <-time.NewTimer(100 * time.Millisecond).C: continue - } + case <-ch: + fileInfo, _ := os.Stat(fileName) + if fileInfo.IsDir() { + continue + } - if _, exists := fileExists[fileName]; !exists { - files = append(files, OpenFilesStat{ - Path: fileName, - Fd: uint64(file), - }) - fileExists[fileName] = true + if _, exists := fileExists[fileName]; !exists { + files = append(files, OpenFilesStat{ + Path: fileName, + Fd: uint64(file), + }) + fileExists[fileName] = true + } } }