Re: [RFC PATCH 2/6] repository: add initialize_repo wrapper without pointer

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

 



On 2024.08.08 08:29, Mike Hommey wrote:
> On Wed, Aug 07, 2024 at 04:23:05PM -0700, Josh Steadmon wrote:
> > On 2024.08.08 07:52, Mike Hommey wrote:
> > > On Wed, Aug 07, 2024 at 11:21:27AM -0700, Josh Steadmon wrote:
> > > > Non-C external consumers of libgit.a have to redefine the `repository`
> > > > object in their own language if they want to call
> > > > initialize_repository() to ensure memory for the object is allocated
> > > > correctly. This is not ideal for external consumers that have no need
> > > > for the entire `the_repository` object but need to call other functions
> > > > from an initialized repository. Therefore, add a friendly
> > > > initialize_repository() wrapper without a `the_repository` pointer.
> > > 
> > > Technically speaking, you don't really need this.
> > > 
> > > You can define `repository` as an opaque type in Rust:
> > > ```
> > > #[allow(non_camel_case_types)]
> > > #[repr(C)]
> > > pub struct repository([u8; 0]);
> > > ```
> > > 
> > > And define `the_repository` as an extern symbol:
> > > ```
> > > extern "C" {
> > >     pub static mut the_repository: *mut repository;
> > > }
> > > ```
> > > 
> > > Mike
> > 
> > I've actually already done a refactor for V2 that will avoid using this
> > patch entirely, but thank you for the pointer. We do something similar
> > to opaquely wrap configset pointers in a later patch (we use an empty
> > enum there, I'm not sure whether that approach or a zero-size array is
> > preferred).
> 
> An empty enum is a never type, I wouldn't recommend using it as an opaque
> wrapper. It will likely lead to the compiler doing bad things.
> https://rust-lang.github.io/never-type-initiative/RFC.html
> 
> `#[repr(C)]` and `[u8; 0]` are recommended by the nomicon.
> https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
> 
> (the PhantomPinned wasn't there last time I saw that page)
> 
> Mike

Fixed in V2 (for ConfigSet). Thanks!




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux