Skip to content

Commit c8764f3

Browse files
committed
Implemented review suggestions
1 parent 4e9473a commit c8764f3

File tree

3 files changed

+62
-83
lines changed

3 files changed

+62
-83
lines changed

rust/kernel/sync/arc.rs

+16-18
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use core::{
3232
mem::{ManuallyDrop, MaybeUninit},
3333
ops::{Deref, DerefMut},
3434
pin::Pin,
35-
ptr::{self, addr_of_mut, NonNull},
35+
ptr::{self, NonNull},
3636
};
3737

3838
/// A reference-counted pointer to an instance of `T`.
@@ -49,9 +49,12 @@ pub struct Arc<T: ?Sized> {
4949
_p: PhantomData<ArcInner<T>>,
5050
}
5151

52+
#[pin_project]
5253
#[repr(C)]
5354
struct ArcInner<T: ?Sized> {
55+
#[pin]
5456
refcount: Opaque<bindings::refcount_t>,
57+
#[pin]
5558
data: T,
5659
}
5760

@@ -483,21 +486,17 @@ impl<T> UniqueArc<T> {
483486
let inner = NonNull::new(unsafe { alloc(layout) })
484487
.ok_or(ENOMEM)?
485488
.cast::<ArcInner<MaybeUninit<T>>>();
486-
// TODO do this using `pinned-init`
487-
488-
// INVARIANT: The refcount is initialised to a non-zero value.
489-
let refcount = Opaque::new(new_refcount());
490-
// SAFETY: `inner` is writable and properly aligned.
491-
unsafe { addr_of_mut!((*inner.as_ptr()).refcount).write(refcount) };
492-
// assert that there are only two fields: refcount and data (done in a closure to avoid
493-
// overflowing the stack in debug mode with a big `T`)
494-
#[allow(unreachable_code, clippy::diverging_sub_expression)]
495-
let _check = || {
496-
let _check: ArcInner<MaybeUninit<T>> = ArcInner {
497-
refcount: todo!(),
498-
data: todo!(),
499-
};
500-
};
489+
let init = pin_init!(ArcInner<MaybeUninit<T>> {
490+
// INVARIANT: The refcount is initialised to a non-zero value.
491+
refcount: Opaque::new(new_refcount()),
492+
data: init::uninit(),
493+
});
494+
// SAFETY: the pointer is valid, as we just allocated it. It will also stay pinned (type
495+
// invariant).
496+
match unsafe { init.__pinned_init(inner.as_ptr()) } {
497+
Ok(()) => {}
498+
Err(e) => match e {},
499+
}
501500

502501
// SAFETY: We just created `inner` with a reference count of 1, which is owned by the new
503502
// `Arc` object.
@@ -517,11 +516,10 @@ impl<T> UniqueArc<MaybeUninit<T>> {
517516
}
518517

519518
/// Initialize the value after creating the `UniqueArc`.
520-
#[allow(clippy::type_complexity)]
521519
pub fn pin_init_now<E>(
522520
mut self,
523521
init: impl PinInit<T, E>,
524-
) -> core::result::Result<Pin<UniqueArc<T>>, (E, UniqueArc<MaybeUninit<T>>)> {
522+
) -> core::result::Result<Pin<UniqueArc<T>>, (E, Self)> {
525523
unsafe {
526524
match init.__pinned_init(self.deref_mut().as_mut_ptr()) {
527525
Ok(()) => Ok(Pin::from(self.assume_init())),

rust/macros/pin_project.rs

+45-52
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ pub(crate) fn pin_project(args: TokenStream, input: TokenStream) -> TokenStream
4242
TokenTree::Punct(p) if p.as_char() == ',' => at_start = true,
4343
TokenTree::Punct(p) if p.as_char() == '\'' && at_start => {
4444
ty_generics.push(tt.clone());
45-
ty_generics.push(TokenTree::Punct(Punct::new(',', Spacing::Alone)));
4645
}
4746
_ => {}
4847
}
@@ -57,55 +56,49 @@ pub(crate) fn pin_project(args: TokenStream, input: TokenStream) -> TokenStream
5756
}
5857
rest.extend(toks);
5958
let last = rest.pop();
60-
TokenStream::from_iter(vec![
61-
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
62-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
63-
TokenTree::Ident(Ident::new("kernel", Span::call_site())),
64-
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
65-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
66-
TokenTree::Ident(Ident::new("pin_project", Span::call_site())),
67-
TokenTree::Punct(Punct::new('!', Spacing::Alone)),
68-
TokenTree::Group(Group::new(
69-
Delimiter::Brace,
70-
TokenStream::from_iter(vec![
71-
TokenTree::Ident(Ident::new("parse_input", Span::call_site())),
72-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
73-
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
74-
TokenTree::Ident(Ident::new("args", Span::call_site())),
75-
TokenTree::Group(Group::new(
76-
Delimiter::Parenthesis,
77-
TokenStream::from_iter(args),
78-
)),
79-
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
80-
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
81-
TokenTree::Ident(Ident::new("sig", Span::call_site())),
82-
TokenTree::Group(Group::new(
83-
Delimiter::Parenthesis,
84-
TokenStream::from_iter(rest),
85-
)),
86-
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
87-
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
88-
TokenTree::Ident(Ident::new("impl_generics", Span::call_site())),
89-
TokenTree::Group(Group::new(
90-
Delimiter::Parenthesis,
91-
TokenStream::from_iter(impl_generics),
92-
)),
93-
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
94-
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
95-
TokenTree::Ident(Ident::new("ty_generics", Span::call_site())),
96-
TokenTree::Group(Group::new(
97-
Delimiter::Parenthesis,
98-
TokenStream::from_iter(ty_generics),
99-
)),
100-
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
101-
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
102-
TokenTree::Ident(Ident::new("body", Span::call_site())),
103-
TokenTree::Group(Group::new(
104-
Delimiter::Parenthesis,
105-
TokenStream::from_iter(last),
106-
)),
107-
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
108-
]),
109-
)),
110-
])
59+
let mut ret = vec![];
60+
ret.extend("::kernel::pin_project!".parse::<TokenStream>().unwrap());
61+
ret.push(TokenTree::Group(Group::new(
62+
Delimiter::Brace,
63+
TokenStream::from_iter(vec![
64+
TokenTree::Ident(Ident::new("parse_input", Span::call_site())),
65+
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
66+
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
67+
TokenTree::Ident(Ident::new("args", Span::call_site())),
68+
TokenTree::Group(Group::new(
69+
Delimiter::Parenthesis,
70+
TokenStream::from_iter(args),
71+
)),
72+
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
73+
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
74+
TokenTree::Ident(Ident::new("sig", Span::call_site())),
75+
TokenTree::Group(Group::new(
76+
Delimiter::Parenthesis,
77+
TokenStream::from_iter(rest),
78+
)),
79+
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
80+
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
81+
TokenTree::Ident(Ident::new("impl_generics", Span::call_site())),
82+
TokenTree::Group(Group::new(
83+
Delimiter::Parenthesis,
84+
TokenStream::from_iter(impl_generics),
85+
)),
86+
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
87+
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
88+
TokenTree::Ident(Ident::new("ty_generics", Span::call_site())),
89+
TokenTree::Group(Group::new(
90+
Delimiter::Parenthesis,
91+
TokenStream::from_iter(ty_generics),
92+
)),
93+
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
94+
TokenTree::Punct(Punct::new('@', Spacing::Alone)),
95+
TokenTree::Ident(Ident::new("body", Span::call_site())),
96+
TokenTree::Group(Group::new(
97+
Delimiter::Parenthesis,
98+
TokenStream::from_iter(last),
99+
)),
100+
TokenTree::Punct(Punct::new(',', Spacing::Alone)),
101+
]),
102+
)));
103+
TokenStream::from_iter(ret)
111104
}

rust/macros/pinned_drop.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,7 @@ pub(crate) fn pinned_drop(_args: TokenStream, input: TokenStream) -> TokenStream
3333
}
3434
let idx = pinned_drop_idx.unwrap();
3535
// fully qualify the `PinnedDrop`.
36-
toks.splice(
37-
idx..idx,
38-
vec![
39-
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
40-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
41-
TokenTree::Ident(Ident::new("kernel", Span::call_site())),
42-
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
43-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
44-
TokenTree::Ident(Ident::new("init", Span::call_site())),
45-
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
46-
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
47-
],
48-
);
36+
toks.splice(idx..idx, "::kernel::init::".parse::<TokenStream>().unwrap());
4937
// take the {} body.
5038
if let Some(TokenTree::Group(last)) = toks.pop() {
5139
TokenStream::from_iter(vec![

0 commit comments

Comments
 (0)