On 17-12-21, 10:31, Viresh Kumar wrote:
On 16-12-21, 14:59, Bartosz Golaszewski wrote:
AFAICT this object will not survive the parent buffer. Take a look at the current development version of the C++ bindings where I play with copy constructors to ensure that.
I looked at bindings/cxx/line.cpp::make_line_event() now, is this what you were referring to here ?
Based on what I have understood until now, I think the edge event structure can be modified like this since it is only required to give us certain fixed values:
pub struct EdgeEvent { - event: *mut bindings::gpiod_edge_event, + event_type: GpiodEdgeEvent, + timestamp: Duration, + line_offset: u32, + global_seqno: u64, + line_seqno: u64 }
That way it won't depend on the struct EdgeEventBuffer anymore and can be freed after the buffer is freed.
Adding back some of the removed code as well.
+impl Drop for GpiodEdgeEvent {
- /// Free the edge event object and release all associated resources.
- fn drop(&mut self) {
unsafe { bindings::gpiod_edge_event_free(self.event) }
- }
+}
While testing this I found a bug few days back and I wonder why gpiod_edge_event_free() even exists. The memory for "events" is allocated with the buffer and gpiod_edge_event_free() shouldn't try to free a part of that. This looks buggy.
Yes I realize that the edge event shouldn't exist past the buffer itself, I will try to fix it in a Rusty way (maybe with Arc or something else).