1
2
3
4
5
6
7
8 package poll
9
10 import (
11 "syscall"
12 "time"
13 )
14
15 type pollDesc struct {
16 fd *FD
17 closing bool
18 }
19
20 func (pd *pollDesc) init(fd *FD) error { pd.fd = fd; return nil }
21
22 func (pd *pollDesc) close() {}
23
24 func (pd *pollDesc) evict() {
25 pd.closing = true
26 if pd.fd != nil {
27 syscall.StopIO(pd.fd.Sysfd)
28 }
29 }
30
31 func (pd *pollDesc) prepare(mode int, isFile bool) error {
32 if pd.closing {
33 return errClosing(isFile)
34 }
35 return nil
36 }
37
38 func (pd *pollDesc) prepareRead(isFile bool) error { return pd.prepare('r', isFile) }
39
40 func (pd *pollDesc) prepareWrite(isFile bool) error { return pd.prepare('w', isFile) }
41
42 func (pd *pollDesc) wait(mode int, isFile bool) error {
43 if pd.closing {
44 return errClosing(isFile)
45 }
46 if isFile {
47 return nil
48 }
49 return ErrDeadlineExceeded
50 }
51
52 func (pd *pollDesc) waitRead(isFile bool) error { return pd.wait('r', isFile) }
53
54 func (pd *pollDesc) waitWrite(isFile bool) error { return pd.wait('w', isFile) }
55
56 func (pd *pollDesc) waitCanceled(mode int) {}
57
58 func (pd *pollDesc) pollable() bool { return true }
59
60
61 func (fd *FD) SetDeadline(t time.Time) error {
62 return setDeadlineImpl(fd, t, 'r'+'w')
63 }
64
65
66 func (fd *FD) SetReadDeadline(t time.Time) error {
67 return setDeadlineImpl(fd, t, 'r')
68 }
69
70
71 func (fd *FD) SetWriteDeadline(t time.Time) error {
72 return setDeadlineImpl(fd, t, 'w')
73 }
74
75 func setDeadlineImpl(fd *FD, t time.Time, mode int) error {
76 d := t.UnixNano()
77 if t.IsZero() {
78 d = 0
79 }
80 if err := fd.incref(); err != nil {
81 return err
82 }
83 switch mode {
84 case 'r':
85 syscall.SetReadDeadline(fd.Sysfd, d)
86 case 'w':
87 syscall.SetWriteDeadline(fd.Sysfd, d)
88 case 'r' + 'w':
89 syscall.SetReadDeadline(fd.Sysfd, d)
90 syscall.SetWriteDeadline(fd.Sysfd, d)
91 }
92 fd.decref()
93 return nil
94 }
95
96
97
98 func IsPollDescriptor(fd uintptr) bool {
99 return false
100 }
101
View as plain text