@@ -59,9 +59,8 @@ struct Notifier {
59
59
60
60
const IDLE : usize = 0 ;
61
61
const POLLING : usize = 1 ;
62
- const REPOLL : usize = 2 ;
63
- const COMPLETE : usize = 3 ;
64
- const POISONED : usize = 4 ;
62
+ const COMPLETE : usize = 2 ;
63
+ const POISONED : usize = 3 ;
65
64
66
65
pub fn new < F : Future > ( future : F ) -> Shared < F > {
67
66
Shared {
@@ -133,7 +132,7 @@ impl<F> Future for Shared<F>
133
132
IDLE => {
134
133
// Lock acquired, fall through
135
134
}
136
- POLLING | REPOLL => {
135
+ POLLING => {
137
136
// Another task is currently polling, at this point we just want
138
137
// to ensure that our task handle is currently registered
139
138
@@ -146,56 +145,45 @@ impl<F> Future for Shared<F>
146
145
_ => unreachable ! ( ) ,
147
146
}
148
147
149
- loop {
150
- struct Reset < ' a > ( & ' a AtomicUsize ) ;
148
+ struct Reset < ' a > ( & ' a AtomicUsize ) ;
151
149
152
- impl < ' a > Drop for Reset < ' a > {
153
- fn drop ( & mut self ) {
154
- use std:: thread;
150
+ impl < ' a > Drop for Reset < ' a > {
151
+ fn drop ( & mut self ) {
152
+ use std:: thread;
155
153
156
- if thread:: panicking ( ) {
157
- self . 0 . store ( POISONED , SeqCst ) ;
158
- }
154
+ if thread:: panicking ( ) {
155
+ self . 0 . store ( POISONED , SeqCst ) ;
159
156
}
160
157
}
158
+ }
161
159
162
- let _reset = Reset ( & self . inner . notifier . state ) ;
163
-
164
- // Poll the future
165
- let res = unsafe {
166
- ( * self . inner . future . get ( ) ) . as_mut ( ) . unwrap ( )
167
- . poll_future_notify ( & self . inner . notifier , 0 )
168
- } ;
169
- match res {
170
- Ok ( Async :: NotReady ) => {
171
- // Not ready, try to release the handle
172
- match self . inner . notifier . state . compare_and_swap ( POLLING , IDLE , SeqCst ) {
173
- POLLING => {
174
- // Success
175
- return Ok ( Async :: NotReady ) ;
176
- }
177
- REPOLL => {
178
- // Gotta poll again!
179
- let prev = self . inner . notifier . state . swap ( POLLING , SeqCst ) ;
180
- assert_eq ! ( prev, REPOLL ) ;
181
- }
182
- _ => unreachable ! ( ) ,
160
+ let _reset = Reset ( & self . inner . notifier . state ) ;
161
+
162
+ // Poll the future
163
+ let res = unsafe {
164
+ ( * self . inner . future . get ( ) ) . as_mut ( ) . unwrap ( )
165
+ . poll_future_notify ( & self . inner . notifier , 0 )
166
+ } ;
167
+ match res {
168
+ Ok ( Async :: NotReady ) => {
169
+ // Not ready, try to release the handle
170
+ match self . inner . notifier . state . compare_and_swap ( POLLING , IDLE , SeqCst ) {
171
+ POLLING => {
172
+ // Success
173
+ return Ok ( Async :: NotReady ) ;
183
174
}
184
-
175
+ _ => unreachable ! ( ) ,
185
176
}
186
- Ok ( Async :: Ready ( i) ) => {
187
- unsafe {
188
- ( * self . inner . result . get ( ) ) = Some ( Ok ( SharedItem { item : Arc :: new ( i) } ) ) ;
189
- }
190
177
191
- break ;
178
+ }
179
+ Ok ( Async :: Ready ( i) ) => {
180
+ unsafe {
181
+ ( * self . inner . result . get ( ) ) = Some ( Ok ( SharedItem { item : Arc :: new ( i) } ) ) ;
192
182
}
193
- Err ( e) => {
194
- unsafe {
195
- ( * self . inner . result . get ( ) ) = Some ( Err ( SharedError { error : Arc :: new ( e) } ) ) ;
196
- }
197
-
198
- break ;
183
+ }
184
+ Err ( e) => {
185
+ unsafe {
186
+ ( * self . inner . result . get ( ) ) = Some ( Err ( SharedError { error : Arc :: new ( e) } ) ) ;
199
187
}
200
188
}
201
189
}
@@ -225,8 +213,6 @@ impl<F> Drop for Shared<F> where F: Future {
225
213
226
214
impl Notify for Notifier {
227
215
fn notify ( & self , _id : usize ) {
228
- self . state . compare_and_swap ( POLLING , REPOLL , SeqCst ) ;
229
-
230
216
let waiters = mem:: replace ( & mut * self . waiters . lock ( ) . unwrap ( ) , HashMap :: new ( ) ) ;
231
217
232
218
for ( _, waiter) in waiters {
0 commit comments