Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- meson.build | 7 ------- rust/qemu-api/src/timer.rs | 24 +++++++++++++++++------- 2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/meson.build b/meson.build index 8ed10b6624e..16c76c493f3 100644 --- a/meson.build +++ b/meson.build @@ -4087,13 +4087,6 @@ if have_rust foreach enum : c_bitfields bindgen_args += ['--bitfield-enum', enum] endforeach - c_nocopy = [ - 'QEMUTimer', - ] - # Used to customize Drop trait - foreach struct : c_nocopy - bindgen_args += ['--no-copy', struct] - endforeach # TODO: Remove this comment when the clang/libclang mismatch issue is solved. # diff --git a/rust/qemu-api/src/timer.rs b/rust/qemu-api/src/timer.rs index a593538917a..0305a0385ad 100644 --- a/rust/qemu-api/src/timer.rs +++ b/rust/qemu-api/src/timer.rs @@ -7,10 +7,23 @@ use crate::{ bindings::{self, qemu_clock_get_ns, timer_del, timer_init_full, timer_mod, QEMUClockType}, callbacks::FnCall, + cell::Opaque, }; -pub type Timer = bindings::QEMUTimer; -pub type TimerListGroup = bindings::QEMUTimerListGroup; +/// A safe wrapper around [`bindings::QEMUTimer`]. +#[repr(transparent)] +#[derive(Debug, Default, qemu_api_macros::Wrapper)] +pub struct Timer(Opaque<bindings::QEMUTimer>); + +unsafe impl Send for Timer {} +unsafe impl Sync for Timer {} + +#[repr(transparent)] +#[derive(qemu_api_macros::Wrapper)] +pub struct TimerListGroup(Opaque<bindings::QEMUTimerListGroup>); + +unsafe impl Send for TimerListGroup {} +unsafe impl Sync for TimerListGroup {} impl Timer { pub const MS: u32 = bindings::SCALE_MS; @@ -21,10 +34,6 @@ pub fn new() -> Self { Default::default() } - const fn as_mut_ptr(&self) -> *mut Self { - self as *const Timer as *mut _ - } - pub fn init_full<'timer, 'opaque: 'timer, T, F>( &'timer mut self, timer_list_group: Option<&TimerListGroup>, @@ -51,7 +60,7 @@ pub fn init_full<'timer, 'opaque: 'timer, T, F>( // SAFETY: the opaque outlives the timer unsafe { timer_init_full( - self, + self.as_mut_ptr(), if let Some(g) = timer_list_group { g as *const TimerListGroup as *mut _ } else { @@ -75,6 +84,7 @@ pub fn delete(&self) { } } +// FIXME: use something like PinnedDrop from the pinned_init crate impl Drop for Timer { fn drop(&mut self) { self.delete() -- 2.48.1