-
Notifications
You must be signed in to change notification settings - Fork 54
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
core: Relax lifetime constraint on msgs
in I2CTransfer::transfer()
#89
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. Sounds good to me, thank you!
Could you add an entry to the changelog?
7b7cac7
to
a38d4e2
Compare
Yes absolutely! Sorry, got caught up with other stuff today. Revised it just now. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you.
Could you move your changelog entry to the unreleased section?
Oh argh, I misread the changelog section headers yeah I’ll do that |
a38d4e2
to
3595e51
Compare
Ok, changelog is now in the appropriate section |
CI only failed because no macOS runners are available? mebe this is ok to merge? Sorry for requiring 2 updates for the changelog :( |
Hey @eldruin, think we could merge this now? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks good to me, thank you. Let's see if a macOS runner picks the CI job up.
The issue may be that it's trying to use macos-11, which was removed in June. |
Thanks for the hint @kevinmehall. @peterdelevoryas could you change the platform to |
Absolutely! I was wondering if maybe you guys would be ok with me changing that in this diff |
macOS 11 runners have been deprecated! Need this for CI to pass.
This change enables users of `i2cdev` to create generic functions on `T: I2CTransfer` that have output buffers constructed separately from the `I2CMessage` array, like the following: ```rust fn smbus_read_post_box<T>(i2c: &mut T, offset: u16, out: &mut [u8]) where for<'a> T: I2CTransfer<'a>, { let addr = offset.to_be_bytes(); let mut messages = [ T::Message::write(addr), T::Message::read(out), ]; i2c.transfer(&mut messages).expect("uh oh"); } ``` Before this, `messages` would not satisfy the constraints of `.transfer()`, because `messages` does not live as long as one of the output buffers `out`: ``` error[E0597]: `messages` does not live long enough --> src/smbpbisensor.rs:69:19 | 63 | let mut messages = [ | ------------ binding `messages` declared here ... 69 | .transfer(&mut messages) | ^^^^^^^^^^^^^ borrowed value does not live long enough ... 78 | } | - | | | `messages` dropped here while still borrowed | borrow might be used here, when `messages` is dropped and runs the destructor for type `[<T as I2CTransfer<'_>>::Message; 2]` ``` The error message is a little confusing, but basically `&'a mut [Self::Message]` is forcing the array of `I2CMessage`s to match the lifetime of the buffers in the messages, which is not strictly necessary: the array of messages can have a different lifetime than the buffers. After this change, the above example compiles successfully.
Head branch was pushed to by a user without write access
3595e51
to
e6fbc13
Compare
Yay! All the CI passed, I think we're finally ready for merging? @eldruin |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, thank you so much!
This change enables users of
i2cdev
to create generic functions onT: I2CTransfer
that have output buffers constructed separately from theI2CMessage
array, like the following:Before this,
messages
would not satisfy the constraints of.transfer()
, becausemessages
does not live as long as one of the output buffersout
:The error message is a little confusing, but basically
&'a mut [Self::Message]
is forcing the array ofI2CMessage
s to match the lifetime of the buffers in the messages, which is not strictly necessary: the array of messages can have a different lifetime than the buffers. After this change, the above example compiles successfully.