@@ -16,14 +16,26 @@ const DEFAULT_READ_BUF_SIZE: usize = 256 * 1024;
16
16
17
17
#[ derive( Eq , Ord , PartialEq , PartialOrd , Copy , Clone ) ]
18
18
enum State {
19
+ /**
20
+ * Socket created.
21
+ */
19
22
NewSocket = 1 ,
23
+ /**
24
+ * Socket is marked to be shut down(write end).
25
+ */
20
26
ShuttingDown = 2 ,
27
+ /**
28
+ * Socket shut down(write end).
29
+ */
21
30
ShutDown = 3 ,
22
31
// Stopped = 4,
32
+ /**
33
+ * Both read side and write side of the socket have been closed.
34
+ */
23
35
Closed = 5 ,
24
36
}
25
37
26
- struct MsgItem {
38
+ struct MsgInfoItem {
27
39
msg : Vec < u8 > ,
28
40
cb : Option < Ref < ( ) > > ,
29
41
}
@@ -33,7 +45,10 @@ pub struct SeqpacketSocketWrap {
33
45
fd : i32 ,
34
46
env : Env ,
35
47
handle : * mut sys:: uv_poll_t ,
36
- msg_queue : LinkedList < MsgItem > ,
48
+ msg_queue : LinkedList < MsgInfoItem > ,
49
+ /**
50
+ * The length of bytes that we use to read buffers.
51
+ */
37
52
read_buf_size : usize ,
38
53
state : State ,
39
54
poll_events : i32 ,
@@ -46,6 +61,15 @@ impl UvRefence for SeqpacketSocketWrap {
46
61
}
47
62
}
48
63
64
+ /**
65
+ * We implement sockets with uv_poll_t:
66
+ *
67
+ * uv_poll_init()
68
+ * uv_poll_start()
69
+ * -> UV_READABLE, read(), socket()
70
+ * -> UV_WRITABLE, connect(), write()
71
+ * uv_poll_stop()
72
+ */
49
73
#[ napi]
50
74
impl SeqpacketSocketWrap {
51
75
#[ napi( constructor) ]
@@ -249,7 +273,7 @@ impl SeqpacketSocketWrap {
249
273
}
250
274
}
251
275
252
- fn finish_msg ( & self , mut msg : MsgItem ) -> Result < ( ) > {
276
+ fn finish_msg ( & self , mut msg : MsgInfoItem ) -> Result < ( ) > {
253
277
let env = self . env ;
254
278
255
279
if msg. cb . is_none ( ) {
@@ -282,7 +306,7 @@ impl SeqpacketSocketWrap {
282
306
}
283
307
284
308
fn _flush ( & mut self ) -> Result < ( ) > {
285
- let mut finished_msgs: LinkedList < MsgItem > = LinkedList :: new ( ) ;
309
+ let mut finished_msgs: LinkedList < MsgInfoItem > = LinkedList :: new ( ) ;
286
310
287
311
loop {
288
312
let msg = self . msg_queue . pop_front ( ) ;
@@ -547,7 +571,7 @@ impl SeqpacketSocketWrap {
547
571
let offset = offset. get_int32 ( ) ?;
548
572
let length = length. get_int32 ( ) ?;
549
573
let msg = buf_into_vec ( buf, offset, length) ?;
550
- self . msg_queue . push_back ( MsgItem {
574
+ self . msg_queue . push_back ( MsgInfoItem {
551
575
msg,
552
576
cb : match cb {
553
577
Some ( cb) => {
@@ -584,39 +608,22 @@ extern "C" fn on_close(handle: *mut sys::uv_handle_t) {
584
608
} ;
585
609
}
586
610
587
- // TODO use macro to simplify these
588
- extern "C" fn on_socket ( handle : * mut sys:: uv_poll_t , status : c_int , events : c_int ) {
589
- if status == sys:: uv_errno_t:: UV_ECANCELED as i32 {
590
- return ;
591
- }
592
-
593
- unsafe { assert ! ( !( * handle) . data. is_null( ) , "unexpected null handle data" ) ; } ;
594
- let data = unsafe { Box :: from_raw ( ( * handle) . data as * mut HandleData ) } ;
595
- let wrap = data. inner_mut_ref :: < & mut SeqpacketSocketWrap > ( ) . unwrap ( ) ;
596
- wrap. handle_socket ( status, events) ;
597
-
598
- Box :: into_raw ( data) ;
599
- }
600
-
601
- extern "C" fn on_connect ( handle : * mut sys:: uv_poll_t , status : c_int , events : c_int ) {
602
- if status == sys:: uv_errno_t:: UV_ECANCELED as i32 {
603
- return ;
604
- }
611
+ macro_rules! on_event {
612
+ ( $event: ident, $fn: ident) => {
613
+ extern "C" fn $event( handle: * mut sys:: uv_poll_t, status: c_int, events: c_int) {
614
+ if status == sys:: uv_errno_t:: UV_ECANCELED as i32 {
615
+ return ;
616
+ }
605
617
606
- unsafe { assert ! ( !( * handle) . data. is_null( ) , "unexpected null handle data" ) ; } ;
607
- let data = unsafe { Box :: from_raw ( ( * handle) . data as * mut HandleData ) } ;
608
- let wrap = data. inner_mut_ref :: < & mut SeqpacketSocketWrap > ( ) . unwrap ( ) ;
609
- wrap. handle_connect ( status, events) ;
610
- Box :: into_raw ( data) ;
618
+ unsafe { assert!( !( * handle) . data. is_null( ) , "unexpected null handle data" ) ; } ;
619
+ let data = unsafe { Box :: from_raw( ( * handle) . data as * mut HandleData ) } ;
620
+ let wrap = data. inner_mut_ref:: <& mut SeqpacketSocketWrap >( ) . unwrap( ) ;
621
+ wrap. $fn( status, events) ;
622
+ Box :: into_raw( data) ;
623
+ }
624
+ } ;
611
625
}
612
626
613
- extern "C" fn on_io ( handle : * mut sys:: uv_poll_t , status : c_int , events : c_int ) {
614
- if status == sys:: uv_errno_t:: UV_ECANCELED as i32 {
615
- return ;
616
- }
617
- unsafe { assert ! ( !( * handle) . data. is_null( ) , "unexpected null handle data" ) ; } ;
618
- let data = unsafe { Box :: from_raw ( ( * handle) . data as * mut HandleData ) } ;
619
- let wrap = data. inner_mut_ref :: < & mut SeqpacketSocketWrap > ( ) . unwrap ( ) ;
620
- wrap. handle_io ( status, events) ;
621
- Box :: into_raw ( data) ;
622
- }
627
+ on_event ! ( on_socket, handle_socket) ;
628
+ on_event ! ( on_connect, handle_connect) ;
629
+ on_event ! ( on_io, handle_io) ;
0 commit comments