[libvirt] [PATCH] outline of writing vbox driver

Michal Privoznik mprivozn at redhat.com
Fri Jun 20 09:09:39 UTC 2014


On 17.06.2014 13:06, Taowei wrote:
> Define the vboxUniformedAPI struct to handle version conflicts.
> The vboxInitialize is rewrited with the new mechanism. Other
> functions would be rewriting in the same way.

s/rewriting/rewritten/

>
> Here, I still use template to generate functions in vboxUniformedAPI.
> Though, these functions may change between different versions, but
> not for every version. Using template could decrease the duplicated code.
>
> For every new feature added by vbox, a flag would indicate whether this
> feature is supported in current version. Calling for an unsupported
> feature would lead to a VIR_WARN.
>
> ---
>   src/vbox/vbox_tmpl.c |   84 ++++++++++++++++++++++++++++++++++++--------------
>   1 file changed, 61 insertions(+), 23 deletions(-)
>
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 1ed2729..4625805 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -826,6 +826,65 @@ static PRUnichar *PRUnicharFromInt(int n) {
>
>   #endif /* !(VBOX_API_VERSION == 2002000) */
>
> +/* Begin of vboxUniformedAPI */
> +
> +#define UNUSED(expr) do { (void)(expr); } while (0)

We have ATTRIBUTE_UNUSED which can serve this purpose. Or ignore_value() 
depending on the use case.

> +
> +static void _pfnComInitialize(vboxGlobalData *data)
> +{
> +#if VBOX_XPCOMC_VERSION == 0x00010000U
> +    data->pFuncs->pfnComInitialize(&data->vboxObj, &data->vboxSession);
> +#else  /* !(VBOX_XPCOMC_VERSION == 0x00010000U) */
> +    data->pFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &data->vboxObj, ISESSION_IID_STR, &data->vboxSession);
> +#endif /* !(VBOX_XPCOMC_VERSION == 0x00010000U) */
> +}
> +
> +#if (VBOX_XPCOMC_VERSION == 0x00010000U) || (VBOX_API_VERSION == 2002000)
> +    #define FWATCH_NEED_INITICAL 0
> +#else /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> +    #define FWATCH_NEED_INITICAL 1
> +#endif /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> +
> +static int _initicalFWatch(vboxGlobalData *data)

so this would be:
static int
_initicalFWatch(vboxGlobalData *data ATTRIBUTE_UNUSED)
{ ... }

even though the @data might be used later (depending on VBOX version).

> +{
> +#if FWATCH_NEED_INITICAL == 0

What's the reason for not having:

#ifdef VBOX_XPCOMC_VERSION .. || VBOX_API_VERSION ..

#else

#endinf

I don't think I see why you need to invent this new preprocessor symbol.

> +    /* No event queue functionality in 2.2.* as of now */
> +    UNUSED(data);
> +    VIR_WARN("There is no fWatch initical in current version");
> +#else /* FWATCH_NEED_INITICAL != 0 */
> +    /* Initial the fWatch needed for Event Callbacks */
> +    data->fdWatch = -1;
> +    data->pFuncs->pfnGetEventQueue(&data->vboxQueue);
> +    if (data->vboxQueue == NULL) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("nsIEventQueue object is null"));
> +        return -1;
> +    }
> +#endif /* FWATCH_NEED_INITICAL != 0 */
> +    return 0;
> +}
> +
> +typedef struct {
> +    /* vbox API version */
> +    uint32_t uVersion;
> +    /* vbox APIs */
> +    void  (*pfnComInitialize)(vboxGlobalData *data);
> +    int (*initicalFWatch)(vboxGlobalData *data);
> +    /* vbox API features */
> +    unsigned fWatchNeedInitical : 1;

s /unsigned .. :1/bool/

And what does Initical stands for anyway?

> +} vboxUniformedAPI;
> +
> +static vboxUniformedAPI vboxAPI = {
> +    .uVersion = VBOX_API_VERSION,
> +    .pfnComInitialize = _pfnComInitialize,
> +    .initicalFWatch = _initicalFWatch,
> +    .fWatchNeedInitical = FWATCH_NEED_INITICAL,
> +};
> +
> +static vboxUniformedAPI *pVboxAPI = &vboxAPI;
> +
> +/* End of vboxUniformedAPI and Begin of common codes */
> +
>   static PRUnichar *
>   vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr)
>   {
> @@ -923,31 +982,10 @@ vboxInitialize(vboxGlobalData *data)
>       if (data->pFuncs == NULL)
>           goto cleanup;
>
> -#if VBOX_XPCOMC_VERSION == 0x00010000U
> -    data->pFuncs->pfnComInitialize(&data->vboxObj, &data->vboxSession);
> -#else  /* !(VBOX_XPCOMC_VERSION == 0x00010000U) */
> -    data->pFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &data->vboxObj,
> -                               ISESSION_IID_STR, &data->vboxSession);
> -
> -# if VBOX_API_VERSION == 2002000
> -
> -    /* No event queue functionality in 2.2.* as of now */
> -
> -# else  /* !(VBOX_API_VERSION == 2002000) */
> +    pVboxAPI->pfnComInitialize(data);
>
> -    /* Initial the fWatch needed for Event Callbacks */
> -    data->fdWatch = -1;
> -
> -    data->pFuncs->pfnGetEventQueue(&data->vboxQueue);
> -
> -    if (data->vboxQueue == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("nsIEventQueue object is null"));
> +    if (pVboxAPI->fWatchNeedInitical && pVboxAPI->initicalFWatch(data) != 0)
>           goto cleanup;
> -    }
> -
> -# endif /* !(VBOX_API_VERSION == 2002000) */
> -#endif /* !(VBOX_XPCOMC_VERSION == 0x00010000U) */
>
>       if (data->vboxObj == NULL) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>

Michal




More information about the libvir-list mailing list