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