[Libguestfs] [libnbd] More thoughts on callbacks and more

Richard W.M. Jones rjones at redhat.com
Mon Jul 22 11:50:19 UTC 2019


On Mon, Jul 22, 2019 at 10:08:25AM +0100, Richard W.M. Jones wrote:
> On Sat, Jul 20, 2019 at 07:38:45AM +0100, Richard W.M. Jones wrote:
> > More thoughts on callbacks, etc. following on from:
> > https://www.redhat.com/archives/libguestfs/2019-July/thread.html#00184
> > 
> > Closure lifetimes
> > -----------------

Here's a possibly better idea which still changes the API a bit but
not as invasively.

We overload the callback so that it can either be a callback function
or a "free function".  They are distinguished by an extra flag
argument passed to the callback:

  extern int nbd_set_debug_callback (
        struct nbd_handle *h,
        int (*debug_fn) (int valid_flag,   // <-- note
                         void *user_data,
	                 const char *context, const char *msg),
        void *user_data);

The extra ‘valid_flag’ contains one or both of LIBNBD_CALLBACK_VALID
and LIBNBD_CALLBACK_FREE.  Callback code would look like:

  int my_debug_fn (int valid_flag, void *user_data,
                   const char *context, const char *msg)
  {
    if (valid_flag & LIBNBD_CALLBACK_VALID) {
      // This is the normal callback as before.
      printf ("debug msg = %s\n", msg);
    }

    if (valid_flag & LIBNBD_CALLBACK_FREE) {
      // In this case only user_data is valid.  The other parameters
      // may be unspecified (unless VALID was also set).
      free (user_data);
    }
  }

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list