21
21
#include " swoole_reactor.h"
22
22
23
23
namespace swoole {
24
-
25
24
using network::Socket;
26
25
27
26
class ReactorPoll final : public ReactorImpl {
28
- uint32_t max_fd_num;
29
- Socket **fds_;
30
27
pollfd *events_;
31
- bool exists ( int fd) const ;
32
- void set_events (int index, int events ) const ;
28
+ int max_events_ ;
29
+ int set_events () const ;
33
30
34
31
public:
35
32
ReactorPoll (Reactor *_reactor, int max_events);
@@ -48,34 +45,30 @@ ReactorImpl *make_reactor_poll(Reactor *_reactor, int max_events) {
48
45
}
49
46
50
47
ReactorPoll::ReactorPoll (Reactor *_reactor, int max_events) : ReactorImpl(_reactor) {
51
- fds_ = new Socket *[max_events];
52
48
events_ = new pollfd[max_events];
53
-
54
- max_fd_num = max_events;
49
+ max_events_ = max_events;
55
50
reactor_->max_event_num = max_events;
56
51
}
57
52
58
53
ReactorPoll::~ReactorPoll () {
59
- delete[] fds_;
60
54
delete[] events_;
61
55
}
62
56
63
- void ReactorPoll::set_events (const int index, const int events) const {
64
- events_[index].events = 0 ;
65
- if (Reactor::isset_read_event (events)) {
66
- events_[index].events |= POLLIN;
67
- }
68
- if (Reactor::isset_write_event (events)) {
69
- events_[index].events |= POLLOUT;
70
- }
71
- if (Reactor::isset_error_event (events)) {
72
- events_[index].events |= POLLHUP;
57
+ int ReactorPoll::set_events () const {
58
+ const auto sockets = reactor_->get_sockets ();
59
+ int count = 0 ;
60
+ for (const auto pair : sockets) {
61
+ const auto _socket = pair.second ;
62
+ events_[count].fd = _socket->fd ;
63
+ events_[count].events = translate_events_to_poll (_socket->events );
64
+ events_[count].revents = 0 ;
65
+ count++;
73
66
}
67
+ return count;
74
68
}
75
69
76
70
int ReactorPoll::add (Socket *socket, const int events) {
77
- int fd = socket->fd ;
78
- if (exists (fd)) {
71
+ if (reactor_->_exists (socket)) {
79
72
swoole_error_log (
80
73
SW_LOG_WARNING,
81
74
SW_ERROR_EVENT_ADD_FAILED,
@@ -89,45 +82,38 @@ int ReactorPoll::add(Socket *socket, const int events) {
89
82
return SW_ERR;
90
83
}
91
84
92
- const int cur = reactor_->get_event_num ();
93
- if (reactor_->get_event_num () == max_fd_num) {
85
+ if (reactor_->get_event_num () == static_cast <size_t >(max_events_)) {
94
86
swoole_error_log (
95
- SW_LOG_WARNING, SW_ERROR_EVENT_ADD_FAILED, " too many sockets, the max events is %d" , max_fd_num );
87
+ SW_LOG_WARNING, SW_ERROR_EVENT_ADD_FAILED, " too many sockets, the max events is %d" , max_events_ );
96
88
swoole_print_backtrace_on_error ();
97
89
return SW_ERR;
98
90
}
99
91
92
+ swoole_trace (" fd=%d, events=%d" , socket->fd , events);
100
93
reactor_->_add (socket, events);
101
94
102
- swoole_trace (" fd=%d, events=%d" , fd, events);
103
-
104
- fds_[cur] = socket;
105
- events_[cur].fd = fd;
106
- set_events (cur, events);
107
-
108
95
return SW_OK;
109
96
}
110
97
111
98
int ReactorPoll::set (Socket *socket, int events) {
112
- swoole_trace (" fd=%d, events=%d" , socket->fd , events);
113
-
114
- SW_LOOP_N (reactor_->get_event_num ()) {
115
- if (events_[i].fd == socket->fd ) {
116
- set_events (i, events);
117
- reactor_->_set (socket, events);
118
- return SW_OK;
119
- }
99
+ if (!reactor_->_exists (socket)) {
100
+ swoole_error_log (
101
+ SW_LOG_WARNING,
102
+ SW_ERROR_SOCKET_NOT_EXISTS,
103
+ " [Reactor#%d] failed to set events[fd=%d, fd_type=%d, events=%d], the socket#%d has already been removed" ,
104
+ reactor_->id ,
105
+ socket->fd ,
106
+ socket->fd_type ,
107
+ events,
108
+ socket->fd );
109
+ swoole_print_backtrace_on_error ();
110
+ return SW_ERR;
120
111
}
121
112
122
- swoole_error_log (SW_LOG_WARNING,
123
- SW_ERROR_SOCKET_NOT_EXISTS,
124
- " [Reactor#%d] failed to set events[fd=%d, fd_type=%d, events=%d], the socket#%d is not exists" ,
125
- reactor_->id ,
126
- socket->fd ,
127
- socket->fd_type ,
128
- events,
129
- socket->fd );
130
- return SW_ERR;
113
+ swoole_trace (" fd=%d, events=%d" , socket->fd , events);
114
+ reactor_->_set (socket, events);
115
+
116
+ return SW_OK;
131
117
}
132
118
133
119
int ReactorPoll::del (Socket *socket) {
@@ -144,62 +130,46 @@ int ReactorPoll::del(Socket *socket) {
144
130
return SW_ERR;
145
131
}
146
132
147
- for (uint32_t i = 0 ; i < reactor_->get_event_num (); i++) {
148
- if (events_[i].fd == socket->fd ) {
149
- for (; i < reactor_->get_event_num (); i++) {
150
- if (i == reactor_->get_event_num () - 1 ) {
151
- fds_[i] = nullptr ;
152
- events_[i].fd = 0 ;
153
- events_[i].events = 0 ;
154
- } else {
155
- fds_[i] = fds_[i + 1 ];
156
- events_[i] = events_[i + 1 ];
157
- }
158
- }
159
- reactor_->_del (socket);
160
- return SW_OK;
161
- }
133
+ if (!reactor_->_exists (socket)) {
134
+ swoole_error_log (SW_LOG_WARNING,
135
+ SW_ERROR_SOCKET_NOT_EXISTS,
136
+ " [Reactor#%d] failed to delete events[fd=%d, fd_type=%d], the socket#%d is not exists" ,
137
+ reactor_->id ,
138
+ socket->fd ,
139
+ socket->fd_type ,
140
+ socket->fd );
141
+ swoole_print_backtrace_on_error ();
142
+ return SW_ERR;
162
143
}
163
144
164
- swoole_error_log (SW_LOG_WARNING,
165
- SW_ERROR_SOCKET_NOT_EXISTS,
166
- " [Reactor#%d] failed to delete events[fd=%d, fd_type=%d], the socket#%d is not exists" ,
167
- reactor_->id ,
168
- socket->fd ,
169
- socket->fd_type ,
170
- socket->fd );
171
- swoole_print_backtrace_on_error ();
172
-
173
- return SW_ERR;
145
+ reactor_->_del (socket);
146
+ return SW_OK;
174
147
}
175
148
176
149
int ReactorPoll::wait () {
177
150
Event event;
178
151
ReactorHandler handler;
179
152
180
- int ret;
181
153
reactor_->before_wait ();
182
154
183
155
while (reactor_->running ) {
184
156
reactor_->execute_begin_callback ();
185
-
186
- ret = poll (events_, reactor_-> get_event_num () , reactor_->get_timeout_msec ());
157
+ const int event_num = set_events ();
158
+ int ret = poll (events_, event_num , reactor_->get_timeout_msec ());
187
159
if (ret < 0 ) {
188
160
if (!reactor_->catch_error ()) {
189
- swoole_sys_warning (" [Reactor#%d] poll(nfds=%zu , timeout=%d) failed" ,
161
+ swoole_sys_warning (" [Reactor#%d] poll(nfds=%d , timeout=%d) failed" ,
190
162
reactor_->id ,
191
- reactor_-> get_event_num () ,
163
+ event_num ,
192
164
reactor_->get_timeout_msec ());
193
165
break ;
194
- } else {
195
- goto _continue;
196
166
}
197
167
} else if (ret == 0 ) {
198
168
reactor_->execute_end_callbacks (true );
199
169
SW_REACTOR_CONTINUE;
200
170
} else {
201
- for (uint32_t i = 0 ; i < reactor_-> get_event_num () ; i++) {
202
- event.socket = fds_ [i];
171
+ for (int i = 0 ; i < event_num ; i++) {
172
+ event.socket = reactor_-> get_socket (events_ [i]. fd ) ;
203
173
event.fd = events_[i].fd ;
204
174
event.reactor_id = reactor_->id ;
205
175
event.type = event.socket ->fd_type ;
@@ -245,20 +215,39 @@ int ReactorPoll::wait() {
245
215
}
246
216
}
247
217
}
248
- _continue:
249
218
reactor_->execute_end_callbacks (false );
250
219
SW_REACTOR_CONTINUE;
251
220
}
252
221
return SW_OK;
253
222
}
254
223
255
- bool ReactorPoll::exists (int fd) const {
256
- for (uint32_t i = 0 ; i < reactor_->get_event_num (); i++) {
257
- if (events_[i].fd == fd) {
258
- return true ;
259
- }
224
+ int16_t translate_events_to_poll (int events) {
225
+ int16_t poll_events = 0 ;
226
+
227
+ if (events & SW_EVENT_READ) {
228
+ poll_events |= POLLIN;
229
+ }
230
+ if (events & SW_EVENT_WRITE) {
231
+ poll_events |= POLLOUT;
260
232
}
261
- return false ;
233
+
234
+ return poll_events;
262
235
}
263
236
237
+ int translate_events_from_poll (int16_t events) {
238
+ int sw_events = 0 ;
239
+
240
+ if (events & POLLIN) {
241
+ sw_events |= SW_EVENT_READ;
242
+ }
243
+ if (events & POLLOUT) {
244
+ sw_events |= SW_EVENT_WRITE;
245
+ }
246
+ // ignore ERR and HUP, because event is already processed at IN and OUT handler.
247
+ if ((((events & POLLERR) || (events & POLLHUP)) && !((events & POLLIN) || (events & POLLOUT)))) {
248
+ sw_events |= SW_EVENT_ERROR;
249
+ }
250
+
251
+ return sw_events;
252
+ }
264
253
} // namespace swoole
0 commit comments