address comments
This commit is contained in:
parent
6024a85663
commit
edca84a42c
|
@ -11,7 +11,7 @@ use objc::{class, msg_send, sel, sel_impl};
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use super::{BackgroundThread, EventLoop, MainThreadExecutor};
|
use super::{BackgroundThread, EventLoop, MainThreadExecutor, TASK_QUEUE_CAPACITY};
|
||||||
|
|
||||||
/// Wrapping the `CFRunLoopSourceRef` type is required to be able to annotate it as thread-safe.
|
/// Wrapping the `CFRunLoopSourceRef` type is required to be able to annotate it as thread-safe.
|
||||||
struct LoopSourceWrapper(CFRunLoopSourceRef);
|
struct LoopSourceWrapper(CFRunLoopSourceRef);
|
||||||
|
@ -36,8 +36,9 @@ pub(crate) struct MacOSEventLoop<T, E> {
|
||||||
/// The sender for passing messages to the main thread.
|
/// The sender for passing messages to the main thread.
|
||||||
main_thread_sender: Sender<T>,
|
main_thread_sender: Sender<T>,
|
||||||
|
|
||||||
/// Is it necessary to store the information that is sent to the callback function here?
|
/// The data that is passed to the external run loop source callback function via a raw pointer.
|
||||||
_info: Arc<(Arc<E>, Receiver<T>)>,
|
/// The data is not accessed from the Rust side after creating it but it's kept here so as not to get dropped.
|
||||||
|
_thread_data: Box<(Arc<E>, Receiver<T>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> EventLoop<T, E> for MacOSEventLoop<T, E>
|
impl<T, E> EventLoop<T, E> for MacOSEventLoop<T, E>
|
||||||
|
@ -46,15 +47,14 @@ where
|
||||||
E: MainThreadExecutor<T> + 'static,
|
E: MainThreadExecutor<T> + 'static,
|
||||||
{
|
{
|
||||||
fn new_and_spawn(executor: Arc<E>) -> Self {
|
fn new_and_spawn(executor: Arc<E>) -> Self {
|
||||||
// What's a good size for the queue?
|
let (main_thread_sender, main_thread_receiver) = channel::bounded::<T>(TASK_QUEUE_CAPACITY);
|
||||||
let (main_thread_sender, main_thread_receiver) = channel::bounded::<T>(32);
|
|
||||||
|
|
||||||
let info = Arc::new((executor.clone(), main_thread_receiver));
|
let thread_data = Box::new((executor.clone(), main_thread_receiver));
|
||||||
|
|
||||||
let loop_source;
|
let loop_source;
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut source_context = CFRunLoopSourceContext {
|
let source_context = CFRunLoopSourceContext {
|
||||||
info: Arc::as_ptr(&info) as *mut c_void,
|
info: &*thread_data as *const _ as *mut c_void,
|
||||||
cancel: None,
|
cancel: None,
|
||||||
copyDescription: None,
|
copyDescription: None,
|
||||||
equal: None,
|
equal: None,
|
||||||
|
@ -69,7 +69,7 @@ where
|
||||||
loop_source = CFRunLoopSourceCreate(
|
loop_source = CFRunLoopSourceCreate(
|
||||||
kCFAllocatorDefault,
|
kCFAllocatorDefault,
|
||||||
1,
|
1,
|
||||||
&mut source_context as *mut _ as *mut CFRunLoopSourceContext,
|
&source_context as *const _ as *mut CFRunLoopSourceContext,
|
||||||
);
|
);
|
||||||
CFRunLoopAddSource(CFRunLoopGetMain(), loop_source, kCFRunLoopCommonModes);
|
CFRunLoopAddSource(CFRunLoopGetMain(), loop_source, kCFRunLoopCommonModes);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ where
|
||||||
background_thread: BackgroundThread::new_and_spawn(executor),
|
background_thread: BackgroundThread::new_and_spawn(executor),
|
||||||
loop_source: LoopSourceWrapper(loop_source),
|
loop_source: LoopSourceWrapper(loop_source),
|
||||||
main_thread_sender,
|
main_thread_sender,
|
||||||
_info: info,
|
_thread_data: thread_data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue