On Tuesday, October 25th, 2022 at 08:42, Viresh Kumar viresh.kumar@linaro.org wrote:
On 21-10-22, 14:34, Björn Roy Baron wrote:
impl<'b> Event<'b> {
/// Get an event stored in the buffer.
- pub(crate) fn new(buffer: &'b Buffer, index: usize) -> Result<Self> {
- pub(crate) fn new(buffer: &'b Buffer, index: usize) -> Result<Event<'b>> {
This looks good to me.
+impl<'e, 'b> Event<'e> {
pub fn event_clone(event: &Event<'b>) -> Result<Event<'e>>
where
'e: 'b,
Using `Event<'b>` on both sides should work fine. `Event` is covariant in it's lifetime parameter, so `Event<'b>` can be turned into `Event<'e>` with `'e` being a shorter lifetime than `'b`. What you wrote here is not incorrect, so if you prefer keeping it this way that is fine with me.
That doesn't let the cloned event to live past read_edge_events().
error[E0502]: cannot borrow `buffer` as mutable because it is also borrowed as immutable --> libgpiod/examples/gpio_events.rs:70:50
| 64 | let event = buffer.event(0)?; | --------------- immutable borrow occurs here ... 70 | let count = request.read_edge_events(&mut buffer)?; | ^^^^^^^^^^^ mutable borrow occurs here ... 86 | } | - immutable borrow might be used here, when `cloned_event` is dropped and runs the `Drop` code for type `libgpiod::request::Event`
-- viresh
I would have expected that to work fine, but as it doesn't work keeping your code with two separate lifetimes is fine.
Cheers, Bjorn