@@ -109,132 +109,132 @@ macro_rules! task {
109
109
fn cancel_and_drop_handle ( ) {
110
110
future ! ( f, POLL , DROP_F ) ;
111
111
schedule ! ( s, SCHEDULE , DROP_S ) ;
112
- task ! ( task, handle, f, s, DROP_D ) ;
112
+ task ! ( task, handle, f, s, DROP_T ) ;
113
113
114
114
assert_eq ! ( POLL . load( ) , 0 ) ;
115
115
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
116
116
assert_eq ! ( DROP_F . load( ) , 0 ) ;
117
117
assert_eq ! ( DROP_S . load( ) , 0 ) ;
118
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
118
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
119
119
120
120
task. cancel ( ) ;
121
121
assert_eq ! ( POLL . load( ) , 0 ) ;
122
122
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
123
123
assert_eq ! ( DROP_F . load( ) , 0 ) ;
124
124
assert_eq ! ( DROP_S . load( ) , 0 ) ;
125
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
125
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
126
126
127
127
drop ( handle) ;
128
128
assert_eq ! ( POLL . load( ) , 0 ) ;
129
129
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
130
130
assert_eq ! ( DROP_F . load( ) , 0 ) ;
131
131
assert_eq ! ( DROP_S . load( ) , 0 ) ;
132
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
132
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
133
133
134
134
drop ( task) ;
135
135
assert_eq ! ( POLL . load( ) , 0 ) ;
136
136
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
137
137
assert_eq ! ( DROP_F . load( ) , 1 ) ;
138
138
assert_eq ! ( DROP_S . load( ) , 1 ) ;
139
- assert_eq ! ( DROP_D . load( ) , 1 ) ;
139
+ assert_eq ! ( DROP_T . load( ) , 1 ) ;
140
140
}
141
141
142
142
#[ test]
143
143
fn run_and_drop_handle ( ) {
144
144
future ! ( f, POLL , DROP_F ) ;
145
145
schedule ! ( s, SCHEDULE , DROP_S ) ;
146
- task ! ( task, handle, f, s, DROP_D ) ;
146
+ task ! ( task, handle, f, s, DROP_T ) ;
147
147
148
148
drop ( handle) ;
149
149
assert_eq ! ( POLL . load( ) , 0 ) ;
150
150
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
151
151
assert_eq ! ( DROP_F . load( ) , 0 ) ;
152
152
assert_eq ! ( DROP_S . load( ) , 0 ) ;
153
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
153
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
154
154
155
155
task. run ( ) ;
156
156
assert_eq ! ( POLL . load( ) , 1 ) ;
157
157
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
158
158
assert_eq ! ( DROP_F . load( ) , 1 ) ;
159
159
assert_eq ! ( DROP_S . load( ) , 1 ) ;
160
- assert_eq ! ( DROP_D . load( ) , 1 ) ;
160
+ assert_eq ! ( DROP_T . load( ) , 1 ) ;
161
161
}
162
162
163
163
#[ test]
164
164
fn drop_handle_and_run ( ) {
165
165
future ! ( f, POLL , DROP_F ) ;
166
166
schedule ! ( s, SCHEDULE , DROP_S ) ;
167
- task ! ( task, handle, f, s, DROP_D ) ;
167
+ task ! ( task, handle, f, s, DROP_T ) ;
168
168
169
169
drop ( handle) ;
170
170
assert_eq ! ( POLL . load( ) , 0 ) ;
171
171
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
172
172
assert_eq ! ( DROP_F . load( ) , 0 ) ;
173
173
assert_eq ! ( DROP_S . load( ) , 0 ) ;
174
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
174
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
175
175
176
176
task. run ( ) ;
177
177
assert_eq ! ( POLL . load( ) , 1 ) ;
178
178
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
179
179
assert_eq ! ( DROP_F . load( ) , 1 ) ;
180
180
assert_eq ! ( DROP_S . load( ) , 1 ) ;
181
- assert_eq ! ( DROP_D . load( ) , 1 ) ;
181
+ assert_eq ! ( DROP_T . load( ) , 1 ) ;
182
182
}
183
183
184
184
#[ test]
185
185
fn cancel_and_run ( ) {
186
186
future ! ( f, POLL , DROP_F ) ;
187
187
schedule ! ( s, SCHEDULE , DROP_S ) ;
188
- task ! ( task, handle, f, s, DROP_D ) ;
188
+ task ! ( task, handle, f, s, DROP_T ) ;
189
189
190
190
handle. cancel ( ) ;
191
191
assert_eq ! ( POLL . load( ) , 0 ) ;
192
192
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
193
193
assert_eq ! ( DROP_F . load( ) , 0 ) ;
194
194
assert_eq ! ( DROP_S . load( ) , 0 ) ;
195
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
195
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
196
196
197
197
drop ( handle) ;
198
198
assert_eq ! ( POLL . load( ) , 0 ) ;
199
199
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
200
200
assert_eq ! ( DROP_F . load( ) , 0 ) ;
201
201
assert_eq ! ( DROP_S . load( ) , 0 ) ;
202
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
202
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
203
203
204
204
task. run ( ) ;
205
205
assert_eq ! ( POLL . load( ) , 0 ) ;
206
206
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
207
207
assert_eq ! ( DROP_F . load( ) , 1 ) ;
208
208
assert_eq ! ( DROP_S . load( ) , 1 ) ;
209
- assert_eq ! ( DROP_D . load( ) , 1 ) ;
209
+ assert_eq ! ( DROP_T . load( ) , 1 ) ;
210
210
}
211
211
212
212
#[ test]
213
213
fn run_and_cancel ( ) {
214
214
future ! ( f, POLL , DROP_F ) ;
215
215
schedule ! ( s, SCHEDULE , DROP_S ) ;
216
- task ! ( task, handle, f, s, DROP_D ) ;
216
+ task ! ( task, handle, f, s, DROP_T ) ;
217
217
218
218
task. run ( ) ;
219
219
assert_eq ! ( POLL . load( ) , 1 ) ;
220
220
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
221
221
assert_eq ! ( DROP_F . load( ) , 1 ) ;
222
222
assert_eq ! ( DROP_S . load( ) , 0 ) ;
223
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
223
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
224
224
225
225
handle. cancel ( ) ;
226
226
assert_eq ! ( POLL . load( ) , 1 ) ;
227
227
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
228
228
assert_eq ! ( DROP_F . load( ) , 1 ) ;
229
229
assert_eq ! ( DROP_S . load( ) , 0 ) ;
230
- assert_eq ! ( DROP_D . load( ) , 0 ) ;
230
+ assert_eq ! ( DROP_T . load( ) , 0 ) ;
231
231
232
232
drop ( handle) ;
233
233
assert_eq ! ( POLL . load( ) , 1 ) ;
234
234
assert_eq ! ( SCHEDULE . load( ) , 0 ) ;
235
235
assert_eq ! ( DROP_F . load( ) , 1 ) ;
236
236
assert_eq ! ( DROP_S . load( ) , 1 ) ;
237
- assert_eq ! ( DROP_D . load( ) , 1 ) ;
237
+ assert_eq ! ( DROP_T . load( ) , 1 ) ;
238
238
}
239
239
240
240
#[ test]
@@ -310,3 +310,25 @@ fn schedule_counter() {
310
310
assert_eq ! ( handle. tag( ) . load( Ordering :: SeqCst ) , 3 ) ;
311
311
r. recv ( ) . unwrap ( ) ;
312
312
}
313
+
314
+ #[ test]
315
+ fn drop_inside_schedule ( ) {
316
+ struct DropGuard ( AtomicUsize ) ;
317
+ impl Drop for DropGuard {
318
+ fn drop ( & mut self ) {
319
+ self . 0 . fetch_add ( 1 , Ordering :: SeqCst ) ;
320
+ }
321
+ }
322
+ let guard = DropGuard ( AtomicUsize :: new ( 0 ) ) ;
323
+
324
+ let ( task, _) = async_task:: spawn (
325
+ async { } ,
326
+ move |task| {
327
+ assert_eq ! ( guard. 0 . load( Ordering :: SeqCst ) , 0 ) ;
328
+ drop ( task) ;
329
+ assert_eq ! ( guard. 0 . load( Ordering :: SeqCst ) , 0 ) ;
330
+ } ,
331
+ ( ) ,
332
+ ) ;
333
+ task. schedule ( ) ;
334
+ }
0 commit comments