Skip to content

Commit ad28e6c

Browse files
authored
Merge pull request #135 from ratijas/futures
Cosmetic changes in futures.rs reduce cognitive load and localize unsafe blocks.
2 parents 9bceb2e + da57a01 commit ad28e6c

File tree

2 files changed

+43
-47
lines changed

2 files changed

+43
-47
lines changed

qmetaobject/src/future.rs

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
use crate::connections::SignalArgArrayToTuple;
21
use std::future::Future;
32
use std::os::raw::c_void;
43
use std::pin::Pin;
4+
use std::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};
5+
6+
use crate::connections::SignalArgArrayToTuple;
57

6-
static QT_WAKER_VTABLE: std::task::RawWakerVTable = unsafe {
7-
std::task::RawWakerVTable::new(
8-
|s: *const ()| {
9-
std::task::RawWaker::new(
10-
cpp!([s as "Waker*"] -> *const() as "Waker*" {
11-
s->refs++;
12-
return s;
13-
}),
14-
&QT_WAKER_VTABLE,
15-
)
16-
},
17-
|s: *const ()| {
18-
cpp!([s as "Waker*"] {
19-
s->wake();
20-
s->deref();
21-
})
22-
},
23-
|s: *const ()| {
24-
cpp!([s as "Waker*"] {
25-
s->wake();
26-
})
27-
},
28-
|s: *const ()| {
29-
cpp!([s as "Waker*"] {
30-
s->deref();
31-
})
32-
},
33-
)
34-
};
8+
static QT_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
9+
|s: *const ()| {
10+
RawWaker::new(
11+
cpp!(unsafe [s as "Waker *"] -> *const() as "Waker *" {
12+
s->refs++;
13+
return s;
14+
}),
15+
&QT_WAKER_VTABLE,
16+
)
17+
},
18+
|s: *const ()| {
19+
cpp!(unsafe [s as "Waker *"] {
20+
s->wake();
21+
s->deref();
22+
})
23+
},
24+
|s: *const ()| {
25+
cpp!(unsafe [s as "Waker *"] {
26+
s->wake();
27+
})
28+
},
29+
|s: *const ()| {
30+
cpp!(unsafe [s as "Waker *"] {
31+
s->deref();
32+
})
33+
},
34+
);
3535

3636
cpp! {{
3737

@@ -61,8 +61,8 @@ cpp! {{
6161
return;
6262
}
6363
completed = rust!(ProcessQtEvent [
64-
this: *const () as "Waker*",
65-
future: *mut dyn Future<Output=()> as "TraitObject"
64+
this: *const () as "Waker *",
65+
future: *mut dyn Future<Output = ()> as "TraitObject"
6666
] -> bool as "bool" {
6767
poll_with_qt_waker(this, Pin::new_unchecked(&mut *future))
6868
});
@@ -89,7 +89,7 @@ cpp! {{
8989
}
9090

9191
~Waker() {
92-
rust!(QtDestroyFuture [future: *mut dyn Future<Output=()> as "TraitObject"] {
92+
rust!(QtDestroyFuture [future: *mut dyn Future<Output = ()> as "TraitObject"] {
9393
std::mem::drop(Box::from_raw(future))
9494
});
9595
}
@@ -107,7 +107,7 @@ cpp! {{
107107
pub fn execute_async(f: impl Future<Output = ()> + 'static) {
108108
let f: *mut dyn Future<Output = ()> = Box::into_raw(Box::new(f));
109109
unsafe {
110-
let waker = cpp!([f as "TraitObject"] -> *const() as "Waker*" {
110+
let waker = cpp!([f as "TraitObject"] -> *const() as "Waker *" {
111111
return new Waker(f);
112112
});
113113
poll_with_qt_waker(waker, Pin::new_unchecked(&mut *f));
@@ -116,10 +116,10 @@ pub fn execute_async(f: impl Future<Output = ()> + 'static) {
116116

117117
// SAFETY: caller must ensure that given future hasn't returned Poll::Ready earlier.
118118
unsafe fn poll_with_qt_waker(waker: *const (), future: Pin<&mut dyn Future<Output = ()>>) -> bool {
119-
cpp!([waker as "Waker*"] { waker->refs++; });
120-
let waker = std::task::RawWaker::new(waker, &QT_WAKER_VTABLE);
121-
let waker = std::task::Waker::from_raw(waker);
122-
let mut context = std::task::Context::from_waker(&waker);
119+
cpp!([waker as "Waker *"] { waker->refs++; });
120+
let waker = RawWaker::new(waker, &QT_WAKER_VTABLE);
121+
let waker = Waker::from_raw(waker);
122+
let mut context = Context::from_waker(&waker);
123123
future.poll(&mut context).is_ready()
124124
}
125125

@@ -139,7 +139,7 @@ pub unsafe fn wait_on_signal<Args: SignalArgArrayToTuple>(
139139
) -> impl Future<Output = <Args as SignalArgArrayToTuple>::Tuple> {
140140
enum ConnectionFutureState<Args: SignalArgArrayToTuple> {
141141
Init { sender: *const c_void, signal: crate::connections::Signal<Args> },
142-
Started { handle: crate::connections::ConnectionHandle, waker: std::task::Waker },
142+
Started { handle: crate::connections::ConnectionHandle, waker: Waker },
143143
Finished { result: <Args as SignalArgArrayToTuple>::Tuple },
144144
Invalid,
145145
}
@@ -158,14 +158,11 @@ pub unsafe fn wait_on_signal<Args: SignalArgArrayToTuple>(
158158

159159
impl<Args: SignalArgArrayToTuple> Future for ConnectionFuture<Args> {
160160
type Output = <Args as SignalArgArrayToTuple>::Tuple;
161-
fn poll(
162-
mut self: Pin<&mut Self>,
163-
ctx: &mut std::task::Context,
164-
) -> std::task::Poll<Self::Output> {
161+
fn poll(mut self: Pin<&mut Self>, ctx: &mut Context) -> Poll<Self::Output> {
165162
let state = &mut self.0;
166163
*state = match std::mem::replace(state, ConnectionFutureState::Invalid) {
167164
ConnectionFutureState::Finished { result } => {
168-
return std::task::Poll::Ready(result);
165+
return Poll::Ready(result);
169166
}
170167
ConnectionFutureState::Init { sender, signal } => {
171168
let s_ptr = state as *mut ConnectionFutureState<_>;
@@ -176,7 +173,7 @@ pub unsafe fn wait_on_signal<Args: SignalArgArrayToTuple>(
176173
s @ ConnectionFutureState::Started { .. } => s,
177174
ConnectionFutureState::Invalid => unreachable!(),
178175
};
179-
std::task::Poll::Pending
176+
Poll::Pending
180177
}
181178
}
182179

qmetaobject/src/itemmodel.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ pub trait QAbstractItemModel: QObject {
129129
/// Refer to the Qt documentation of QAbstractListModel::layoutAboutToBeChanged
130130
///
131131
/// update_model_indexes need to be called between layout_about_to_be_changed and layout_changed
132-
fn update_model_indexes(&self, f: &mut dyn FnMut(QModelIndex) -> QModelIndex)
133-
{
132+
fn update_model_indexes(&self, f: &mut dyn FnMut(QModelIndex) -> QModelIndex) {
134133
let obj = self.get_cpp_object();
135134
cpp!(unsafe [obj as "Rust_QAbstractItemModel *", f as "TraitObject"] {
136135
if (!obj) return;

0 commit comments

Comments
 (0)