|
8 | 8 | #include <gr_api.h>
|
9 | 9 | #include <gr_log.h>
|
10 | 10 | #include <gr_macro.h>
|
| 11 | +#include <gr_vec.h> |
11 | 12 |
|
12 | 13 | #include <event2/event.h>
|
13 | 14 |
|
@@ -168,13 +169,6 @@ static void read_cb(evutil_socket_t sock, short what, void * /*priv*/) {
|
168 | 169 | event_free_finalize(0, ev, finalize_fd);
|
169 | 170 | }
|
170 | 171 |
|
171 |
| -static int close_connections(const struct event_base *, const struct event *ev, void * /*priv*/) { |
172 |
| - event_callback_fn cb = event_get_callback(ev); |
173 |
| - if (cb == read_cb || cb == write_cb) |
174 |
| - event_free_finalize(0, (struct event *)ev, finalize_fd); |
175 |
| - return 0; |
176 |
| -} |
177 |
| - |
178 | 172 | static void listen_cb(evutil_socket_t sock, short what, void * /*priv*/) {
|
179 | 173 | struct event *ev;
|
180 | 174 | int fd;
|
@@ -246,9 +240,23 @@ int api_socket_start(struct event_base *base) {
|
246 | 240 | return 0;
|
247 | 241 | }
|
248 | 242 |
|
| 243 | +static int collect_clients(const struct event_base *, const struct event *ev, void *priv) { |
| 244 | + struct event ***events = priv; |
| 245 | + event_callback_fn cb = event_get_callback(ev); |
| 246 | + if (cb == read_cb || cb == write_cb) |
| 247 | + gr_vec_add(*events, (struct event *)ev); |
| 248 | + return 0; |
| 249 | +} |
| 250 | + |
249 | 251 | void api_socket_stop(struct event_base *) {
|
| 252 | + struct event **events = NULL; |
| 253 | + struct event *ev; |
| 254 | + |
250 | 255 | if (ev_listen != NULL)
|
251 | 256 | event_free_finalize(0, ev_listen, finalize_fd);
|
252 | 257 |
|
253 |
| - event_base_foreach_event(ev_base, close_connections, NULL); |
| 258 | + event_base_foreach_event(ev_base, collect_clients, &events); |
| 259 | + gr_vec_foreach (ev, events) |
| 260 | + event_free_finalize(0, ev, finalize_fd); |
| 261 | + gr_vec_free(events); |
254 | 262 | }
|
0 commit comments