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

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

 



On 28-09-22, 14:20, Bartosz Golaszewski wrote:
> Ok, so this is not correct. The doc for
> gpiod_edge_event_buffer_get_event() says:
> 
>  * @return Pointer to an event stored in the buffer. The lifetime of the
>  *   event is tied to the buffer object. Users must not free the event
>  *   returned by this function.
> 
> We make no guarantees that the address returned by
> gpiod_edge_event_buffer_get_event() will still be valid after a call
> to gpiod_line_request_read_edge_event(). In fact the doc for the
> latter says:
> 
>  * @note Any exising events in the buffer are overwritten.  This is not an
>  *       append operation.
> 
> So we're being clear that after a call to
> gpiod_line_request_read_edge_event(), all previously returned edge
> event pointers are invalid unless the objects to which they point were
> explicitly copied.
> 
> Current implementation does indeed work like what you describe but
> that behavior is not "contractually" guaranteed and can change even
> between minor releases.
> 
> In C++ if you do:
> 
> const edge_event& ev = buffer.get_event(0);
> request.read_edge_event(buffer);
> std::cout << ev << std::endl;
> 
> You risk a segfault.
> 
> My understanding is that Rust should not allow a crash in this
> situation by design.

Hmm, so what exactly do we want to do here then ?

- Don't allow events to be referenced ? i.e. make event_clone() the default
  behavior ?

- Don't allow read_edge_event() to be called twice for a buffer ? that will be
  inefficient though.

- Somehow guarantee that reference to all the events are dropped before issuing
  read_edge_event() again, else make it fail ? I am not sure how straight
  forward that can be though.

-- 
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