@@ -480,29 +480,23 @@ mod tests {
480
480
use std:: mem;
481
481
use std:: ops;
482
482
use std:: ptr;
483
+ use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
484
+ use std:: sync:: Arc ;
483
485
484
486
// structure to test drooping issue
485
487
struct HasDrop {
486
- drop_count : u32 ,
487
- drop_limit : u32 ,
488
+ drop_count : Arc < AtomicU32 > ,
488
489
}
489
490
490
491
impl HasDrop {
491
- fn new ( val : u32 ) -> Self {
492
- Self {
493
- drop_count : 0 ,
494
- drop_limit : val,
495
- }
492
+ fn new ( val : Arc < AtomicU32 > ) -> Self {
493
+ Self { drop_count : val }
496
494
}
497
495
}
498
496
499
497
impl ops:: Drop for HasDrop {
500
498
fn drop ( & mut self ) {
501
- if self . drop_count >= self . drop_limit {
502
- panic ! ( "Dropped more than {} time" , self . drop_limit) ;
503
- } else {
504
- self . drop_count += 1 ;
505
- }
499
+ self . drop_count . fetch_add ( 1 , Ordering :: Relaxed ) ;
506
500
}
507
501
}
508
502
@@ -588,7 +582,8 @@ mod tests {
588
582
589
583
#[ test]
590
584
fn schedule_must_not_drop ( ) {
591
- let hd = HasDrop :: new ( 0 ) ;
585
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
586
+ let hd = HasDrop :: new ( ctr. clone ( ) ) ;
592
587
let internal = lv2_sys:: LV2_Worker_Schedule {
593
588
handle : ptr:: null_mut ( ) ,
594
589
schedule_work : Some ( extern_schedule) ,
@@ -598,12 +593,13 @@ mod tests {
598
593
phantom : PhantomData :: < * const TestDropWorker > ,
599
594
} ;
600
595
let _ = schedule. schedule_work ( hd) ;
596
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 0 ) ;
601
597
}
602
598
603
599
#[ test]
604
- #[ should_panic( expected = "Dropped" ) ]
605
600
fn schedule_must_enable_drop_on_error ( ) {
606
- let hd = HasDrop :: new ( 0 ) ;
601
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
602
+ let hd = HasDrop :: new ( ctr. clone ( ) ) ;
607
603
let internal = lv2_sys:: LV2_Worker_Schedule {
608
604
handle : ptr:: null_mut ( ) ,
609
605
schedule_work : Some ( faulty_schedule) ,
@@ -613,35 +609,39 @@ mod tests {
613
609
phantom : PhantomData :: < * const TestDropWorker > ,
614
610
} ;
615
611
let _ = schedule. schedule_work ( hd) ;
612
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 1 ) ;
616
613
}
617
614
618
615
#[ test]
619
616
fn respond_must_not_drop ( ) {
620
- let hd = HasDrop :: new ( 0 ) ;
617
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
618
+ let hd = HasDrop :: new ( ctr. clone ( ) ) ;
621
619
let respond = ResponseHandler {
622
620
response_function : Some ( extern_respond) ,
623
621
respond_handle : ptr:: null_mut ( ) ,
624
622
phantom : PhantomData :: < TestDropWorker > ,
625
623
} ;
626
624
let _ = respond. respond ( hd) ;
625
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 0 ) ;
627
626
}
628
627
629
628
#[ test]
630
- #[ should_panic( expected = "Dropped" ) ]
631
629
fn respond_must_enable_drop_on_error ( ) {
632
- let hd = HasDrop :: new ( 0 ) ;
630
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
631
+ let hd = HasDrop :: new ( ctr. clone ( ) ) ;
633
632
let respond = ResponseHandler {
634
633
response_function : Some ( faulty_respond) ,
635
634
respond_handle : ptr:: null_mut ( ) ,
636
635
phantom : PhantomData :: < TestDropWorker > ,
637
636
} ;
638
637
let _ = respond. respond ( hd) ;
638
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 1 ) ;
639
639
}
640
640
641
641
#[ test]
642
- # [ should_panic ( expected = "Dropped" ) ]
643
- fn extern_work_should_drop ( ) {
644
- let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( 0 ) ) ;
642
+ fn extern_work_should_drop_once ( ) {
643
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
644
+ let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( ctr . clone ( ) ) ) ;
645
645
let ptr_hd = & hd as * const _ as * const c_void ;
646
646
let size = mem:: size_of_val ( & hd) as u32 ;
647
647
let mut tdw = TestDropWorker { } ;
@@ -657,46 +657,13 @@ mod tests {
657
657
ptr_hd,
658
658
) ;
659
659
}
660
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 1 ) ;
660
661
}
661
662
662
663
#[ test]
663
- fn extern_work_should_not_drop_twice ( ) {
664
- let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( 1 ) ) ;
665
- let ptr_hd = & hd as * const _ as * const c_void ;
666
- let size = mem:: size_of_val ( & hd) as u32 ;
667
- let mut tdw = TestDropWorker { } ;
668
-
669
- let ptr_tdw = & mut tdw as * mut _ as * mut c_void ;
670
- //trash trick i use Plugin ptr insteas of Pluginstance ptr
671
- unsafe {
672
- WorkerDescriptor :: < TestDropWorker > :: extern_work (
673
- ptr_tdw,
674
- Some ( extern_respond) ,
675
- ptr:: null_mut ( ) ,
676
- size,
677
- ptr_hd,
678
- ) ;
679
- }
680
- }
681
-
682
- #[ test]
683
- #[ should_panic( expected = "Dropped" ) ]
684
- fn extern_work_response_should_drop ( ) {
685
- let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( 0 ) ) ;
686
- let ptr_hd = & hd as * const _ as * const c_void ;
687
- let size = mem:: size_of_val ( & hd) as u32 ;
688
- let mut tdw = TestDropWorker { } ;
689
-
690
- let ptr_tdw = & mut tdw as * mut _ as * mut c_void ;
691
- //trash trick i use Plugin ptr insteas of Pluginstance ptr
692
- unsafe {
693
- WorkerDescriptor :: < TestDropWorker > :: extern_work_response ( ptr_tdw, size, ptr_hd) ;
694
- }
695
- }
696
-
697
- #[ test]
698
- fn extern_work_response_should_not_drop_twice ( ) {
699
- let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( 1 ) ) ;
664
+ fn extern_work_response_should_drop_once ( ) {
665
+ let ctr = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
666
+ let hd = mem:: ManuallyDrop :: new ( HasDrop :: new ( ctr. clone ( ) ) ) ;
700
667
let ptr_hd = & hd as * const _ as * const c_void ;
701
668
let size = mem:: size_of_val ( & hd) as u32 ;
702
669
let mut tdw = TestDropWorker { } ;
@@ -706,5 +673,6 @@ mod tests {
706
673
unsafe {
707
674
WorkerDescriptor :: < TestDropWorker > :: extern_work_response ( ptr_tdw, size, ptr_hd) ;
708
675
}
676
+ assert_eq ! ( ctr. load( Ordering :: Relaxed ) , 1 ) ;
709
677
}
710
678
}
0 commit comments