@@ -142,12 +142,6 @@ impl EpollReadyEvents {
142142 }
143143}
144144
145- impl Epoll {
146- fn get_ready_list ( & self ) -> Rc < ReadyList > {
147- Rc :: clone ( & self . ready_list )
148- }
149- }
150-
151145impl FileDescription for Epoll {
152146 fn name ( & self ) -> & ' static str {
153147 "epoll"
@@ -345,30 +339,34 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
345339 }
346340 }
347341
348- // Create an epoll_interest.
349- let interest = Rc :: new ( RefCell :: new ( EpollEventInterest {
350- fd_num : fd,
351- events,
352- data,
353- ready_list : Rc :: clone ( ready_list) ,
354- weak_epfd : FileDescriptionRef :: downgrade ( & epoll_file_description) ,
355- } ) ) ;
356-
357342 if op == epoll_ctl_add {
343+ // Create an epoll_interest.
344+ let interest = Rc :: new ( RefCell :: new ( EpollEventInterest {
345+ fd_num : fd,
346+ events,
347+ data,
348+ ready_list : Rc :: clone ( ready_list) ,
349+ weak_epfd : FileDescriptionRef :: downgrade ( & epoll_file_description) ,
350+ } ) ) ;
351+ // Notification will be returned for current epfd if there is event in the file
352+ // descriptor we registered.
353+ check_and_update_one_event_interest ( & fd_ref, & interest, id, this) ?;
354+
358355 // Insert an epoll_interest to global epoll_interest list.
359356 this. machine . epoll_interests . insert_epoll_interest ( id, Rc :: downgrade ( & interest) ) ;
360- interest_list. insert ( epoll_key, Rc :: clone ( & interest) ) ;
357+ interest_list. insert ( epoll_key, interest) ;
361358 } else {
362- // Directly modify the epoll_interest so the global epoll_event_interest table
363- // will be updated too.
364- let mut epoll_interest = interest_list. get_mut ( & epoll_key) . unwrap ( ) . borrow_mut ( ) ;
365- epoll_interest. events = events;
366- epoll_interest. data = data;
359+ // Modify the existing interest.
360+ let epoll_interest = interest_list. get_mut ( & epoll_key) . unwrap ( ) ;
361+ {
362+ let mut epoll_interest = epoll_interest. borrow_mut ( ) ;
363+ epoll_interest. events = events;
364+ epoll_interest. data = data;
365+ }
366+ // Updating an FD interest triggers events.
367+ check_and_update_one_event_interest ( & fd_ref, epoll_interest, id, this) ?;
367368 }
368369
369- // Notification will be returned for current epfd if there is event in the file
370- // descriptor we registered.
371- check_and_update_one_event_interest ( & fd_ref, & interest, id, this) ?;
372370 interp_ok ( Scalar :: from_i32 ( 0 ) )
373371 } else if op == epoll_ctl_del {
374372 let epoll_key = ( id, fd) ;
@@ -587,7 +585,7 @@ fn ready_list_next(
587585/// notification to only one epoll instance.
588586fn check_and_update_one_event_interest < ' tcx > (
589587 fd_ref : & DynFileDescriptionRef ,
590- interest : & Rc < RefCell < EpollEventInterest > > ,
588+ interest : & RefCell < EpollEventInterest > ,
591589 id : FdId ,
592590 ecx : & MiriInterpCx < ' tcx > ,
593591) -> InterpResult < ' tcx , bool > {
@@ -623,9 +621,7 @@ fn return_ready_list<'tcx>(
623621 events : & MPlaceTy < ' tcx > ,
624622 ecx : & mut MiriInterpCx < ' tcx > ,
625623) -> InterpResult < ' tcx > {
626- let ready_list = epfd. get_ready_list ( ) ;
627-
628- let mut ready_list = ready_list. mapping . borrow_mut ( ) ;
624+ let mut ready_list = epfd. ready_list . mapping . borrow_mut ( ) ;
629625 let mut num_of_events: i32 = 0 ;
630626 let mut array_iter = ecx. project_array_fields ( events) ?;
631627
0 commit comments