@@ -21,8 +21,7 @@ import (
21
21
"errors"
22
22
"syscall"
23
23
"testing"
24
-
25
- "golang.org/x/sys/unix"
24
+ "time"
26
25
)
27
26
28
27
func TestEpollEvent (t * testing.T ) {
@@ -54,11 +53,11 @@ func TestEpollEvent(t *testing.T) {
54
53
}
55
54
56
55
// EPOLL: add ,del and add
57
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event1 )
56
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event1 )
58
57
MustNil (t , err )
59
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , rfd , event1 )
58
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , rfd , event1 )
60
59
MustNil (t , err )
61
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event2 )
60
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event2 )
62
61
MustNil (t , err )
63
62
_ , err = syscall .Write (wfd , send )
64
63
MustNil (t , err )
@@ -68,15 +67,15 @@ func TestEpollEvent(t *testing.T) {
68
67
Equal (t , events [0 ].data , eventdata2 )
69
68
_ , err = syscall .Read (rfd , recv )
70
69
MustTrue (t , err == nil && string (recv ) == string (send ))
71
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , rfd , event2 )
70
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , rfd , event2 )
72
71
MustNil (t , err )
73
72
74
73
// EPOLL: add ,mod and mod
75
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event1 )
74
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event1 )
76
75
MustNil (t , err )
77
- err = EpollCtl (epollfd , unix .EPOLL_CTL_MOD , rfd , event2 )
76
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_MOD , rfd , event2 )
78
77
MustNil (t , err )
79
- err = EpollCtl (epollfd , unix .EPOLL_CTL_MOD , rfd , event3 )
78
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_MOD , rfd , event3 )
80
79
MustNil (t , err )
81
80
_ , err = syscall .Write (wfd , send )
82
81
MustNil (t , err )
@@ -88,7 +87,7 @@ func TestEpollEvent(t *testing.T) {
88
87
Assert (t , events [0 ].events & syscall .EPOLLIN != 0 )
89
88
Assert (t , events [0 ].events & syscall .EPOLLOUT != 0 )
90
89
91
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , rfd , event2 )
90
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , rfd , event2 )
92
91
MustNil (t , err )
93
92
}
94
93
@@ -110,7 +109,7 @@ func TestEpollWait(t *testing.T) {
110
109
events : syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR ,
111
110
data : eventdata ,
112
111
}
113
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event )
112
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event )
114
113
MustNil (t , err )
115
114
_ , err = epollWaitUntil (epollfd , events , - 1 )
116
115
MustNil (t , err )
@@ -146,7 +145,7 @@ func TestEpollWait(t *testing.T) {
146
145
// EPOLL: close current fd
147
146
rfd2 , wfd2 := GetSysFdPairs ()
148
147
defer syscall .Close (wfd2 )
149
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd2 , event )
148
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd2 , event )
150
149
err = syscall .Close (rfd2 )
151
150
MustNil (t , err )
152
151
_ , err = epollWaitUntil (epollfd , events , - 1 )
@@ -156,7 +155,7 @@ func TestEpollWait(t *testing.T) {
156
155
Assert (t , events [0 ].events & syscall .EPOLLRDHUP != 0 )
157
156
Assert (t , events [0 ].events & syscall .EPOLLERR == 0 )
158
157
159
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , rfd , event )
158
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , rfd , event )
160
159
MustNil (t , err )
161
160
}
162
161
@@ -173,7 +172,7 @@ func TestEpollETClose(t *testing.T) {
173
172
}
174
173
175
174
// EPOLL: init state
176
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event )
175
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event )
177
176
_ , err = epollWaitUntil (epollfd , events , - 1 )
178
177
MustNil (t , err )
179
178
Assert (t , events [0 ].events & syscall .EPOLLIN == 0 )
@@ -194,7 +193,7 @@ func TestEpollETClose(t *testing.T) {
194
193
// EPOLL: close peer fd
195
194
// EPOLLIN and EPOLLOUT
196
195
rfd , wfd = GetSysFdPairs ()
197
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event )
196
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event )
198
197
err = syscall .Close (wfd )
199
198
MustNil (t , err )
200
199
n , err = epollWaitUntil (epollfd , events , 100 )
@@ -224,10 +223,10 @@ func TestEpollETDel(t *testing.T) {
224
223
}
225
224
226
225
// EPOLL: del partly
227
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , rfd , event )
226
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , rfd , event )
228
227
MustNil (t , err )
229
228
event .events = syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
230
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , rfd , event )
229
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , rfd , event )
231
230
MustNil (t , err )
232
231
_ , err = syscall .Write (wfd , send )
233
232
MustNil (t , err )
@@ -268,7 +267,7 @@ func TestEpollConnectSameFD(t *testing.T) {
268
267
t .Logf ("create fd: %d" , fd1 )
269
268
err = syscall .SetNonblock (fd1 , true )
270
269
MustNil (t , err )
271
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , fd1 , event1 )
270
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , fd1 , event1 )
272
271
MustNil (t , err )
273
272
err = syscall .Connect (fd1 , & addr )
274
273
t .Log (err )
@@ -278,7 +277,7 @@ func TestEpollConnectSameFD(t *testing.T) {
278
277
//Assert(t, events[0].events&syscall.EPOLLRDHUP == 0)
279
278
//Assert(t, events[0].events&syscall.EPOLLERR == 0)
280
279
// forget to del fd
281
- //err = EpollCtl(epollfd, unix .EPOLL_CTL_DEL, fd1, event1)
280
+ //err = EpollCtl(epollfd, syscall .EPOLL_CTL_DEL, fd1, event1)
282
281
//MustNil(t, err)
283
282
err = syscall .Close (fd1 ) // close fd1
284
283
MustNil (t , err )
@@ -289,7 +288,7 @@ func TestEpollConnectSameFD(t *testing.T) {
289
288
t .Logf ("create fd: %d" , fd2 )
290
289
err = syscall .SetNonblock (fd2 , true )
291
290
MustNil (t , err )
292
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , fd2 , event2 )
291
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , fd2 , event2 )
293
292
MustNil (t , err )
294
293
err = syscall .Connect (fd2 , & addr )
295
294
t .Log (err )
@@ -298,7 +297,7 @@ func TestEpollConnectSameFD(t *testing.T) {
298
297
Assert (t , events [0 ].events & syscall .EPOLLOUT != 0 )
299
298
Assert (t , events [0 ].events & syscall .EPOLLRDHUP == 0 )
300
299
Assert (t , events [0 ].events & syscall .EPOLLERR == 0 )
301
- err = EpollCtl (epollfd , unix .EPOLL_CTL_DEL , fd2 , event2 )
300
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_DEL , fd2 , event2 )
302
301
MustNil (t , err )
303
302
err = syscall .Close (fd2 ) // close fd2
304
303
MustNil (t , err )
@@ -310,7 +309,7 @@ func TestEpollConnectSameFD(t *testing.T) {
310
309
t .Logf ("create fd: %d" , fd3 )
311
310
err = syscall .SetNonblock (fd3 , true )
312
311
MustNil (t , err )
313
- err = EpollCtl (epollfd , unix .EPOLL_CTL_ADD , fd3 , event1 )
312
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_ADD , fd3 , event1 )
314
313
MustNil (t , err )
315
314
err = syscall .Connect (fd3 , & addr )
316
315
t .Log (err )
@@ -320,7 +319,7 @@ func TestEpollConnectSameFD(t *testing.T) {
320
319
Assert (t , events [0 ].events & syscall .EPOLLRDHUP == 0 )
321
320
Assert (t , events [0 ].events & syscall .EPOLLERR == 0 )
322
321
MustNil (t , err )
323
- err = EpollCtl (epollfd , unix .EPOLL_CTL_MOD , fd3 , eventin )
322
+ err = EpollCtl (epollfd , syscall .EPOLL_CTL_MOD , fd3 , eventin )
324
323
MustNil (t , err )
325
324
err = syscall .Close (fd3 ) // close fd3
326
325
MustNil (t , err )
@@ -329,6 +328,55 @@ func TestEpollConnectSameFD(t *testing.T) {
329
328
Assert (t , n == 0 )
330
329
}
331
330
331
+ func TestRuntimeNetpoller (t * testing.T ) {
332
+ pfd , err := openPollFile ()
333
+ MustNil (t , err )
334
+
335
+ pd , errno := runtime_pollOpen (uintptr (pfd ))
336
+ Assert (t , errno == 0 , errno )
337
+ t .Logf ("poll open success: pd=%d" , pd )
338
+
339
+ var rfd , wfd = GetSysFdPairs ()
340
+
341
+ eventin := & epollevent {
342
+ events : syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR ,
343
+ data : [8 ]byte {0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
344
+ }
345
+ err = EpollCtl (pfd , syscall .EPOLL_CTL_ADD , rfd , eventin )
346
+ MustNil (t , err )
347
+
348
+ go func () {
349
+ time .Sleep (time .Millisecond * 100 )
350
+
351
+ iovec := [1 ]syscall.Iovec {}
352
+ buf := []byte ("hello" )
353
+ n , err := writev (wfd , [][]byte {buf }, iovec [:])
354
+ MustNil (t , err )
355
+ Equal (t , n , 5 )
356
+ t .Logf ("poll read success: %s" , string (buf [:n ]))
357
+ }()
358
+
359
+ begin := time .Now ()
360
+ errno = runtime_pollWait (pd , 'r' + 'w' )
361
+ Assert (t , errno == 0 , errno )
362
+ cost := time .Since (begin )
363
+ Assert (t , cost .Milliseconds () >= 100 )
364
+
365
+ events := make ([]epollevent , 1 )
366
+ n , err := EpollWait (pfd , events , 0 )
367
+ MustNil (t , err )
368
+ Equal (t , n , 1 )
369
+ t .Logf ("poll wait success" )
370
+
371
+ iovec := [1 ]syscall.Iovec {}
372
+ buf := make ([]byte , 1024 )
373
+ bs := [1 ][]byte {buf }
374
+ n , err = readv (rfd , bs [:], iovec [:])
375
+ MustNil (t , err )
376
+ Equal (t , n , 5 )
377
+ t .Logf ("poll read success: %s" , string (buf [:n ]))
378
+ }
379
+
332
380
func epollWaitUntil (epfd int , events []epollevent , msec int ) (n int , err error ) {
333
381
WAIT:
334
382
n , err = EpollWait (epfd , events , msec )
0 commit comments