On 17-12-21, 13:02, Bartosz Golaszewski wrote: > On Fri, Dec 17, 2021 at 10:54 AM Viresh Kumar <viresh.kumar@xxxxxxxxxx> wrote: > > > I don't know Rust that well to be able to come up with an idea off the > > > top of my head but I assume inheritance in one way or another exists > > > in rust? Can you have an EdgeEvent interface implemented by two > > > specialized structs, one that's stored in the buffer (stores a pointer > > > to the internal event) > > > > This is what my initial patch had, right? It isn't safe. There is no way for > > libgpiod-rust to guarantee that the users don't access the EdgeEvent after the > > buffer is freed and this needs to be made safer at libgpiod itself. > > > > I'm not sure it had the same thing. In libgpiod it's simple a matter > of definition. The docs state that a pointer retrieved using > gpiod_edge_event_buffer_get_event() must not be freed while one > obtained with gpiod_edge_event_copy() does have to be disposed of. In > C++ it's safe because either you hold a const reference to the object > stored in the event buffer or you have copied it and now it will > survive the parent meaning the user can access the event even after > the buffer was deleted. > > > > and one that stores the copy (and frees it when > > > it goes out of scope)? > > > > I don't understand what we will get out of such a scheme? Is there any benefit > > of getting these values via the pointer to the internal C event ? > > > > You avoid allocating memory for those objects. The memory exists in > the C buffer. In order to keep a similar level of performance you'd > need to replicate the behavior of the buffer in rust as well. I was aligned with all this, I just wanted to skip providing the interface where we use the event without copying as that has Safety issues. I will try to provide both the options now, lets see how it looks. -- viresh