liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Copyright 2017 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 poll_test
 
import (
   "fmt"
   "internal/poll"
   "os"
   "sync"
   "syscall"
   "testing"
)
 
type loggedFD struct {
   Net string
   FD  *poll.FD
   Err error
}
 
var (
   logMu     sync.Mutex
   loggedFDs map[syscall.Handle]*loggedFD
)
 
func logFD(net string, fd *poll.FD, err error) {
   logMu.Lock()
   defer logMu.Unlock()
 
   loggedFDs[fd.Sysfd] = &loggedFD{
       Net: net,
       FD:  fd,
       Err: err,
   }
}
 
func init() {
   loggedFDs = make(map[syscall.Handle]*loggedFD)
   *poll.LogInitFD = logFD
}
 
func findLoggedFD(h syscall.Handle) (lfd *loggedFD, found bool) {
   logMu.Lock()
   defer logMu.Unlock()
 
   lfd, found = loggedFDs[h]
   return lfd, found
}
 
// checkFileIsNotPartOfNetpoll verifies that f is not managed by netpoll.
// It returns error, if check fails.
func checkFileIsNotPartOfNetpoll(f *os.File) error {
   lfd, found := findLoggedFD(syscall.Handle(f.Fd()))
   if !found {
       return fmt.Errorf("%v fd=%v: is not found in the log", f.Name(), f.Fd())
   }
   if lfd.FD.IsPartOfNetpoll() {
       return fmt.Errorf("%v fd=%v: is part of netpoll, but should not be (logged: net=%v err=%v)", f.Name(), f.Fd(), lfd.Net, lfd.Err)
   }
   return nil
}
 
func TestFileFdsAreInitialised(t *testing.T) {
   exe, err := os.Executable()
   if err != nil {
       t.Fatal(err)
   }
   f, err := os.Open(exe)
   if err != nil {
       t.Fatal(err)
   }
   defer f.Close()
 
   err = checkFileIsNotPartOfNetpoll(f)
   if err != nil {
       t.Fatal(err)
   }
}
 
func TestSerialFdsAreInitialised(t *testing.T) {
   for _, name := range []string{"COM1", "COM2", "COM3", "COM4"} {
       t.Run(name, func(t *testing.T) {
           h, err := syscall.CreateFile(syscall.StringToUTF16Ptr(name),
               syscall.GENERIC_READ|syscall.GENERIC_WRITE,
               0,
               nil,
               syscall.OPEN_EXISTING,
               syscall.FILE_ATTRIBUTE_NORMAL|syscall.FILE_FLAG_OVERLAPPED,
               0)
           if err != nil {
               if errno, ok := err.(syscall.Errno); ok {
                   switch errno {
                   case syscall.ERROR_FILE_NOT_FOUND,
                       syscall.ERROR_ACCESS_DENIED:
                       t.Log("Skipping: ", err)
                       return
                   }
               }
               t.Fatal(err)
           }
           f := os.NewFile(uintptr(h), name)
           defer f.Close()
 
           err = checkFileIsNotPartOfNetpoll(f)
           if err != nil {
               t.Fatal(err)
           }
       })
   }
}