git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFD] Libification proposal: separate internal and external interfaces

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Apr 7, 2024, 21:33 UTC
Message-ID
<ZhMRNxgwRJ25P4Ud@tapette.crustytoothpaste.net>
In-Reply-To
<CAFySSZAB09QB7U6UxntK2jRJF0df5R7YGnnLSsYc9MYhHsBhWA@mail.gmail.com>
On 2024-04-02 at 14:18:51, Calvin Wan wrote:
Show 7 quoted lines
> Issues
> ------
> - Symbol name collisions: Since C doesn't have namespacing or other
>   official name mangling mechanisms, all of the symbols inside of the
>   library that aren't static are going to be at risk of colliding with
>   symbols in the external project. This is especially a problem for
>   common symbols like "error()".

Yes, I think this is important. We'll want to avoid the mistake that OpenSSL and Perl made by just exporting random symbols or using more than one namespace.

We'll also need to consider that libgit2 is currently using `git_` and thus we'll either need to use something different or avoid conflicts. Perhaps `gitlib_` might be useful.

I might also suggest that we enable symbol versioning on platforms that support it, which is a nice way to avoid conflicts.

Show 9 quoted lines
> - Header files: This is actually several related problems:
>   - Git codebase's header files assume that anything that's brought in
>     via <git-compat-util.h> is available; this includes system header
>     files, but also macro definitions, including ones that change how
>     various headers behave. Example: _GNU_SOURCE and
>     _FILE_OFFSET_BITS=64 cause headers like <unistd.h> to change
>     behavior; _GNU_SOURCE makes it provide different/additional
>     functionality, and _FILE_OFFSET_BITS=64 makes types like `off_t` be
>     64-bit (on some platforms it might be 32-bit without this define).

I should point out that _FILE_OFFSET_BITS=64 is effectively standard these days. Nobody wants their files limited to 2 GiB.

Show 5 quoted lines
> - Tolerant. The header files probably won't be the first/only #include
>   in the external project's translation unit, and they should still
>   work. This means not using types like `off_t` or `struct stat` in the
>   interfaces provided, since their sizes are dependent on the execution
>   environment (what's been included, #defines, CFLAGS, etc.)

Sure. If we need a file size type, it should be something like `int64_t` or `uint64_t` and not `off_t`.

Show 5 quoted lines
> - Limited Platform Compatibility. The external interfaces are able to
>   assume that <stdint.h> and other C99 (or maybe even C11+)
>   functionality exists and use it immediately, without weather balloons
>   or #ifdefs. If some platform requires special handling, that platform
>   isn't supported, at least initially.

I think this is fine. It's 2024. We should assume that C11 (a 13-year-old spec) is available and so is POSIX 1003.1-2008 (except for Windows). We may want to have a nice `#ifdef __STDC__ < 200112L` (and a similar check for POSIX) to just produce an `#error` if the system is too old.

We should therefore also assume that threading is available because POSIX 1003.1-2008 requires it as part of the base specification (and Windows obviously also supports it). Because this is a library, we'll want to avoid interfaces that are clearly not thread safe and document the requirements for thread safety (either that the object must be externally synchronized or that it is internally synchronized).

Show 6 quoted lines
> - Non-colliding. Symbol names in these external interface headers should
>   have a standard, obvious prefix as a manual namespacing solution.
>   Something like `gitlib_`. (Prior art: cURL uses a `curl_` prefix for
>   externally-visible symbols, libgit2 uses `git_<module_name>_foo`
>   names; for internal symbols, they use `Curl_` and `git_<module>__foo`
>   (with a double underscore), respectively)

Yeah, I think we came up with the same idea. I do like the `gitlib_module_foo` approach.

Overall, I read through this and I didn't see anything I obviously disagreed with. Everything seemed to be either reasonable or something I didn't have a strong opinion on.

-- 
brian m. carlson (they/them or he/him)
Toronto, Ontario, CA
Previous: Calvin WanNext: rsbecker@nexbridge.com
Message 2 of 18 in “[RFD] Libification proposal: separate internal and external interfaces”
  1. Calvin WanApr 2, 2024
  2. brian m. carlsonApr 7, 2024
  3. rsbecker@nexbridge.comApr 7, 2024
  4. brian m. carlsonApr 8, 2024
  5. rsbecker@nexbridge.comApr 8, 2024
  6. Junio C HamanoApr 8, 2024
  7. brian m. carlsonApr 9, 2024
  8. Calvin WanApr 9, 2024
  9. Phillip WoodApr 9, 2024
  10. Calvin WanApr 9, 2024
  11. Calvin WanApr 22, 2024
  12. Junio C HamanoApr 22, 2024
  13. phillip.wood123@gmail.comApr 23, 2024
  14. Kyle LippincottMay 9, 2024
  15. Phillip WoodMay 10, 2024
  16. Kyle LippincottMay 10, 2024
  17. Kyle LippincottMay 9, 2024
  18. Junio C HamanoMay 9, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.