3
3
// rustdoc-stripper-ignore-next
4
4
//! `IMPL` Object wrapper implementation and `Object` binding.
5
5
6
- use std:: { cmp, fmt, hash, marker:: PhantomData , mem, mem:: ManuallyDrop , ops, pin:: Pin , ptr} ;
6
+ use std:: {
7
+ cmp, fmt, hash,
8
+ marker:: PhantomData ,
9
+ mem:: { self , ManuallyDrop } ,
10
+ ops,
11
+ pin:: Pin ,
12
+ ptr,
13
+ sync:: Arc ,
14
+ } ;
7
15
8
16
use crate :: {
9
17
closure:: TryFromClosureReturnValue ,
@@ -3029,9 +3037,9 @@ impl<T: ObjectType> ObjectExt for T {
3029
3037
#[ inline]
3030
3038
fn downgrade ( & self ) -> WeakRef < T > {
3031
3039
unsafe {
3032
- let w = WeakRef ( Box :: pin ( mem:: zeroed ( ) ) , PhantomData ) ;
3040
+ let w = WeakRef ( Arc :: pin ( WeakRefInner ( mem:: zeroed ( ) , PhantomData ) ) ) ;
3033
3041
gobject_ffi:: g_weak_ref_init (
3034
- mut_override ( & * w . 0 ) ,
3042
+ mut_override ( & ( * w . 0 ) . 0 ) ,
3035
3043
self . as_object_ref ( ) . to_glib_none ( ) . 0 ,
3036
3044
) ;
3037
3045
w
@@ -3373,9 +3381,12 @@ impl<T: ObjectType> WeakRefNotify<T> {
3373
3381
3374
3382
// rustdoc-stripper-ignore-next
3375
3383
/// A weak reference to an object.
3376
- #[ derive( Debug ) ]
3384
+ #[ derive( Debug , PartialEq , PartialOrd ) ]
3377
3385
#[ doc( alias = "GWeakRef" ) ]
3378
- pub struct WeakRef < T : ObjectType > ( Pin < Box < gobject_ffi:: GWeakRef > > , PhantomData < * mut T > ) ;
3386
+ pub struct WeakRef < T : ObjectType > ( Pin < Arc < WeakRefInner < T > > > ) ;
3387
+
3388
+ #[ derive( Debug ) ]
3389
+ struct WeakRefInner < T : ObjectType > ( gobject_ffi:: GWeakRef , PhantomData < * mut T > ) ;
3379
3390
3380
3391
impl < T : ObjectType > WeakRef < T > {
3381
3392
// rustdoc-stripper-ignore-next
@@ -3385,11 +3396,8 @@ impl<T: ObjectType> WeakRef<T> {
3385
3396
#[ inline]
3386
3397
pub fn new ( ) -> WeakRef < T > {
3387
3398
unsafe {
3388
- let mut w = WeakRef ( Box :: pin ( mem:: zeroed ( ) ) , PhantomData ) ;
3389
- gobject_ffi:: g_weak_ref_init (
3390
- Pin :: as_mut ( & mut w. 0 ) . get_unchecked_mut ( ) ,
3391
- ptr:: null_mut ( ) ,
3392
- ) ;
3399
+ let w = WeakRef ( Arc :: pin ( WeakRefInner ( mem:: zeroed ( ) , PhantomData ) ) ) ;
3400
+ gobject_ffi:: g_weak_ref_init ( mut_override ( & ( * w. 0 ) . 0 ) , ptr:: null_mut ( ) ) ;
3393
3401
w
3394
3402
}
3395
3403
}
@@ -3401,7 +3409,7 @@ impl<T: ObjectType> WeakRef<T> {
3401
3409
pub fn set ( & self , obj : Option < & T > ) {
3402
3410
unsafe {
3403
3411
gobject_ffi:: g_weak_ref_set (
3404
- mut_override ( Pin :: as_ref ( & self . 0 ) . get_ref ( ) ) ,
3412
+ mut_override ( & ( * self . 0 ) . 0 ) ,
3405
3413
obj. map_or ( std:: ptr:: null_mut ( ) , |obj| {
3406
3414
obj. as_object_ref ( ) . to_glib_none ( ) . 0
3407
3415
} ) ,
@@ -3417,7 +3425,7 @@ impl<T: ObjectType> WeakRef<T> {
3417
3425
#[ inline]
3418
3426
pub fn upgrade ( & self ) -> Option < T > {
3419
3427
unsafe {
3420
- let ptr = gobject_ffi:: g_weak_ref_get ( mut_override ( Pin :: as_ref ( & self . 0 ) . get_ref ( ) ) ) ;
3428
+ let ptr = gobject_ffi:: g_weak_ref_get ( mut_override ( & ( * self . 0 ) . 0 ) ) ;
3421
3429
if ptr. is_null ( ) {
3422
3430
None
3423
3431
} else {
@@ -3428,29 +3436,19 @@ impl<T: ObjectType> WeakRef<T> {
3428
3436
}
3429
3437
}
3430
3438
3431
- impl < T : ObjectType > Drop for WeakRef < T > {
3439
+ impl < T : ObjectType > Drop for WeakRefInner < T > {
3432
3440
#[ inline]
3433
3441
fn drop ( & mut self ) {
3434
3442
unsafe {
3435
- gobject_ffi:: g_weak_ref_clear ( Pin :: as_mut ( & mut self . 0 ) . get_unchecked_mut ( ) ) ;
3443
+ gobject_ffi:: g_weak_ref_clear ( & mut self . 0 ) ;
3436
3444
}
3437
3445
}
3438
3446
}
3439
3447
3440
3448
impl < T : ObjectType > Clone for WeakRef < T > {
3441
3449
#[ inline]
3442
3450
fn clone ( & self ) -> Self {
3443
- unsafe {
3444
- let o = self . upgrade ( ) ;
3445
-
3446
- let mut c = WeakRef ( Box :: pin ( mem:: zeroed ( ) ) , PhantomData ) ;
3447
- gobject_ffi:: g_weak_ref_init (
3448
- Pin :: as_mut ( & mut c. 0 ) . get_unchecked_mut ( ) ,
3449
- o. to_glib_none ( ) . 0 as * mut gobject_ffi:: GObject ,
3450
- ) ;
3451
-
3452
- c
3453
- }
3451
+ Self ( self . 0 . clone ( ) )
3454
3452
}
3455
3453
}
3456
3454
@@ -3461,10 +3459,10 @@ impl<T: ObjectType> Default for WeakRef<T> {
3461
3459
}
3462
3460
}
3463
3461
3464
- unsafe impl < T : ObjectType + Sync + Sync > Sync for WeakRef < T > { }
3465
- unsafe impl < T : ObjectType + Send + Sync > Send for WeakRef < T > { }
3462
+ unsafe impl < T : ObjectType + Sync + Sync > Sync for WeakRefInner < T > { }
3463
+ unsafe impl < T : ObjectType + Send + Sync > Send for WeakRefInner < T > { }
3466
3464
3467
- impl < T : ObjectType > PartialEq for WeakRef < T > {
3465
+ impl < T : ObjectType > PartialEq for WeakRefInner < T > {
3468
3466
#[ inline]
3469
3467
fn eq ( & self , other : & Self ) -> bool {
3470
3468
unsafe { self . 0 . priv_ . p == other. 0 . priv_ . p }
@@ -3474,11 +3472,11 @@ impl<T: ObjectType> PartialEq for WeakRef<T> {
3474
3472
impl < T : ObjectType > PartialEq < T > for WeakRef < T > {
3475
3473
#[ inline]
3476
3474
fn eq ( & self , other : & T ) -> bool {
3477
- unsafe { self . 0 . priv_ . p == other. as_ptr ( ) as * mut std:: os:: raw:: c_void }
3475
+ unsafe { ( * self . 0 ) . 0 . priv_ . p == other. as_ptr ( ) as * mut std:: os:: raw:: c_void }
3478
3476
}
3479
3477
}
3480
3478
3481
- impl < T : ObjectType > PartialOrd for WeakRef < T > {
3479
+ impl < T : ObjectType > PartialOrd for WeakRefInner < T > {
3482
3480
#[ inline]
3483
3481
fn partial_cmp ( & self , other : & Self ) -> Option < cmp:: Ordering > {
3484
3482
unsafe { self . 0 . priv_ . p . partial_cmp ( & other. 0 . priv_ . p ) }
0 commit comments