Skip to content

Commit 5af9f12

Browse files
sdroegebilelmoussaoui
authored andcommitted
Remove unnecessary Send bounds from GIO-style async functions
1 parent 2ce4a43 commit 5af9f12

File tree

5 files changed

+44
-21
lines changed

5 files changed

+44
-21
lines changed

gdk4/src/clipboard.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ impl Clipboard {
2727
"Async operations only allowed if the thread is owning the MainContext"
2828
);
2929

30-
let user_data: Box<Q> = Box::new(callback);
30+
let user_data: Box<glib::thread_guard::ThreadGuard<Q>> =
31+
Box::new(glib::thread_guard::ThreadGuard::new(callback));
3132
unsafe extern "C" fn read_async_trampoline<
3233
Q: FnOnce(Result<(gio::InputStream, GString), glib::Error>) + 'static,
3334
>(
@@ -48,7 +49,9 @@ impl Clipboard {
4849
} else {
4950
Err(from_glib_full(error))
5051
};
51-
let callback: Box<Q> = Box::from_raw(user_data as *mut _);
52+
let callback: Box<glib::thread_guard::ThreadGuard<Q>> =
53+
Box::from_raw(user_data as *mut _);
54+
let callback = callback.into_inner();
5255
callback(result);
5356
}
5457
let callback = read_async_trampoline::<Q>;

gdk4/src/drop.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ impl Drop {
2727
"Async operations only allowed if the thread is owning the MainContext"
2828
);
2929

30-
let user_data: Box<Q> = Box::new(callback);
30+
let user_data: Box<glib::thread_guard::ThreadGuard<Q>> =
31+
Box::new(glib::thread_guard::ThreadGuard::new(callback));
3132
unsafe extern "C" fn read_async_trampoline<
3233
Q: FnOnce(Result<(gio::InputStream, GString), glib::Error>) + 'static,
3334
>(
@@ -48,7 +49,9 @@ impl Drop {
4849
} else {
4950
Err(from_glib_full(error))
5051
};
51-
let callback: Box<Q> = Box::from_raw(user_data as *mut _);
52+
let callback: Box<glib::thread_guard::ThreadGuard<Q>> =
53+
Box::from_raw(user_data as *mut _);
54+
let callback = callback.into_inner();
5255
callback(result);
5356
}
5457
let callback = read_async_trampoline::<Q>;

gdk4/src/functions.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub fn pango_layout_get_clip_region(
3232
}
3333

3434
#[doc(alias = "gdk_content_deserialize_async")]
35-
pub fn content_deserialize_async<R: FnOnce(Result<glib::Value, glib::Error>) + Send + 'static>(
35+
pub fn content_deserialize_async<R: FnOnce(Result<glib::Value, glib::Error>) + 'static>(
3636
stream: &impl IsA<gio::InputStream>,
3737
mime_type: &str,
3838
type_: glib::types::Type,
@@ -51,9 +51,10 @@ pub fn content_deserialize_async<R: FnOnce(Result<glib::Value, glib::Error>) + S
5151
"Async operations only allowed if the thread is owning the MainContext"
5252
);
5353

54-
let user_data: Box<R> = Box::new(callback);
54+
let user_data: Box<glib::thread_guard::ThreadGuard<R>> =
55+
Box::new(glib::thread_guard::ThreadGuard::new(callback));
5556
unsafe extern "C" fn content_deserialize_async_trampoline<
56-
R: FnOnce(Result<glib::Value, glib::Error>) + Send + 'static,
57+
R: FnOnce(Result<glib::Value, glib::Error>) + 'static,
5758
>(
5859
_source_object: *mut glib::gobject_ffi::GObject,
5960
res: *mut gio::ffi::GAsyncResult,
@@ -67,7 +68,8 @@ pub fn content_deserialize_async<R: FnOnce(Result<glib::Value, glib::Error>) + S
6768
} else {
6869
Err(from_glib_full(error))
6970
};
70-
let callback: Box<R> = Box::from_raw(user_data as *mut _);
71+
let callback: Box<glib::thread_guard::ThreadGuard<R>> = Box::from_raw(user_data as *mut _);
72+
let callback = callback.into_inner();
7173
callback(result);
7274
}
7375
let callback = content_deserialize_async_trampoline::<R>;
@@ -228,7 +230,7 @@ pub fn content_register_serializer<
228230
}
229231

