[libvirt] [PATCH 3/5] implement vboxUniformedAPI in vbox_tmpl.c
Michal Privoznik
mprivozn at redhat.com
Tue Jun 24 13:28:05 UTC 2014
On 23.06.2014 06:25, Taowei wrote:
> Version specified codes for vboxUniformedAPI is implemented here,
> almost the same as PATCHv2.
> Common codes are moved to vbox_common.h and vbox_common.c.
>
> ---
> src/vbox/vbox_tmpl.c | 142 ++++++++++++++++++--------------------------------
> 1 file changed, 52 insertions(+), 90 deletions(-)
See? we can even shrink the code size. Isn't that just nice?
>
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 4ba9ad7..c2a83d1 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -87,9 +87,9 @@
> # error "Unsupport VBOX_API_VERSION"
> #endif
>
> -/* Include this *last* or we'll get the wrong vbox_CAPI_*.h. */
> +/* Include thses *last* or we'll get the wrong vbox_CAPI_*.h. */
s/thses/these/
> #include "vbox_glue.h"
> -
> +#include "vbox_common.h"
>
> #define VIR_FROM_THIS VIR_FROM_VBOX
>
> @@ -203,42 +203,6 @@ if (strUtf16) {\
> (unsigned)(iid)->m3[7]);\
> }\
>
> -typedef struct {
> - virMutex lock;
> - unsigned long version;
> -
> - virCapsPtr caps;
> - virDomainXMLOptionPtr xmlopt;
> -
> - IVirtualBox *vboxObj;
> - ISession *vboxSession;
> -
> - /** Our version specific API table pointer. */
> - PCVBOXXPCOM pFuncs;
> -
> -#if VBOX_API_VERSION == 2002000
> -
> -} vboxGlobalData;
> -
> -#else /* !(VBOX_API_VERSION == 2002000) */
> -
> - /* Async event handling */
> - virObjectEventStatePtr domainEvents;
> - int fdWatch;
> -
> -# if VBOX_API_VERSION <= 3002000
> - /* IVirtualBoxCallback is used in VirtualBox 3.x only */
> - IVirtualBoxCallback *vboxCallback;
> -# endif /* VBOX_API_VERSION <= 3002000 */
> -
> - nsIEventQueue *vboxQueue;
> - int volatile vboxCallBackRefCount;
> -
> - /* pointer back to the connection */
> - virConnectPtr conn;
> -
> -} vboxGlobalData;
> -
> /* g_pVBoxGlobalData has to be global variable,
> * there is no other way to make the callbacks
> * work other then having g_pVBoxGlobalData as
> @@ -249,6 +213,8 @@ typedef struct {
> * them that way
> */
>
> +#if VBOX_API_VERSION > 2002000
> +
> static vboxGlobalData *g_pVBoxGlobalData = NULL;
>
> #endif /* !(VBOX_API_VERSION == 2002000) */
> @@ -826,6 +792,54 @@ static PRUnichar *PRUnicharFromInt(int n) {
>
> #endif /* !(VBOX_API_VERSION == 2002000) */
>
> +/* Begin of vboxUniformedAPI */
> +
> +static int _pfnInitialize(vboxGlobalData *data)
> +{
> + data->pFuncs = g_pfnGetFunctions(VBOX_XPCOMC_VERSION);
> + if (data->pFuncs == NULL)
> + return -1;
> +#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) */
> + return 0;
> +}
> +
> +static int
> +_initializeFWatch(vboxGlobalData *data ATTRIBUTE_UNUSED)
> +{
> +#if (VBOX_XPCOMC_VERSION == 0x00010000U) || (VBOX_API_VERSION == 2002000)
> + /* No event queue functionality in 2.2.* as of now */
> + VIR_WARN("There is no fWatch initical in current version");
> +#else /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> + /* Initialize 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 /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> + return 0;
> +}
> +
> +vboxUniformedAPI NAME(UniformedAPI) = {
> + .uVersion = VBOX_API_VERSION,
> + .pfnInitialize = _pfnInitialize,
> + .initializeFWatch = _initializeFWatch,
> +#if (VBOX_XPCOMC_VERSION == 0x00010000U) || (VBOX_API_VERSION == 2002000)
> + /* No event queue functionality in 2.2.* as of now */
> + .fWatchNeedInitialize = 0,
> +#else /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> + .fWatchNeedInitialize = 1,
> +#endif /* (VBOX_XPCOMC_VERSION != 0x00010000U && VBOX_API_VERSION != 2002000) */
> +};
> +
> +/* End of vboxUniformedAPI and Begin of common codes */
> +
> static PRUnichar *
> vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr)
> {
> @@ -915,58 +929,6 @@ static virCapsPtr vboxCapsInit(void)
> return NULL;
> }
>
> -static int
> -vboxInitialize(vboxGlobalData *data)
> -{
> - data->pFuncs = g_pfnGetFunctions(VBOX_XPCOMC_VERSION);
> -
> - 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) */
> -
> - /* 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"));
> - goto cleanup;
> - }
> -
> -# endif /* !(VBOX_API_VERSION == 2002000) */
> -#endif /* !(VBOX_XPCOMC_VERSION == 0x00010000U) */
> -
> - if (data->vboxObj == NULL) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("IVirtualBox object is null"));
> - goto cleanup;
> - }
> -
> - if (data->vboxSession == NULL) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("ISession object is null"));
> - goto cleanup;
> - }
> -
> - return 0;
> -
> - cleanup:
> - return -1;
> -}
> -
> static int vboxExtractVersion(vboxGlobalData *data)
> {
> int ret = -1;
>
More information about the libvir-list
mailing list