On Mon, May 13, 2019 at 04:33:17PM +0200, Andrea Bolognani wrote:
> On Mon, 2019-05-13 at 13:19 +0100, Daniel P. Berrangé wrote:
> > On Mon, May 13, 2019 at 02:00:28PM +0200, Andrea Bolognani wrote:
> > > One possible complication is that we would not be able to use any
> > > of the GLib types in our public API... I think the way we should
> > > approach this is to consider the current public API as if it were
> > > yet another language binding, the language being plain C in this
> > > case, and make sure we have a very well defined boundary between
> > > them and everything else, basically treating them as a separate
> > > project that just so happens to live in the same repository and be
> > > developed in tandem. This should also make it easier for us to
> > > switch to a different programming language in the future, should
> > > we decide to.
> > 
> > I'm not sure why you say we can't use GLib types in our public API ?
> > 
> > I think we could use them, but I'd probably suggest we none the less
> > choose not to use them in public API, only internally :-)
> > 
> > But I'm anticipating we could replace virObject, with GObject, and as
> > such all the virXXXXXPtr types in our public API would become GObjects.
> > I think we'd likely keep them as opaque types though, despite the fact
> > that they'd be GObjects, to retain our freedom to change impl again
> > later if we wish.
> > 
> > I won't think we need to change use of 'long long' to 'gint64', etc
> > Not least because because GLib maintainers themselves are questioning
> > whether to just mandate stdint.h types. This is fairly minor though.
> 
> I was mostly thinking about this latter example and other situations
> along those lines. For example, we'll definitely need to start using
> gchar* internally, and since we don't want that implementation detail
> exposed in our plain C bindings, then we'll have to do at least some
> very lightweight conversion (casting) between that and char*. This is
> one of the examples where considering the existing API as a language
> binding would IMHO result in a maintainable structure.
> 
> Another situation where the above model would help is error
> reporting: if we start using GLib heavily, then it might make sense
> to adopt GError as well, but doing so means we'd have to convert to
> our existing error reporting facilities somewhere. If we consider the
> plain C API to be a binding, then that's not different from what we
> already do for Python and friends.

Yep,I see what you mean.

> 
> As for GObject, yeah, we want all public structures to be opaque
> anyway; at the same time, we won't be able to turn existing
> non-opaque public structures into GObjects. I'm not sure how big of
> a deal that would be in practice, but I just thought I'd bring it up.

There is a concept called "Boxed types[1]" which lets you deal with
plain C structs using the GObject system. It is good when you have
a light weight struct where you want easy deep-copying but don't
want the overhead of a full GObject, or where you're consuming
structs defined by a 3rd party which you can't control.

But as we seem to agree, I don't think we need touch anything in
the public headers in the forseable future, so don't have to worry
about that.

Regards,
Daniel

[1] https://developer.gnome.org/gobject/stable/gobject-Boxed-Types.html
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to