@@ -142,12 +142,6 @@ impl EpollReadyEvents {
142
142
}
143
143
}
144
144
145
- impl Epoll {
146
- fn get_ready_list ( & self ) -> Rc < ReadyList > {
147
- Rc :: clone ( & self . ready_list )
148
- }
149
- }
150
-
151
145
impl FileDescription for Epoll {
152
146
fn name ( & self ) -> & ' static str {
153
147
"epoll"
@@ -345,30 +339,34 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
345
339
}
346
340
}
347
341
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
-
357
342
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
+
358
355
// Insert an epoll_interest to global epoll_interest list.
359
356
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) ;
361
358
} 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) ?;
367
368
}
368
369
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) ?;
372
370
interp_ok ( Scalar :: from_i32 ( 0 ) )
373
371
} else if op == epoll_ctl_del {
374
372
let epoll_key = ( id, fd) ;
@@ -587,7 +585,7 @@ fn ready_list_next(
587
585
/// notification to only one epoll instance.
588
586
fn check_and_update_one_event_interest < ' tcx > (
589
587
fd_ref : & DynFileDescriptionRef ,
590
- interest : & Rc < RefCell < EpollEventInterest > > ,
588
+ interest : & RefCell < EpollEventInterest > ,
591
589
id : FdId ,
592
590
ecx : & MiriInterpCx < ' tcx > ,
593
591
) -> InterpResult < ' tcx , bool > {
@@ -623,9 +621,7 @@ fn return_ready_list<'tcx>(
623
621
events : & MPlaceTy < ' tcx > ,
624
622
ecx : & mut MiriInterpCx < ' tcx > ,
625
623
) -> 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 ( ) ;
629
625
let mut num_of_events: i32 = 0 ;
630
626
let mut array_iter = ecx. project_array_fields ( events) ?;
631
627
0 commit comments