I am onboard with the idea but I would like more details in the RFC. I would prefer that the C bindings be in its own library. The only symbols that should be visible from this library should be the C exported symbols, the internal C++ symbols should be hidden.
I feel like this library makes the most sense as a static library. I saw this because in .NET we would link it as a mixed mode assembly to avoid having multiple shared libraries to link. If we did a node client I would expect it too would statically link this library as into its shared library. Same I imagine would apply to all other language bindings. How are you planning on managing allocation and deallocation of these opaque void* pointers. You vaguely showed the allocation but deallocation would be a good example. I would assume some “destroy” method for every “create” method. Does it make sense to have the CacheFactory concept at all (especially since it is more of a builder)? Could we have some C struct that can be used to create the cache, where the struct has fields for all the configuration? In general can we rethink the API so that it makes sense for C or other language bindings? What about finding a way to be more expressive than void*. Typedefs at least express some meaning when hovering but will just decay without warning to the void*. Consider: typedef void* CacheFactory; typedef void* Cache; CacheFactory createCacheFactory(void); void destroyCacheFactory(CacheFactory cacheFactory); Cache createCache(CacheFactory cacheFactory); void destroyCache(Cache cache); But this compiles: CacheFactory cacheFactory = createCacheFactory(); destroyCache(cacheFactory); And explodes at runtime. Example https://github.com/pivotal-jbarrett/geode-native/tree/2d7d0a28fb6f85988e7b921fd96ebb975bad8126/ccache <https://github.com/pivotal-jbarrett/geode-native/tree/2d7d0a28fb6f85988e7b921fd96ebb975bad8126/ccache> We could use structs to hold the opaque pointers, and other values. typedef struct { void* ptr; } CacheFactory; typedef struct { void* ptr; } Cache; And now this does not compile: CacheFactory cacheFactory = createCacheFactory(); destroyCache(cacheFactory); Example https://github.com/pivotal-jbarrett/geode-native/tree/23b44e281fd9771474ff3555020710bf23f454ae/ccache <https://github.com/pivotal-jbarrett/geode-native/tree/23b44e281fd9771474ff3555020710bf23f454ae/ccache> -Jake > On Mar 24, 2020, at 2:20 PM, Blake Bender <bben...@pivotal.io> wrote: > > Hello everyone, > > We'd like to add C bindings to the native client, in preparation for the > larger task of adding support for new languages, e.g. .net core. Please > have a look at the proposal below and let me know what you think. > > Thanks, > > Blake > > > https://cwiki.apache.org/confluence/display/GEODE/Add+C+Bindings+to+Native+Client+Library