@@ -321,8 +321,7 @@ static void __poller_tree_insert(struct __poller_node *node, poller_t *poller)
321321 rb_insert_color (& node -> rb , & poller -> timeo_tree );
322322}
323323
324- static inline void __poller_tree_erase (struct __poller_node * node ,
325- poller_t * poller )
324+ static void __poller_tree_erase (struct __poller_node * node , poller_t * poller )
326325{
327326 if (& node -> rb == poller -> tree_first )
328327 poller -> tree_first = rb_next (& node -> rb );
@@ -334,6 +333,34 @@ static inline void __poller_tree_erase(struct __poller_node *node,
334333 node -> in_rbtree = 0 ;
335334}
336335
336+ static void __poller_insert_node (struct __poller_node * node , poller_t * poller )
337+ {
338+ struct __poller_node * end ;
339+
340+ end = list_entry (poller -> timeo_list .prev , struct __poller_node , list );
341+ if (list_empty (& poller -> timeo_list ))
342+ {
343+ list_add (& node -> list , & poller -> timeo_list );
344+ end = rb_entry (poller -> tree_first , struct __poller_node , rb );
345+ }
346+ else if (__timeout_cmp (node , end ) >= 0 )
347+ {
348+ list_add_tail (& node -> list , & poller -> timeo_list );
349+ return ;
350+ }
351+ else
352+ {
353+ __poller_tree_insert (node , poller );
354+ if (& node -> rb != poller -> tree_first )
355+ return ;
356+
357+ end = list_entry (poller -> timeo_list .next , struct __poller_node , list );
358+ }
359+
360+ if (!poller -> tree_first || __timeout_cmp (node , end ) < 0 )
361+ __poller_set_timerfd (poller -> timerfd , & node -> timeout , poller );
362+ }
363+
337364static int __poller_remove_node (struct __poller_node * node , poller_t * poller )
338365{
339366 int removed ;
@@ -967,10 +994,7 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
967994 break ;
968995
969996 if (node -> data .fd >= 0 )
970- {
971997 poller -> nodes [node -> data .fd ] = NULL ;
972- __poller_del_fd (node -> data .fd , node -> event , poller );
973- }
974998 else
975999 node -> removed = 1 ;
9761000
@@ -984,10 +1008,7 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
9841008 break ;
9851009
9861010 if (node -> data .fd >= 0 )
987- {
9881011 poller -> nodes [node -> data .fd ] = NULL ;
989- __poller_del_fd (node -> data .fd , node -> event , poller );
990- }
9911012 else
9921013 node -> removed = 1 ;
9931014
@@ -1004,6 +1025,8 @@ static void __poller_handle_timeout(const struct __poller_node *time_node,
10041025 node = list_entry (pos , struct __poller_node , list );
10051026 if (node -> data .fd >= 0 )
10061027 {
1028+ __poller_del_fd (node -> data .fd , node -> event , poller );
1029+
10071030 node -> error = ETIMEDOUT ;
10081031 node -> state = PR_ST_ERROR ;
10091032 }
@@ -1258,35 +1281,6 @@ int poller_start(poller_t *poller)
12581281 return - poller -> stopped ;
12591282}
12601283
1261- static void __poller_insert_node (struct __poller_node * node ,
1262- poller_t * poller )
1263- {
1264- struct __poller_node * end ;
1265-
1266- end = list_entry (poller -> timeo_list .prev , struct __poller_node , list );
1267- if (list_empty (& poller -> timeo_list ))
1268- {
1269- list_add (& node -> list , & poller -> timeo_list );
1270- end = rb_entry (poller -> tree_first , struct __poller_node , rb );
1271- }
1272- else if (__timeout_cmp (node , end ) >= 0 )
1273- {
1274- list_add_tail (& node -> list , & poller -> timeo_list );
1275- return ;
1276- }
1277- else
1278- {
1279- __poller_tree_insert (node , poller );
1280- if (& node -> rb != poller -> tree_first )
1281- return ;
1282-
1283- end = list_entry (poller -> timeo_list .next , struct __poller_node , list );
1284- }
1285-
1286- if (!poller -> tree_first || __timeout_cmp (node , end ) < 0 )
1287- __poller_set_timerfd (poller -> timerfd , & node -> timeout , poller );
1288- }
1289-
12901284static void __poller_node_set_timeout (int timeout , struct __poller_node * node )
12911285{
12921286 clock_gettime (CLOCK_MONOTONIC , & node -> timeout );
@@ -1653,10 +1647,6 @@ void poller_stop(poller_t *poller)
16531647 poller -> stopped = 1 ;
16541648
16551649 pthread_mutex_lock (& poller -> mutex );
1656- close (poller -> pipe_wr );
1657- __poller_handle_pipe (poller );
1658- close (poller -> pipe_rd );
1659-
16601650 poller -> tree_first = NULL ;
16611651 poller -> tree_last = NULL ;
16621652 while (poller -> timeo_tree .rb_node )
@@ -1672,18 +1662,22 @@ void poller_stop(poller_t *poller)
16721662 {
16731663 node = list_entry (pos , struct __poller_node , list );
16741664 if (node -> data .fd >= 0 )
1675- {
16761665 poller -> nodes [node -> data .fd ] = NULL ;
1677- __poller_del_fd (node -> data .fd , node -> event , poller );
1678- }
16791666 else
16801667 node -> removed = 1 ;
16811668 }
16821669
16831670 pthread_mutex_unlock (& poller -> mutex );
1671+ close (poller -> pipe_wr );
1672+ __poller_handle_pipe (poller );
1673+ close (poller -> pipe_rd );
1674+
16841675 list_for_each_safe (pos , tmp , & node_list )
16851676 {
16861677 node = list_entry (pos , struct __poller_node , list );
1678+ if (node -> data .fd >= 0 )
1679+ __poller_del_fd (node -> data .fd , node -> event , poller );
1680+
16871681 node -> error = 0 ;
16881682 node -> state = PR_ST_STOPPED ;
16891683 free (node -> res );
0 commit comments