@@ -12,34 +12,54 @@ namespace enjoyc
12
12
int accept_hook (int fd, struct sockaddr * sockaddr, socklen_t * len)
13
13
{
14
14
auto co_event = ThreadContext::this_io_context ()->get_coevent (fd);
15
- DLOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
15
+ LOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
16
16
co_event->wait_read ();
17
- return ::accept (fd, sockaddr, len);
17
+
18
+ LOG (INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd << " can read " ;
19
+ return accept_syscall (fd, sockaddr, len);
18
20
}
19
21
20
22
int connect_hook (int fd, struct sockaddr * sockaddr, socklen_t len)
21
23
{
24
+ // must call connect_syscall first£¬ otherwise there's no wriable event can be polled
25
+ int ret = 0 ;
26
+ do
27
+ {
28
+ ret = connect_syscall (fd, sockaddr, len);
29
+ } while (ret < 0 && CHECK_ERROR (sys_errno (), EINTR));
30
+
31
+ if (ret < 0 )
32
+ {
33
+ int err = sys_errno ();
34
+ while (CHECK_ERROR (err, EWOULDBLOCK) || CHECK_ERROR (err, EINPROGRESS))
35
+ {
36
+ auto co_event = ThreadContext::this_io_context ()->get_coevent (fd);
37
+ co_event->wait_write ();
38
+ err = get_socket_error_syscall (fd);
39
+ LOG (INFO) << " err is " << err;
40
+ if (err == 0 )
41
+ return err;
42
+ }
43
+ }
44
+
45
+ return ret;
22
46
23
- auto co_event = ThreadContext::this_io_context ()->get_coevent (fd);
24
- DLOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
25
- co_event->wait_write ();
26
- return ::connect (fd, sockaddr, len);
27
47
}
28
48
29
49
ssize_t read_hook (int fd, const char * data, uint32_t len)
30
50
{
31
51
32
52
auto co_event = ThreadContext::this_io_context ()->get_coevent (fd);
33
53
34
- DLOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
54
+ DLOG (INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd;
35
55
co_event->wait_read ();
36
56
ssize_t read_size = 0 ;
37
57
do
38
58
{
39
- read_size = :: recv (fd, ( void *) data, len, MSG_NOSIGNAL );
40
- }while (read_size < 0 and (errno == EWOULDBLOCK or errno == EINTR));
41
-
42
- DLOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd << " size is " << read_size;
59
+ recv_syscall (fd, data, len, read_size );
60
+ } while (read_size < 0 && (errno == EWOULDBLOCK || errno == EINTR));
61
+
62
+ DLOG (INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd << " size is " << read_size;
43
63
return read_size;
44
64
}
45
65
@@ -48,25 +68,24 @@ namespace enjoyc
48
68
ssize_t write_size = 0 ;
49
69
50
70
// try to syswrite first
51
- do {
52
-
53
- write_size= ::send (fd, (void *)data, len, MSG_NOSIGNAL);
71
+ do {
72
+ send_syscall (fd, data, len, write_size);
54
73
55
- }while (write_size < 0 and (errno == EINTR));
56
- if (write_size >= 0 )
74
+ } while (write_size < 0 && (errno == EINTR));
75
+ if (write_size >= 0 )
57
76
{
58
77
return write_size;
59
78
}
60
79
61
80
// try co_event
62
81
auto co_event = ThreadContext::this_io_context ()->get_coevent (fd);
63
- DLOG (INFO) << __FUNCTION__ << " co_event " << co_event <<" with fd " << fd;
82
+ DLOG (INFO) << __FUNCTION__ << " co_event " << co_event << " with fd " << fd;
64
83
co_event->wait_write ();
65
84
66
85
do
67
86
{
68
- write_size= :: send (fd, ( void *) data, len, MSG_NOSIGNAL );
69
- }while (write_size < 0 and (errno == EWOULDBLOCK or errno == EINTR));
87
+ send_syscall (fd, data, len, write_size );
88
+ } while (write_size < 0 && (errno == EWOULDBLOCK || errno == EINTR));
70
89
71
90
return write_size;
72
91
}
0 commit comments