Skip to content

Commit 88ba8d3

Browse files
committed
Fix tests on Rust 1.81.0
Unwinding across functions with the extern "C" ABI is UB, but previously worked. See: rust-lang/rust#74990 Redo the tests so they don't rely on panics at all, using a reference-counted counter instead. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 44aac00 commit 88ba8d3

File tree

1 file changed

+26
-58
lines changed

1 file changed

+26
-58
lines changed

worker/src/lib.rs

Lines changed: 26 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -480,29 +480,23 @@ mod tests {
480480
use std::mem;
481481
use std::ops;
482482
use std::ptr;
483+
use std::sync::atomic::{AtomicU32, Ordering};
484+
use std::sync::Arc;
483485

484486
// structure to test drooping issue
485487
struct HasDrop {
486-
drop_count: u32,
487-
drop_limit: u32,
488+
drop_count: Arc<AtomicU32>,
488489
}
489490

490491
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 }
496494
}
497495
}
498496

499497
impl ops::Drop for HasDrop {
500498
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);
506500
}
507501
}
508502

@@ -588,7 +582,8 @@ mod tests {
588582

589583
#[test]
590584
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());
592587
let internal = lv2_sys::LV2_Worker_Schedule {
593588
handle: ptr::null_mut(),
594589
schedule_work: Some(extern_schedule),
@@ -598,12 +593,13 @@ mod tests {
598593
phantom: PhantomData::<*const TestDropWorker>,
599594
};
600595
let _ = schedule.schedule_work(hd);
596+
assert_eq!(ctr.load(Ordering::Relaxed), 0);
601597
}
602598

603599
#[test]
604-
#[should_panic(expected = "Dropped")]
605600
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());
607603
let internal = lv2_sys::LV2_Worker_Schedule {
608604
handle: ptr::null_mut(),
609605
schedule_work: Some(faulty_schedule),
@@ -613,35 +609,39 @@ mod tests {
613609
phantom: PhantomData::<*const TestDropWorker>,
614610
};
615611
let _ = schedule.schedule_work(hd);
612+
assert_eq!(ctr.load(Ordering::Relaxed), 1);
616613
}
617614

618615
#[test]
619616
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());
621619
let respond = ResponseHandler {
622620
response_function: Some(extern_respond),
623621
respond_handle: ptr::null_mut(),
624622
phantom: PhantomData::<TestDropWorker>,
625623
};
626624
let _ = respond.respond(hd);
625+
assert_eq!(ctr.load(Ordering::Relaxed), 0);
627626
}
628627

629628
#[test]
630-
#[should_panic(expected = "Dropped")]
631629
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());
633632
let respond = ResponseHandler {
634633
response_function: Some(faulty_respond),
635634
respond_handle: ptr::null_mut(),
636635
phantom: PhantomData::<TestDropWorker>,
637636
};
638637
let _ = respond.respond(hd);
638+
assert_eq!(ctr.load(Ordering::Relaxed), 1);
639639
}
640640

641641
#[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()));
645645
let ptr_hd = &hd as *const _ as *const c_void;
646646
let size = mem::size_of_val(&hd) as u32;
647647
let mut tdw = TestDropWorker {};
@@ -657,46 +657,13 @@ mod tests {
657657
ptr_hd,
658658
);
659659
}
660+
assert_eq!(ctr.load(Ordering::Relaxed), 1);
660661
}
661662

662663
#[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()));
700667
let ptr_hd = &hd as *const _ as *const c_void;
701668
let size = mem::size_of_val(&hd) as u32;
702669
let mut tdw = TestDropWorker {};
@@ -706,5 +673,6 @@ mod tests {
706673
unsafe {
707674
WorkerDescriptor::<TestDropWorker>::extern_work_response(ptr_tdw, size, ptr_hd);
708675
}
676+
assert_eq!(ctr.load(Ordering::Relaxed), 1);
709677
}
710678
}

0 commit comments

Comments
 (0)