@@ -70,11 +70,7 @@ impl CassSessionInner {
70
70
}
71
71
72
72
fn connect (
73
- // This reference is 'static because this is the only was of assuring the borrow checker
74
- // that holding it in our returned future is sound. Ideally, we would prefer to have
75
- // the returned future's lifetime constrained by real lifetime of the session's RwLock,
76
- // but this is impossible to be guaranteed due to C/Rust cross-language barrier.
77
- session_opt : & ' static RwLock < Option < CassSessionInner > > ,
73
+ session_opt : Arc < RwLock < Option < CassSessionInner > > > ,
78
74
cluster : & CassCluster ,
79
75
keyspace : Option < String > ,
80
76
) -> * mut CassFuture {
@@ -94,7 +90,7 @@ impl CassSessionInner {
94
90
}
95
91
96
92
async fn connect_fut (
97
- session_opt : & RwLock < Option < CassSessionInner > > ,
93
+ session_opt : Arc < RwLock < Option < CassSessionInner > > > ,
98
94
session_builder_fut : impl Future < Output = SessionBuilder > ,
99
95
exec_profile_builder_map : HashMap < ExecProfileName , CassExecProfile > ,
100
96
client_id : uuid:: Uuid ,
@@ -154,7 +150,7 @@ pub unsafe extern "C" fn cass_session_connect(
154
150
session_raw : * mut CassSession ,
155
151
cluster_raw : * const CassCluster ,
156
152
) -> * mut CassFuture {
157
- let session_opt = ArcFFI :: as_ref ( session_raw) ;
153
+ let session_opt = ArcFFI :: cloned_from_ptr ( session_raw) ;
158
154
let cluster: & CassCluster = BoxFFI :: as_ref ( cluster_raw) ;
159
155
160
156
CassSessionInner :: connect ( session_opt, cluster, None )
@@ -176,7 +172,7 @@ pub unsafe extern "C" fn cass_session_connect_keyspace_n(
176
172
keyspace : * const c_char ,
177
173
keyspace_length : size_t ,
178
174
) -> * mut CassFuture {
179
- let session_opt = ArcFFI :: as_ref ( session_raw) ;
175
+ let session_opt = ArcFFI :: cloned_from_ptr ( session_raw) ;
180
176
let cluster: & CassCluster = BoxFFI :: as_ref ( cluster_raw) ;
181
177
let keyspace = ptr_to_cstr_n ( keyspace, keyspace_length) . map ( ToOwned :: to_owned) ;
182
178
@@ -188,7 +184,7 @@ pub unsafe extern "C" fn cass_session_execute_batch(
188
184
session_raw : * mut CassSession ,
189
185
batch_raw : * const CassBatch ,
190
186
) -> * mut CassFuture {
191
- let session_opt = ArcFFI :: as_ref ( session_raw) ;
187
+ let session_opt = ArcFFI :: cloned_from_ptr ( session_raw) ;
192
188
let batch_from_raw = BoxFFI :: as_ref ( batch_raw) ;
193
189
let mut state = batch_from_raw. state . clone ( ) ;
194
190
let request_timeout_ms = batch_from_raw. batch_request_timeout_ms ;
@@ -254,7 +250,7 @@ pub unsafe extern "C" fn cass_session_execute(
254
250
session_raw : * mut CassSession ,
255
251
statement_raw : * const CassStatement ,
256
252
) -> * mut CassFuture {
257
- let session_opt = ArcFFI :: as_ref ( session_raw) ;
253
+ let session_opt = ArcFFI :: cloned_from_ptr ( session_raw) ;
258
254
259
255
// DO NOT refer to `statement_opt` inside the async block, as I've done just to face a segfault.
260
256
let statement_opt = BoxFFI :: as_ref ( statement_raw) ;
@@ -389,7 +385,7 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
389
385
cass_session : * mut CassSession ,
390
386
statement : * const CassStatement ,
391
387
) -> * mut CassFuture {
392
- let session = ArcFFI :: as_ref ( cass_session) ;
388
+ let session = ArcFFI :: cloned_from_ptr ( cass_session) ;
393
389
let cass_statement = BoxFFI :: as_ref ( statement) ;
394
390
let statement = cass_statement. statement . clone ( ) ;
395
391
@@ -441,7 +437,7 @@ pub unsafe extern "C" fn cass_session_prepare_n(
441
437
// There is a test for this: `NullStringApiArgsTest.Integration_Cassandra_PrepareNullQuery`.
442
438
. unwrap_or_default ( ) ;
443
439
let query = Statement :: new ( query_str. to_string ( ) ) ;
444
- let cass_session = ArcFFI :: as_ref ( cass_session_raw) ;
440
+ let cass_session = ArcFFI :: cloned_from_ptr ( cass_session_raw) ;
445
441
446
442
CassFuture :: make_raw ( async move {
447
443
let session_guard = cass_session. read ( ) . await ;
@@ -474,7 +470,7 @@ pub unsafe extern "C" fn cass_session_free(session_raw: *mut CassSession) {
474
470
475
471
#[ no_mangle]
476
472
pub unsafe extern "C" fn cass_session_close ( session : * mut CassSession ) -> * mut CassFuture {
477
- let session_opt = ArcFFI :: as_ref ( session) ;
473
+ let session_opt = ArcFFI :: cloned_from_ptr ( session) ;
478
474
479
475
CassFuture :: make_raw ( async move {
480
476
let mut session_guard = session_opt. write ( ) . await ;
0 commit comments