Skip to content

Commit b5ec64f

Browse files
authored
Merge pull request #39 from alekseyl1992/invalid_state_fix
fix invalid state error: check cancelled() before calling set_result() or set_exception()
2 parents 72c3d0b + 347b7a2 commit b5ec64f

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

src/generic.rs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ where
113113
Ok(())
114114
}
115115

116+
fn cancelled(future: &PyAny) -> PyResult<bool> {
117+
future.getattr("cancelled")?
118+
.call0()?
119+
.is_true()
120+
}
121+
116122
fn set_result(py: Python, future: &PyAny, result: PyResult<PyObject>) -> PyResult<()> {
117123
match result {
118124
Ok(val) => {
@@ -214,29 +220,32 @@ where
214220
let result = fut.await;
215221

216222
Python::with_gil(move |py| {
217-
if set_result(py, future_tx1.as_ref(py), result)
223+
if cancelled(future_tx1.as_ref(py))
218224
.map_err(dump_err(py))
219-
.is_err()
220-
{
221-
222-
// Cancelled
225+
.unwrap_or(false) {
226+
return;
223227
}
228+
229+
let _ = set_result(py, future_tx1.as_ref(py), result)
230+
.map_err(dump_err(py));
224231
});
225232
})
226233
.await
227234
{
228235
if e.is_panic() {
229236
Python::with_gil(move |py| {
230-
if set_result(
237+
if cancelled(future_tx2.as_ref(py))
238+
.map_err(dump_err(py))
239+
.unwrap_or(false) {
240+
return;
241+
}
242+
243+
let _ = set_result(
231244
py,
232245
future_tx2.as_ref(py),
233246
Err(PyException::new_err("rust future panicked")),
234247
)
235-
.map_err(dump_err(py))
236-
.is_err()
237-
{
238-
// Cancelled
239-
}
248+
.map_err(dump_err(py));
240249
});
241250
}
242251
}
@@ -332,29 +341,32 @@ where
332341
let result = fut.await;
333342

334343
Python::with_gil(move |py| {
335-
if set_result(py, future_tx1.as_ref(py), result)
344+
if cancelled(future_tx1.as_ref(py))
336345
.map_err(dump_err(py))
337-
.is_err()
338-
{
339-
340-
// Cancelled
346+
.unwrap_or(false) {
347+
return;
341348
}
349+
350+
let _ = set_result(py, future_tx1.as_ref(py), result)
351+
.map_err(dump_err(py));
342352
});
343353
})
344354
.await
345355
{
346356
if e.is_panic() {
347357
Python::with_gil(move |py| {
348-
if set_result(
358+
if cancelled(future_tx2.as_ref(py))
359+
.map_err(dump_err(py))
360+
.unwrap_or(false) {
361+
return;
362+
}
363+
364+
let _ = set_result(
349365
py,
350366
future_tx2.as_ref(py),
351367
Err(PyException::new_err("rust future panicked")),
352368
)
353-
.map_err(dump_err(py))
354-
.is_err()
355-
{
356-
// Cancelled
357-
}
369+
.map_err(dump_err(py));
358370
});
359371
}
360372
}

0 commit comments

Comments
 (0)