230232
#[doc(alias = "gdk_content_serialize_async")]
231-
pub fn content_serialize_async<R: FnOnce(Result<(), glib::Error>) + Send + 'static>(
233+
pub fn content_serialize_async<R: FnOnce(Result<(), glib::Error>) + 'static>(
232234
stream: &impl IsA<gio::OutputStream>,
233235
mime_type: &str,
234236
value: &glib::Value,
@@ -246,9 +248,10 @@ pub fn content_serialize_async<R: FnOnce(Result<(), glib::Error>) + Send + 'stat
246248
is_main_context_owner || has_acquired_main_context.is_some(),
247249
"Async operations only allowed if the thread is owning the MainContext"
248250
);
249-
let user_data: Box<R> = Box::new(callback);
251+
let user_data: Box<glib::thread_guard::ThreadGuard<R>> =
252+
Box::new(glib::thread_guard::ThreadGuard::new(callback));
250253
unsafe extern "C" fn content_serialize_async_trampoline<
251-
R: FnOnce(Result<(), glib::Error>) + Send + 'static,
254+
R: FnOnce(Result<(), glib::Error>) + 'static,
252255
>(
253256
_source_object: *mut glib::gobject_ffi::GObject,
254257
res: *mut gio::ffi::GAsyncResult,
@@ -261,7 +264,8 @@ pub fn content_serialize_async<R: FnOnce(Result<(), glib::Error>) + Send + 'stat
261264
} else {
262265
Err(from_glib_full(error))
263266
};
264-
let callback: Box<R> = Box::from_raw(user_data as *mut _);
267+
let callback: Box<glib::thread_guard::ThreadGuard<R>> = Box::from_raw(user_data as *mut _);
268+
let callback = callback.into_inner();
265269
callback(result);
266270
}
267271
let callback = content_serialize_async_trampoline::<R>;

gdk4/src/subclass/content_provider.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ impl<T: ContentProviderImpl> ContentProviderImplExt for T {
193193
.write_mime_type_finish
194194
.expect("no parent \"write_mime_type_finish\" implementation");
195195

196-
let user_data: Box<(R, _)> = Box::new((callback, finish));
196+
let user_data: Box<(glib::thread_guard::ThreadGuard<R>, _)> =
197+
Box::new((glib::thread_guard::ThreadGuard::new(callback), finish));
197198

198199
unsafe extern "C" fn parent_write_mime_type_async_trampoline<
199200
R: FnOnce(Result<(), glib::Error>) + 'static,
@@ -204,7 +205,7 @@ impl<T: ContentProviderImpl> ContentProviderImplExt for T {
204205
) {
205206
let mut error = std::ptr::null_mut();
206207
let cb: Box<(
207-
R,
208+
glib::thread_guard::ThreadGuard<R>,
208209
fn(
209210
*mut ffi::GdkContentProvider,
210211
*mut gio::ffi::GAsyncResult,
@@ -217,7 +218,8 @@ impl<T: ContentProviderImpl> ContentProviderImplExt for T {
217218
} else {
218219
Err(from_glib_full(error))
219220
};
220-
cb.0(result);
221+
let cb = cb.0.into_inner();
222+
cb(result);
221223
}
222224

223225
let cancellable = cancellable.map(|p| p.as_ref());

gtk4/src/functions.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,27 @@ pub fn accelerator_parse_with_keycode(
5858

5959
#[doc(alias = "gtk_show_uri_full")]
6060
#[doc(alias = "gtk_show_uri_full_finish")]
61-
pub fn show_uri_full<P: FnOnce(Result<(), glib::Error>) + Send + 'static>(
61+
pub fn show_uri_full<P: FnOnce(Result<(), glib::Error>) + 'static>(
6262
parent: Option<&impl IsA<Window>>,
6363
uri: &str,
6464
timestamp: u32,
6565
cancellable: Option<&impl IsA<gio::Cancellable>>,
6666
callback: P,
6767
) {
6868
assert_initialized_main_thread!();
69-
let user_data: Box_<P> = Box_::new(callback);
70-
unsafe extern "C" fn show_uri_full_trampoline<
71-
P: FnOnce(Result<(), glib::Error>) + Send + 'static,
72-
>(
69+
let main_context = glib::MainContext::ref_thread_default();
70+
let is_main_context_owner = main_context.is_owner();
71+
let has_acquired_main_context = (!is_main_context_owner)
72+
.then(|| main_context.acquire().ok())
73+
.flatten();
74+
assert!(
75+
is_main_context_owner || has_acquired_main_context.is_some(),
76+
"Async operations only allowed if the thread is owning the MainContext"
77+
);
78+
79+
let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
80+
Box_::new(glib::thread_guard::ThreadGuard::new(callback));
81+
unsafe extern "C" fn show_uri_full_trampoline<P: FnOnce(Result<(), glib::Error>) + 'static>(
7382
parent_ptr: *mut glib::gobject_ffi::GObject,
7483
res: *mut gio::ffi::GAsyncResult,
7584
user_data: glib::ffi::gpointer,
@@ -81,7 +90,9 @@ pub fn show_uri_full<P: FnOnce(Result<(), glib::Error>) + Send + 'static>(
8190
} else {
8291
Err(from_glib_full(error))
8392
};
84-
let callback: Box_<P> = Box_::from_raw(user_data as *mut _);
93+
let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
94+
Box_::from_raw(user_data as *mut _);
95+
let callback = callback.into_inner();
8596
callback(result);
8697
}
8798
let callback = show_uri_full_trampoline::<P>;

0 commit comments

Comments
 (0)