Re: [RFC PATCH 2/6] repository: add initialize_repo wrapper without pointer
From: Mike Hommey <hidden>
Date: 2024-08-07 23:29:23
On Wed, Aug 07, 2024 at 04:23:05PM -0700, Josh Steadmon wrote:
On 2024.08.08 07:52, Mike Hommey wrote:quoted
On Wed, Aug 07, 2024 at 11:21:27AM -0700, Josh Steadmon wrote:quoted
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; }MikeI'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