@@ -5,7 +5,6 @@ use std::io::{Error, ErrorKind, Read};
5
5
use std:: rc:: { Rc , Weak } ;
6
6
7
7
use crate :: shims:: unix:: fd:: WeakFileDescriptor ;
8
- use crate :: shims:: unix:: linux:: epoll:: EpollReturn ;
9
8
use crate :: shims:: unix:: * ;
10
9
use crate :: { concurrency:: VClock , * } ;
11
10
@@ -38,28 +37,6 @@ impl SocketPair {
38
37
fn peer_is_closed ( & mut self ) {
39
38
self . peer_closed = true ;
40
39
}
41
-
42
- /// Functions to update the ready list of an epoll_event.
43
- fn update_readiness ( & self , ready_flags : Vec < u32 > , epoll_events : & Vec < Weak < EpollEvent > > ) {
44
- for event in epoll_events {
45
- // If the current epoll_event contains the flag that is signaled as ready, we add/update
46
- // the epoll_return entry in the ready list.
47
- if let Some ( epoll_event) = event. upgrade ( ) {
48
- if let Some ( flags) = epoll_event. contains_flag ( & ready_flags) {
49
- let weak_file_descriptor = epoll_event. weak_file_descriptor . clone ( ) ;
50
- let epoll_key = ( weak_file_descriptor, epoll_event. file_descriptor ) ;
51
- // Retrieve the epoll return if it is already in the return list.
52
- let ready_list = & mut epoll_event. ready_list . borrow_mut ( ) ;
53
- // Add a new epoll entry if it doesn't exist, or update the event mask if it exists.
54
- let epoll_return = EpollReturn :: new ( flags, epoll_event. data ) ;
55
- let epoll_entry = ready_list. entry ( epoll_key) . or_insert ( epoll_return) ;
56
- // The update here is bitwise or, so it will still be correct if we try to add
57
- // a flag that already exists.
58
- epoll_entry. update_events ( flags) ;
59
- }
60
- }
61
- }
62
- }
63
40
}
64
41
65
42
#[ derive( Debug ) ]
@@ -109,11 +86,17 @@ impl FileDescription for SocketPair {
109
86
}
110
87
}
111
88
89
+ // Check if the peer_fd closed
90
+ if self . peer_closed {
91
+ ready_flags. push ( epollrdhup) ;
92
+ }
93
+
112
94
Ok ( ready_flags)
113
95
}
114
96
115
97
fn close < ' tcx > (
116
98
self : Box < Self > ,
99
+ ecx : & mut MiriInterpCx < ' tcx > ,
117
100
_communicate_allowed : bool ,
118
101
) -> InterpResult < ' tcx , io:: Result < ( ) > > {
119
102
// This is used to signal socketfd of other side that there is no writer to its readbuf.
@@ -129,12 +112,11 @@ impl FileDescription for SocketPair {
129
112
let peer_socketpair = binding. downcast_mut :: < SocketPair > ( ) . unwrap ( ) ;
130
113
peer_socketpair. peer_is_closed ( ) ;
131
114
// When any of the event is happened, we check and update the status of all supported flags.
132
- // peer_socketpair
133
- // .check_readiness(ecx)
134
- // .map(|events| ecx.update_readiness(events, self.return_epoll_events()?))??;
115
+ peer_socketpair
116
+ . check_readiness ( ecx)
117
+ . map ( |events| ecx. update_readiness ( events, self . return_epoll_events ( ) ?) ) ??;
135
118
}
136
119
}
137
- // TODO: invoke check readiness from other side
138
120
Ok ( Ok ( ( ) ) )
139
121
}
140
122
@@ -182,7 +164,7 @@ impl FileDescription for SocketPair {
182
164
let actual_read_size = readbuf. buf . read ( bytes) . unwrap ( ) ;
183
165
// When any of the event is happened, we check and update the status of all supported flags.
184
166
self . check_readiness ( ecx)
185
- . map ( |events| self . update_readiness ( events, self . return_epoll_events ( ) . unwrap ( ) ) ) ?;
167
+ . map ( |events| ecx . update_readiness ( events, self . return_epoll_events ( ) ? ) ) ? ?;
186
168
return Ok ( Ok ( actual_read_size) ) ;
187
169
}
188
170
@@ -225,7 +207,7 @@ impl FileDescription for SocketPair {
225
207
writebuf. buf . extend ( & bytes[ ..actual_write_size] ) ;
226
208
// When any of the event is happened, we check and update the status of all supported flags.
227
209
self . check_readiness ( ecx)
228
- . map ( |events| self . update_readiness ( events, self . return_epoll_events ( ) . unwrap ( ) ) ) ?;
210
+ . map ( |events| ecx . update_readiness ( events, self . return_epoll_events ( ) ? ) ) ? ?;
229
211
return Ok ( Ok ( actual_write_size) ) ;
230
212
}
231
213
}
0 commit comments