Fix race condition in HAL driver startup

There is a race condition in HAL driver startup where the callback
can get triggered before we have finished startup. This then causes
a deadlock in the driver.

* src/node_device/node_device_hal.c: RElease driver lock before
  registering DBus callbacks
This commit is contained in:
Daniel P. Berrange 2009-11-12 14:10:45 +00:00
parent f24e67d24f
commit fd2090cdb9

View File

@ -742,6 +742,16 @@ static int halDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
goto failure; goto failure;
} }
/* Populate with known devices */
driverState->privateData = hal_ctx;
/* We need to unlock state now, since setting these callbacks cause
* a dbus RPC call, and while this call is waiting for the reply,
* a signal may already arrive, triggering the callback and thus
* requiring the lock !
*/
nodeDeviceUnlock(driverState);
/* Register HAL event callbacks */ /* Register HAL event callbacks */
if (!libhal_ctx_set_device_added(hal_ctx, device_added) || if (!libhal_ctx_set_device_added(hal_ctx, device_added) ||
!libhal_ctx_set_device_removed(hal_ctx, device_removed) || !libhal_ctx_set_device_removed(hal_ctx, device_removed) ||
@ -753,10 +763,6 @@ static int halDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
goto failure; goto failure;
} }
/* Populate with known devices */
driverState->privateData = hal_ctx;
nodeDeviceUnlock(driverState);
udi = libhal_get_all_devices(hal_ctx, &num_devs, &err); udi = libhal_get_all_devices(hal_ctx, &num_devs, &err);
if (udi == NULL) { if (udi == NULL) {
VIR_ERROR0("libhal_get_all_devices failed\n"); VIR_ERROR0("libhal_get_all_devices failed\n");