@@ -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 */