Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

glib: Add helper functions to spawn a non-Send future on the curren… #902

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion glib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ pub use self::bridged_logging::{rust_log_handler, GlibLogger, GlibLoggerDomain,
pub mod subclass;

mod main_context_futures;
pub use main_context_futures::{JoinError, JoinHandle};
pub use main_context_futures::{spawn, spawn_with_priority, JoinError, JoinHandle};
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The naming of the functions is a bit suboptimal as there's also this set of functions: https://gtk-rs.org/gtk-rs-core/git/docs/glib/fn.spawn_async.html

Any suggestions?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spawn_main_context?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or directly make these two functions methods of MainContext and add doc aliases on them.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are already methods with that name on MainContext. The goal here is to have a function that gets the correct main context instance and then calls the method on that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spawn_on_thread_default_main_context() could work of course, but that's almost as long as the implementation of the function :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe could move this into a glib::futures module, and also potentially move some other things in there. Not sure.

mod source_futures;
pub use self::source_futures::*;

Expand Down
30 changes: 30 additions & 0 deletions glib/src/main_context_futures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,36 @@ impl Spawn for MainContext {
}
}

// rustdoc-stripper-ignore-next
/// Spawns an infallible, non-`Send` on the current thread-default [`MainContext`].
///
/// Panics if there is no thread-default main context on this thread and if this thread
/// does not own the global default main context.
pub fn spawn<R: 'static, F: Future<Output = R> + 'static>(f: F) -> JoinHandle<R> {
spawn_with_priority(crate::PRIORITY_DEFAULT, f)
}

// rustdoc-stripper-ignore-next
/// Spawns an infallible, non-`Send` on the current thread-default [`MainContext`] with a
/// non-default priority.
///
/// Panics if there is no thread-default main context on this thread and if this thread
/// does not own the global default main context.
pub fn spawn_with_priority<R: 'static, F: Future<Output = R> + 'static>(
priority: Priority,
f: F,
) -> JoinHandle<R> {
let ctx = MainContext::thread_default().unwrap_or_else(|| {
let ctx = MainContext::default();
assert!(
ctx.is_owner(),
"Current thread does not own the default main context and has no thread-default main context",
);
ctx
});
ctx.spawn_local_with_priority(priority, f)
}

impl LocalSpawn for MainContext {
fn spawn_local_obj(&self, f: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> {
let (tx, _) = oneshot::channel();
Expand Down