now safer
This commit is contained in:
parent
225292d08a
commit
e4083288e6
2 changed files with 18 additions and 3 deletions
|
@ -13,6 +13,8 @@ pub struct Handle {
|
|||
inner: NonNull<ffi::mpv_handle>,
|
||||
wakeup: Pin<Box<Event>>, // the wakeup callback holds a pointer to this
|
||||
wait_event_cell: RefCell<()>,
|
||||
|
||||
pending_hooks: RefCell<Vec<u64>>,
|
||||
}
|
||||
|
||||
// The client API is generally fully thread-safe, unless otherwise noted.
|
||||
|
@ -67,6 +69,8 @@ impl Handle {
|
|||
inner,
|
||||
wakeup,
|
||||
wait_event_cell: RefCell::new(()),
|
||||
|
||||
pending_hooks: RefCell::new(vec![]),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,6 +145,18 @@ impl Handle {
|
|||
Error::from_return_code(unsafe { ffi::mpv_hook_continue(self.inner.as_ptr(), id) })
|
||||
}
|
||||
|
||||
pub fn continue_hook(&self, id: u64) -> Result<(), Error> {
|
||||
let mut pending_hooks = self.pending_hooks.borrow_mut();
|
||||
for (i, pending_id) in pending_hooks.iter().enumerate() {
|
||||
if *pending_id == id {
|
||||
pending_hooks.swap_remove(i);
|
||||
return unsafe { self.continue_hook_unchecked(id) };
|
||||
}
|
||||
}
|
||||
|
||||
panic!("invalid hook id")
|
||||
}
|
||||
|
||||
// should take listener before we drain the event queue, so we don't miss any notifications
|
||||
pub fn wakeup_listener(&self) -> EventListener {
|
||||
self.wakeup.listen()
|
||||
|
@ -219,6 +235,7 @@ impl Handle {
|
|||
|
||||
ffi::mpv_event_id_MPV_EVENT_HOOK => {
|
||||
let data = unsafe { &*(event.data as *mut ffi::mpv_event_hook) };
|
||||
self.pending_hooks.borrow_mut().push(data.id);
|
||||
Some(MpvEvent::Hook(HookEvent {
|
||||
reply_userdata: event.reply_userdata,
|
||||
name: unsafe { CStr::from_ptr(data.name) }
|
||||
|
|
|
@ -179,9 +179,7 @@ where
|
|||
assert_eq!(&event.name, "on_before_start_file");
|
||||
// just use this as a barrier
|
||||
println!("on_before_start_file triggered");
|
||||
unsafe {
|
||||
self.mpv.continue_hook_unchecked(event.id).unwrap();
|
||||
}
|
||||
self.mpv.continue_hook(event.id).unwrap();
|
||||
}
|
||||
|
||||
_ => unreachable!(),
|
||||
|
|
Loading…
Reference in a new issue