2
2
3
3
//! Interaction with python's global interpreter lock
4
4
5
- use crate :: { ffi, internal_tricks:: Unsendable , PyAny , Python } ;
5
+ use crate :: { ffi, internal_tricks:: Unsendable , Python } ;
6
6
use std:: cell:: { Cell , UnsafeCell } ;
7
7
use std:: { any, mem:: ManuallyDrop , ptr:: NonNull , sync} ;
8
8
@@ -144,8 +144,7 @@ impl Drop for GILGuard {
144
144
145
145
/// Implementation of release pool
146
146
struct ReleasePoolImpl {
147
- owned : ArrayList < NonNull < ffi:: PyObject > > ,
148
- borrowed : ArrayList < NonNull < ffi:: PyObject > > ,
147
+ owned : Vec < NonNull < ffi:: PyObject > > ,
149
148
pointers : * mut Vec < NonNull < ffi:: PyObject > > ,
150
149
obj : Vec < Box < dyn any:: Any > > ,
151
150
p : parking_lot:: Mutex < * mut Vec < NonNull < ffi:: PyObject > > > ,
@@ -154,8 +153,7 @@ struct ReleasePoolImpl {
154
153
impl ReleasePoolImpl {
155
154
fn new ( ) -> Self {
156
155
Self {
157
- owned : ArrayList :: new ( ) ,
158
- borrowed : ArrayList :: new ( ) ,
156
+ owned : Vec :: with_capacity ( 256 ) ,
159
157
pointers : Box :: into_raw ( Box :: new ( Vec :: with_capacity ( 256 ) ) ) ,
160
158
obj : Vec :: with_capacity ( 8 ) ,
161
159
p : parking_lot:: Mutex :: new ( Box :: into_raw ( Box :: new ( Vec :: with_capacity ( 256 ) ) ) ) ,
@@ -180,14 +178,12 @@ impl ReleasePoolImpl {
180
178
vec. set_len ( 0 ) ;
181
179
}
182
180
183
- pub unsafe fn drain ( & mut self , _py : Python , owned : usize , borrowed : usize ) {
181
+ pub unsafe fn drain ( & mut self , _py : Python , owned : usize ) {
184
182
// Release owned objects(call decref)
185
- while owned < self . owned . len ( ) {
186
- let last = self . owned . pop_back ( ) . unwrap ( ) ;
187
- ffi:: Py_DECREF ( last. as_ptr ( ) ) ;
183
+ for i in owned..self . owned . len ( ) {
184
+ ffi:: Py_DECREF ( self . owned [ i] . as_ptr ( ) ) ;
188
185
}
189
- // Release borrowed objects(don't call decref)
190
- self . borrowed . truncate ( borrowed) ;
186
+ self . owned . truncate ( owned) ;
191
187
self . release_pointers ( ) ;
192
188
self . obj . clear ( ) ;
193
189
}
@@ -219,7 +215,6 @@ unsafe impl Sync for ReleasePool {}
219
215
#[ doc( hidden) ]
220
216
pub struct GILPool {
221
217
owned : usize ,
222
- borrowed : usize ,
223
218
// Stable solution for impl !Send
224
219
no_send : Unsendable ,
225
220
}
@@ -235,7 +230,6 @@ impl GILPool {
235
230
pool. release_pointers ( ) ;
236
231
GILPool {
237
232
owned : pool. owned . len ( ) ,
238
- borrowed : pool. borrowed . len ( ) ,
239
233
no_send : Unsendable :: default ( ) ,
240
234
}
241
235
}
@@ -248,7 +242,7 @@ impl Drop for GILPool {
248
242
fn drop ( & mut self ) {
249
243
unsafe {
250
244
let pool = POOL . get_or_init ( ) ;
251
- pool. drain ( self . python ( ) , self . owned , self . borrowed ) ;
245
+ pool. drain ( self . python ( ) , self . owned ) ;
252
246
}
253
247
decrement_gil_count ( ) ;
254
248
}
@@ -275,14 +269,9 @@ pub unsafe fn register_pointer(obj: NonNull<ffi::PyObject>) {
275
269
}
276
270
}
277
271
278
- pub unsafe fn register_owned ( _py : Python , obj : NonNull < ffi:: PyObject > ) -> & PyAny {
272
+ pub unsafe fn register_owned ( _py : Python , obj : NonNull < ffi:: PyObject > ) {
279
273
let pool = POOL . get_or_init ( ) ;
280
- & * ( pool. owned . push_back ( obj) as * const _ as * const PyAny )
281
- }
282
-
283
- pub unsafe fn register_borrowed ( _py : Python , obj : NonNull < ffi:: PyObject > ) -> & PyAny {
284
- let pool = POOL . get_or_init ( ) ;
285
- & * ( pool. borrowed . push_back ( obj) as * const _ as * const PyAny )
274
+ pool. owned . push ( obj) ;
286
275
}
287
276
288
277
/// Increment pyo3's internal GIL count - to be called whenever GILPool or GILGuard is created.
@@ -304,70 +293,10 @@ fn decrement_gil_count() {
304
293
} )
305
294
}
306
295
307
- use self :: array_list:: ArrayList ;
308
-
309
- mod array_list {
310
- use std:: collections:: LinkedList ;
311
- const BLOCK_SIZE : usize = 256 ;
312
-
313
- /// A container type for Release Pool
314
- /// See #271 for why this is crated
315
- pub ( super ) struct ArrayList < T > {
316
- inner : LinkedList < [ Option < T > ; BLOCK_SIZE ] > ,
317
- length : usize ,
318
- }
319
-
320
- impl < T : Copy > ArrayList < T > {
321
- pub fn new ( ) -> Self {
322
- ArrayList {
323
- inner : LinkedList :: new ( ) ,
324
- length : 0 ,
325
- }
326
- }
327
- pub fn push_back ( & mut self , item : T ) -> & T {
328
- let next_idx = self . next_idx ( ) ;
329
- if next_idx == 0 {
330
- self . inner . push_back ( [ None ; BLOCK_SIZE ] ) ;
331
- }
332
- self . inner . back_mut ( ) . unwrap ( ) [ next_idx] = Some ( item) ;
333
- self . length += 1 ;
334
- self . inner . back ( ) . unwrap ( ) [ next_idx] . as_ref ( ) . unwrap ( )
335
- }
336
- pub fn pop_back ( & mut self ) -> Option < T > {
337
- self . length -= 1 ;
338
- let current_idx = self . next_idx ( ) ;
339
- if current_idx == 0 {
340
- let last_list = self . inner . pop_back ( ) ?;
341
- return last_list[ 0 ] ;
342
- }
343
- self . inner . back ( ) . and_then ( |arr| arr[ current_idx] )
344
- }
345
- pub fn len ( & self ) -> usize {
346
- self . length
347
- }
348
- pub fn truncate ( & mut self , new_len : usize ) {
349
- if self . length <= new_len {
350
- return ;
351
- }
352
- while self . inner . len ( ) > ( new_len + BLOCK_SIZE - 1 ) / BLOCK_SIZE {
353
- self . inner . pop_back ( ) ;
354
- }
355
- self . length = new_len;
356
- }
357
- fn next_idx ( & self ) -> usize {
358
- self . length % BLOCK_SIZE
359
- }
360
- }
361
- }
362
-
363
296
#[ cfg( test) ]
364
297
mod test {
365
- use super :: { GILPool , NonNull , GIL_COUNT , POOL } ;
366
- use crate :: object:: PyObject ;
367
- use crate :: AsPyPointer ;
368
- use crate :: Python ;
369
- use crate :: ToPyObject ;
370
- use crate :: { ffi, gil} ;
298
+ use super :: { GILPool , GIL_COUNT , POOL } ;
299
+ use crate :: { ffi, gil, AsPyPointer , PyObject , Python , ToPyObject } ;
371
300
372
301
fn get_object ( ) -> PyObject {
373
302
// Convenience function for getting a single unique object
@@ -442,66 +371,6 @@ mod test {
442
371
}
443
372
}
444
373
445
- #[ test]
446
- fn test_borrowed ( ) {
447
- unsafe {
448
- let p = POOL . get_or_init ( ) ;
449
-
450
- let obj = get_object ( ) ;
451
- let obj_ptr = obj. as_ptr ( ) ;
452
- {
453
- let gil = Python :: acquire_gil ( ) ;
454
- let py = gil. python ( ) ;
455
- assert_eq ! ( p. borrowed. len( ) , 0 ) ;
456
-
457
- gil:: register_borrowed ( py, NonNull :: new ( obj_ptr) . unwrap ( ) ) ;
458
-
459
- assert_eq ! ( p. borrowed. len( ) , 1 ) ;
460
- assert_eq ! ( ffi:: Py_REFCNT ( obj_ptr) , 1 ) ;
461
- }
462
- {
463
- let _gil = Python :: acquire_gil ( ) ;
464
- assert_eq ! ( p. borrowed. len( ) , 0 ) ;
465
- assert_eq ! ( ffi:: Py_REFCNT ( obj_ptr) , 1 ) ;
466
- }
467
- }
468
- }
469
-
470
- #[ test]
471
- fn test_borrowed_nested ( ) {
472
- unsafe {
473
- let p = POOL . get_or_init ( ) ;
474
-
475
- let obj = get_object ( ) ;
476
- let obj_ptr = obj. as_ptr ( ) ;
477
- {
478
- let gil = Python :: acquire_gil ( ) ;
479
- let py = gil. python ( ) ;
480
- assert_eq ! ( p. borrowed. len( ) , 0 ) ;
481
-
482
- gil:: register_borrowed ( py, NonNull :: new ( obj_ptr) . unwrap ( ) ) ;
483
-
484
- assert_eq ! ( p. borrowed. len( ) , 1 ) ;
485
- assert_eq ! ( ffi:: Py_REFCNT ( obj_ptr) , 1 ) ;
486
-
487
- {
488
- let _pool = GILPool :: new ( ) ;
489
- assert_eq ! ( p. borrowed. len( ) , 1 ) ;
490
- gil:: register_borrowed ( py, NonNull :: new ( obj_ptr) . unwrap ( ) ) ;
491
- assert_eq ! ( p. borrowed. len( ) , 2 ) ;
492
- }
493
-
494
- assert_eq ! ( p. borrowed. len( ) , 1 ) ;
495
- assert_eq ! ( ffi:: Py_REFCNT ( obj_ptr) , 1 ) ;
496
- }
497
- {
498
- let _gil = Python :: acquire_gil ( ) ;
499
- assert_eq ! ( p. borrowed. len( ) , 0 ) ;
500
- assert_eq ! ( ffi:: Py_REFCNT ( obj_ptr) , 1 ) ;
501
- }
502
- }
503
- }
504
-
505
374
#[ test]
506
375
fn test_pyobject_drop_with_gil_decreases_refcnt ( ) {
507
376
let gil = Python :: acquire_gil ( ) ;
0 commit comments