Re: [PATCH V6 3/8] libgpiod: Add rust wrapper crate

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11-10-22, 12:25, Kent Gibson wrote:
> On Tue, Oct 11, 2022 at 09:46:51AM +0530, Viresh Kumar wrote:
> > On 29-09-22, 15:55, Miguel Ojeda wrote:
> > > It looks like a container whose elements get invalidated, so
> > > `read_edge_event` could require an exclusive reference to `buffer` in
> > > Rust, that way you cannot keep borrows to its elements like `ev` if
> > > you want to call it. But of course this requires tying the lifetime of
> > > the events to that of the buffer.
> > 
> > What about the below code changes on top of V6 ?
> > 
> 
> Can you clone the event to detach it from the buffer?

I thought we can always do:

event.event_clone() to get a copy, which won't have a reference to the
Buffer. This is how it is defined:

    pub fn event_clone(&self) -> Result<Self> {
        let event = unsafe { gpiod::gpiod_edge_event_copy(self.event) };
        if event.is_null() {
            return Err(Error::OperationFailed(
                OperationType::EdgeEventCopy,
                Errno::last(),
            ));
        }

        Ok(Self {
            buffer: None,
            event,
        })
    }

But when I try to do this in the earlier example:

@@ -40,10 +40,12 @@ fn main() -> Result<()> {
         let event1 = buffer.event(1)?;

         println!("{:?}", (event0.line_offset(), event1.line_offset()));
+        let event0_copy = event0.event_clone()?;
         drop(event0);
         // This fails to compile
         // request.read_edge_events(&mut buffer)?;
         drop(event1);
         request.read_edge_events(&mut buffer)?;
+        drop(event0_copy);
     }
 }

compilation fails :(

error[E0502]: cannot borrow `buffer` as mutable because it is also borrowed as immutable
  --> libgpiod/examples/gpiobufferevent.rs:48:34
   |
39 |         let event0 = buffer.event(0)?;
   |                      --------------- immutable borrow occurs here
...
48 |         request.read_edge_events(&mut buffer)?;
   |                                  ^^^^^^^^^^^ mutable borrow occurs here
49 |         drop(event0_copy);
   |              ----------- immutable borrow later used here


And I am not sure why, as the reference isn't used anymore in this
case to the event0.

-- 
viresh



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux