@@ -263,6 +263,9 @@ void ShubInitialize(Shub* shub, ShubParams* params)
263
263
shub -> output = -1 ;
264
264
#ifdef USE_EPOLL
265
265
shub -> epollfd = epoll_create (MAX_EVENTS );
266
+ if (shub -> epollfd < 0 ) {
267
+ shub -> params -> error_handler ("Failed to create epoll" , SHUB_FATAL_ERROR );
268
+ }
266
269
#else
267
270
FD_ZERO (& shub -> inset );
268
271
shub -> max_fd = 0 ;
@@ -299,14 +302,15 @@ void ShubLoop(Shub* shub)
299
302
int i , rc ;
300
303
#ifdef USE_EPOLL
301
304
struct epoll_event events [MAX_EVENTS ];
302
- rc = epoll_wait (shub -> epollfd , events , MAX_EVENTS , shub -> params -> delay );
305
+ rc = epoll_wait (shub -> epollfd , events , MAX_EVENTS , shub -> in_buffer_used == 0 ? -1 : shub -> params -> delay );
303
306
#else
304
307
fd_set events ;
305
308
struct timeval tm ;
306
309
int max_fd = shub -> max_fd ;
307
310
308
311
tm .tv_sec = shub -> params -> delay /1000 ;
309
312
tm .tv_usec = shub -> params -> delay % 1000 * 1000 ;
313
+ events = shub -> inset ;
310
314
311
315
rc = select (max_fd + 1 , & events , NULL , NULL , shub -> in_buffer_used == 0 ? NULL : & tm );
312
316
#endif
@@ -320,8 +324,14 @@ void ShubLoop(Shub* shub)
320
324
#ifdef USE_EPOLL
321
325
int j ;
322
326
for (j = 0 ; j < rc ; j ++ ) {
323
- {
324
- i = events [j ].data .fd ;
327
+ i = events [j ].data .fd ;
328
+ fprintf (stderr , "events[j].events=%d, events[j].data.fd=%d\n" , events [j ].events , events [j ].data .fd );
329
+ if (events [j ].events & EPOLLERR ) {
330
+ if (i != shub -> input && i != shub -> output ) {
331
+ notify_disconnect (shub , i );
332
+ }
333
+ close_socket (shub , i );
334
+ } else if (events [j ].events & EPOLLIN ) {
325
335
#else
326
336
for (i = 0 ; i <= max_fd ; i ++ ) {
327
337
if (FD_ISSET (i , & events )) {
@@ -331,7 +341,7 @@ void ShubLoop(Shub* shub)
331
341
if (s < 0 ) {
332
342
shub -> params -> error_handler ("Failed to accept socket" , SHUB_RECOVERABLE_ERROR );
333
343
} else {
334
- ShubAddSocket (shub , i );
344
+ ShubAddSocket (shub , s );
335
345
}
336
346
} else if (i == shub -> output ) { /* receive response from server */
337
347
/* try to read as much as possible */
0 commit comments