const char *backend_library_name = NULL;
int ret;
- if (info->backend && info->handle)
- return 0;
+ if (info->usage_count > 0)
+ goto out;
backend_library_name = get_backend_library_name(info);
if (!backend_library_name) {
goto err_dlclose;
}
+out:
+ info->usage_count++;
+
return 0;
err_dlclose:
static void __close_backend(struct __hal_module_info *info)
{
- if (!info->backend || !info->handle)
+ info->usage_count--;
+
+ if (info->usage_count > 0)
return;
if (info->handle)
dlclose(info->handle);
+ info->usage_count = 0;
info->backend = NULL;
info->handle = NULL;
}
goto err_dlclose;
}
- info->usage_count++;
-
_I("%s: Get HAL backend: name(%s)/vendor(%s)/library(%s)/count(%d) by %s\n",
info->module_name, info->backend->name, info->backend->vendor,
get_backend_library_name(info), info->usage_count,
goto out;
}
- info->usage_count--;
-
_I("%s: Exit and Prepare to put HAL backend: name(%s)/vendor(%s)/library(%s)/count(%d) by %s\n",
info->module_name, info->backend->name, info->backend->vendor,
get_backend_library_name(info), info->usage_count,
program_invocation_name);
+ __close_backend(info);
+
if (info->usage_count > 0) {
ret = 0;
goto out;
}
- __close_backend(info);
-
_I("%s: Put HAL backend: library(%s)/count(%d) by %s\n",
info->module_name, get_backend_library_name(info), info->usage_count,
program_invocation_name);
if (!info->backend->name || (len + 1 > name_size)) {
_E("%s: Invalid size of name[] array\n", info->module_name);
ret = -EINVAL;
- goto err_conf_exit;
+ goto err_close_backend;
}
strncpy(name, info->backend->name, name_size);
if (!info->backend->vendor || (len + 1 > vendor_size)) {
_E("%s: Invalid size of vendor[] array\n", info->module_name);
ret = -EINVAL;
- goto err_conf_exit;
+ goto err_close_backend;
}
strncpy(vendor, info->backend->vendor, vendor_size);
} else {
_E("%s: Failed to get backend data\n", info->module_name);
ret = -EINVAL;
- goto err_conf_exit;
+ goto err_close_backend;
}
ret = 0;
+err_close_backend:
+ __close_backend(info);
err_conf_exit:
_hal_api_conf_exit();
err_unlock: