@@ -17,9 +17,9 @@ use std::sync::Arc;
17
17
use async_lock:: RwLock ;
18
18
use futures:: FutureExt ;
19
19
use perspective_client:: {
20
- assert_table_api , assert_view_api , Client , OnUpdateMode , OnUpdateOptions , Table , TableData ,
21
- TableInitOptions , TableReadFormat , UpdateData , UpdateOptions , View , ViewOnUpdateResp ,
22
- ViewWindow ,
20
+ Client , OnUpdateMode , OnUpdateOptions , Table , TableData , TableInitOptions , TableReadFormat ,
21
+ UpdateData , UpdateOptions , View , ViewOnUpdateResp , ViewWindow , assert_table_api ,
22
+ assert_view_api ,
23
23
} ;
24
24
use pyo3:: exceptions:: PyValueError ;
25
25
use pyo3:: prelude:: * ;
@@ -37,16 +37,16 @@ use crate::py_err::{PyPerspectiveError, ResultTClientErrorExt};
37
37
#[ derive( Clone ) ]
38
38
pub struct AsyncClient {
39
39
pub ( crate ) client : Client ,
40
- loop_cb : Arc < RwLock < Option < Py < PyAny > > > > ,
41
- close_cb : Option < Py < PyAny > > ,
40
+ loop_cb : Arc < RwLock < Arc < Option < Py < PyAny > > > > > ,
41
+ close_cb : Arc < Option < Py < PyAny > > > ,
42
42
}
43
43
44
44
impl AsyncClient {
45
45
pub fn new_from_client ( client : Client ) -> Self {
46
46
AsyncClient {
47
47
client,
48
48
loop_cb : Arc :: default ( ) ,
49
- close_cb : None ,
49
+ close_cb : Arc :: default ( ) ,
50
50
}
51
51
}
52
52
}
@@ -80,7 +80,7 @@ impl AsyncClient {
80
80
AsyncClient {
81
81
client,
82
82
loop_cb : Arc :: default ( ) ,
83
- close_cb : handle_close,
83
+ close_cb : handle_close. into ( ) ,
84
84
}
85
85
}
86
86
@@ -160,12 +160,12 @@ impl AsyncClient {
160
160
}
161
161
162
162
pub async fn set_loop_callback ( & self , loop_cb : Py < PyAny > ) -> PyResult < ( ) > {
163
- * self . loop_cb . write ( ) . await = Some ( loop_cb) ;
163
+ * self . loop_cb . write ( ) . await = Some ( loop_cb) . into ( ) ;
164
164
Ok ( ( ) )
165
165
}
166
166
167
167
pub fn terminate ( & self , py : Python < ' _ > ) -> PyResult < ( ) > {
168
- if let Some ( cb) = & self . close_cb {
168
+ if let Some ( cb) = & * self . close_cb {
169
169
cb. call0 ( py) ?;
170
170
}
171
171
@@ -225,12 +225,12 @@ impl AsyncTable {
225
225
}
226
226
227
227
pub async fn on_delete ( & self , callback_py : Py < PyAny > ) -> PyResult < u32 > {
228
- let loop_cb = self . client . loop_cb . read ( ) . await . clone ( ) ;
228
+ let loop_cb = ( * self . client . loop_cb . read ( ) . await ) . clone ( ) ;
229
229
let callback = {
230
230
let callback_py = Python :: with_gil ( |py| Py :: clone_ref ( & callback_py, py) ) ;
231
231
Box :: new ( move || {
232
232
Python :: with_gil ( |py| {
233
- if let Some ( loop_cb) = & loop_cb {
233
+ if let Some ( loop_cb) = & * loop_cb {
234
234
loop_cb. call1 ( py, ( & callback_py, ) ) ?;
235
235
} else {
236
236
callback_py. call0 ( py) ?;
@@ -402,7 +402,7 @@ impl AsyncView {
402
402
Box :: new ( move || {
403
403
let loop_cb = loop_cb. clone ( ) ;
404
404
Python :: with_gil ( |py| {
405
- if let Some ( loop_cb) = & loop_cb {
405
+ if let Some ( loop_cb) = & * loop_cb {
406
406
loop_cb. call1 ( py, ( & * callback_py, ) ) ?;
407
407
} else {
408
408
callback_py. call0 ( py) ?;
@@ -424,8 +424,8 @@ impl AsyncView {
424
424
425
425
#[ pyo3( signature=( callback, mode=None ) ) ]
426
426
pub async fn on_update ( & self , callback : Py < PyAny > , mode : Option < String > ) -> PyResult < u32 > {
427
- let locked_val = self . client . loop_cb . read ( ) . await ;
428
- let loop_cb = Python :: with_gil ( |py| locked_val. as_ref ( ) . map ( |v| Py :: clone_ref ( v, py) ) ) ;
427
+ let locked_val = self . client . loop_cb . read ( ) . await . clone ( ) ;
428
+ let loop_cb = Python :: with_gil ( |py| ( * locked_val) . as_ref ( ) . map ( |v| Py :: clone_ref ( v, py) ) ) ;
429
429
let callback = move |x : ViewOnUpdateResp | {
430
430
let loop_cb = Python :: with_gil ( |py| loop_cb. as_ref ( ) . map ( |v| Py :: clone_ref ( v, py) ) ) ;
431
431
let callback = Python :: with_gil ( |py| Py :: clone_ref ( & callback, py) ) ;
0 commit comments