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