[libvirt] PATCH: 3/7: Main HAL & DeviceKit impl
Mark McLoughlin
markmc at redhat.com
Thu Nov 20 18:12:55 UTC 2008
Hi Dan,
All looks good in general - just want to call out the couple of devkit
leaks again. No problem leaving them 'til later to fix, of course.
Cheers,
Mark.
On Thu, 2008-11-20 at 17:55 +0000, Daniel P. Berrange wrote:
> +
> +static void dev_create(void *_dkdev, void *_dkclient ATTRIBUTE_UNUSED)
> +{
> + DevkitDevice *dkdev = _dkdev;
> + const char *sysfs_path = devkit_device_get_native_path(dkdev);
> + virNodeDeviceObjPtr dev = NULL;
> + const char *name;
> + int rv;
> +
> + if (sysfs_path == NULL)
> + /* Currently using basename(sysfs_path) as device name (key) */
> + return;
> +
> + name = strrchr(sysfs_path, '/');
> + if (name == NULL)
> + name = sysfs_path;
> + else
> + ++name;
> +
> + if (VIR_ALLOC(dev) < 0 || VIR_ALLOC(dev->def) < 0)
> + goto failure;
> +
> + dev->privateData = dkdev;
Still leaking the GObject ref here, I think
> +static int devkitDeviceMonitorStartup(void)
> +{
> + size_t caps_tbl_len = sizeof(caps_tbl) / sizeof(caps_tbl[0]);
> + DevkitClient *devkit_client = NULL;
> + GError *err = NULL;
> + GList *devs;
> + int i;
> +
> + /* Ensure caps_tbl is sorted by capability name */
> + qsort(caps_tbl, caps_tbl_len, sizeof(caps_tbl[0]), cmpstringp);
> +
> + if (VIR_ALLOC(driverState) < 0)
> + return -1;
> +
> + // TODO: Is it really ok to call this multiple times??
> + // Is there something analogous to call on close?
> + g_type_init();
> +
> + /* Get new devkit_client and connect to daemon */
> + devkit_client = devkit_client_new(NULL);
> + if (devkit_client == NULL) {
> + DEBUG0("devkit_client_new returned NULL");
> + goto failure;
> + }
> + if (!devkit_client_connect(devkit_client, &err)) {
> + DEBUG0("devkit_client_connect failed");
> + goto failure;
> + }
> +
> + /* Populate with known devices.
> + *
> + * This really should be:
> + devs = devkit_client_enumerate_by_subsystem(devkit_client, NULL, &err);
> + if (err) {
> + DEBUG0("devkit_client_enumerate_by_subsystem failed");
> + devs = NULL;
> + goto failure;
> + }
> + g_list_foreach(devs, dev_create, devkit_client);
> + * but devkit_client_enumerate_by_subsystem currently fails when the second
> + * arg is null (contrary to the API documentation). So the following code
> + * (from Dan B) works around this by listing devices per handled subsystem.
> + */
> +
> + for (i = 0 ; i < ARRAY_CARDINALITY(caps_tbl) ; i++) {
> + const char *caps[] = { caps_tbl[i].cap_name, NULL };
> + devs = devkit_client_enumerate_by_subsystem(devkit_client,
> + caps,
> + &err);
> + if (err) {
> + DEBUG0("devkit_client_enumerate_by_subsystem failed");
> + devs = NULL;
> + goto failure;
> + }
> + g_list_foreach(devs, dev_create, devkit_client);
g_list_free()
More information about the libvir-list
mailing list