[Libguestfs] [v2v PATCH 6/9] convert/libosinfo: wrap osinfo_os_get_all_devices()

Richard W.M. Jones rjones at redhat.com
Thu Jan 6 14:58:13 UTC 2022



On Thu, Jan 06, 2022 at 03:09:07PM +0100, Laszlo Ersek wrote:
> +value
> +v2v_osinfo_os_get_all_devices (value osv)
> +{
> +  CAMLparam1 (osv);
> +  CAMLlocal3 (retval, link, props);

It's a matter of style but I would tend to name variables which are
OCaml values (C type: value) as "<something>v", just to remind myself
that they have to follow the rules; see for example:

https://github.com/libguestfs/virt-v2v/blob/f9d5448d2efec106ab452e7b219ca179752983c3/convert/libosinfo-c.c#L108

> +  g_autoptr (OsinfoDeviceList) dev_list = NULL;
> +  OsinfoList *ent_list;
> +  gint ent_nr;
> +
> +  retval = Val_emptylist;
> +  dev_list = osinfo_os_get_all_devices (OsinfoOs_t_val (osv), NULL);
> +  ent_list = OSINFO_LIST (dev_list);
> +  ent_nr = osinfo_list_get_length (ent_list);
> +
> +  while (ent_nr > 0) {
> +    OsinfoEntity *ent;
> +    size_t prop_nr;
> +
> +    --ent_nr;
> +    ent = osinfo_list_get_nth (ent_list, ent_nr);
> +
> +    props = caml_alloc (NUM_DEVICE_PROPS, 0);
> +    for (prop_nr = 0; prop_nr < NUM_DEVICE_PROPS; ++prop_nr) {
> +      const gchar *prop_val;
> +
> +      prop_val = osinfo_entity_get_param_value (ent, device_prop[prop_nr]);
> +      if (prop_val == NULL)
> +        prop_val = "";
> +      Store_field (props, prop_nr, caml_copy_string (prop_val));

This works because the struct only contains strings:

type osinfo_device = {
  id : string;
  vendor : string;
  vendor_id : string;
  product : string;
  product_id : string;
  name : string;
  class_ : string;
  bus_type : string;
  subsystem : string;
}

which is OK, but doesn't libosinfo let us convert them to more natural
types?

Another thing which is not actually a bug but is potentially
dangerous is:

  Store_field (props, prop_nr, caml_copy_string (prop_val));
                               ^^^^

A temporary variable is allocated to store the result of
caml_copy_string, so it's equivalent to:

  value tv = caml_copy_string (prop_val);
  Store_field (props, prop_nr, tv);

Now it turns out that Store_field (which calls caml_modify) is
documented to never call the garbage collector, so the block pointed
to by "tv" could never move, so we're OK!

But the code is nevertheless a bit tricky and you might want to make
the temporary explicit (and include it in the CAMLlocal expression at
the top of the function so it is a global root).

> +    }
> +
> +    link = caml_alloc (2, 0);
> +    Store_field (link, 0, props);
> +    Store_field (link, 1, retval);
> +    retval = link;
> +  }
> +
> +  CAMLreturn (retval);

So the code is fine as it turns out, but:

(a) Might consider using <something>v for value names

(b) It'd be nice if libosinfo gave us real types

(c) Better IMHO to make the temporary variable explicit

ACK

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the Libguestfs mailing list