@@ -52,6 +52,7 @@ static pthread_cond_t *uev_condp = &uev_cond;
5252static uev_trigger * my_uev_trigger ;
5353static void * my_trigger_data ;
5454static int servicing_uev ;
55+ static int adding_uev ; /* uatomic access only */
5556
5657struct uevent_filter_state {
5758 struct list_head uevq ;
@@ -70,13 +71,14 @@ static void reset_filter_state(struct uevent_filter_state *st)
7071
7172int is_uevent_busy (void )
7273{
73- int empty , servicing ;
74+ int empty , servicing , adding ;
7475
7576 pthread_mutex_lock (uevq_lockp );
7677 empty = list_empty (& uevq );
7778 servicing = servicing_uev ;
79+ adding = uatomic_read (& adding_uev );
7880 pthread_mutex_unlock (uevq_lockp );
79- return (!empty || servicing );
81+ return (!empty || servicing || adding );
8082}
8183
8284struct uevent * alloc_uevent (void )
@@ -730,6 +732,7 @@ int uevent_listen(struct udev *udev)
730732 int fdcount , events ;
731733 struct pollfd ev_poll = { .fd = fd , .events = POLLIN , };
732734
735+ uatomic_set (& adding_uev , 0 );
733736 fdcount = poll (& ev_poll , 1 , -1 );
734737 if (fdcount < 0 ) {
735738 if (errno == EINTR )
@@ -739,6 +742,8 @@ int uevent_listen(struct udev *udev)
739742 err = - errno ;
740743 break ;
741744 }
745+ uatomic_set (& adding_uev , 1 );
746+
742747 events = uevent_receive_events (fd , & uevlisten_tmp , monitor );
743748 if (events <= 0 )
744749 continue ;
0 commit comments