[libvirt] [PATCH v2 2/2] vbox: get rid of g_pVBoxGlobalData

Dawid Zamirski dzamirski at datto.com
Mon Nov 7 22:00:45 UTC 2016


now that we have a new global vboxDriver object, remove the old
vboxGlobalData struct and all references to it.
---
 src/vbox/vbox_common.c        | 168 +++++++++----------
 src/vbox/vbox_common.h        |   2 +-
 src/vbox/vbox_network.c       |  24 +--
 src/vbox/vbox_storage.c       |  20 +--
 src/vbox/vbox_tmpl.c          | 375 +++++++++++++++++++++---------------------
 src/vbox/vbox_uniformed_api.h |  96 ++++-------
 6 files changed, 317 insertions(+), 368 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 78e0194..6947922 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -278,7 +278,7 @@ vboxDestroyDriverConnection(void)
     virMutexUnlock(&vbox_driver_lock);
 }
 
-static int openSessionForMachine(vboxGlobalData *data, const unsigned char *dom_uuid, vboxIIDUnion *iid,
+static int openSessionForMachine(vboxDriverPtr data, const unsigned char *dom_uuid, vboxIIDUnion *iid,
                                  IMachine **machine, bool checkflag)
 {
     VBOX_IID_INITIALIZE(iid);
@@ -539,7 +539,7 @@ static int vboxConnectClose(virConnectPtr conn)
 static int
 vboxDomainSave(virDomainPtr dom, const char *path ATTRIBUTE_UNUSED)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IConsole *console = NULL;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
@@ -591,24 +591,14 @@ vboxDomainSave(virDomainPtr dom, const char *path ATTRIBUTE_UNUSED)
     return ret;
 }
 
-static void vboxDriverLock(vboxGlobalData *data)
-{
-    virMutexLock(&data->lock);
-}
-
-static void vboxDriverUnlock(vboxGlobalData *data)
-{
-    virMutexUnlock(&data->lock);
-}
-
 static int vboxConnectGetVersion(virConnectPtr conn, unsigned long *version)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     VIR_DEBUG("%s: in vboxGetVersion", conn->driver->name);
 
-    vboxDriverLock(data);
+    virObjectLock(data);
     *version = data->version;
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     return 0;
 }
@@ -638,7 +628,7 @@ static int vboxConnectIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
 static int
 vboxConnectGetMaxVcpus(virConnectPtr conn, const char *type ATTRIBUTE_UNUSED)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     PRUint32 maxCPUCount = 0;
     int ret = -1;
 
@@ -665,22 +655,22 @@ vboxConnectGetMaxVcpus(virConnectPtr conn, const char *type ATTRIBUTE_UNUSED)
 
 static char *vboxConnectGetCapabilities(virConnectPtr conn)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     char *ret = NULL;
 
     if (!data->vboxObj)
         return ret;
 
-    vboxDriverLock(data);
+    virObjectLock(data);
     ret = virCapabilitiesFormatXML(data->caps);
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     return ret;
 }
 
 static int vboxConnectListDomains(virConnectPtr conn, int *ids, int nids)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     PRUint32 state;
     nsresult rc;
@@ -722,7 +712,7 @@ static int vboxConnectListDomains(virConnectPtr conn, int *ids, int nids)
 
 static int vboxConnectNumOfDomains(virConnectPtr conn)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     PRUint32 state;
     nsresult rc;
@@ -761,7 +751,7 @@ static int vboxConnectNumOfDomains(virConnectPtr conn)
 
 static virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     IMachine *machine;
     PRBool isAccessible = PR_FALSE;
@@ -839,7 +829,7 @@ static virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id)
 virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn,
                                     const unsigned char *uuid)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     vboxIIDUnion iid;
     char *machineNameUtf8 = NULL;
@@ -916,7 +906,7 @@ virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn,
 static virDomainPtr
 vboxDomainLookupByName(virConnectPtr conn, const char *name)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     vboxIIDUnion iid;
     char *machineNameUtf8 = NULL;
@@ -988,7 +978,7 @@ vboxDomainLookupByName(virConnectPtr conn, const char *name)
 }
 
 static void
-vboxSetBootDeviceOrder(virDomainDefPtr def, vboxGlobalData *data,
+vboxSetBootDeviceOrder(virDomainDefPtr def, vboxDriverPtr data,
                        IMachine *machine)
 {
     ISystemProperties *systemProperties = NULL;
@@ -1045,7 +1035,7 @@ vboxSetBootDeviceOrder(virDomainDefPtr def, vboxGlobalData *data,
 }
 
 static void
-vboxAttachDrivesNew(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachDrivesNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     /* AttachDrives for 3.0 and later */
     size_t i;
@@ -1254,7 +1244,7 @@ vboxAttachDrivesNew(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine
 }
 
 static void
-vboxAttachDrives(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     /* Here, About the vboxAttachDrives. In fact,there is
      * three different implementations. We name it as
@@ -1325,7 +1315,7 @@ vboxAttachSound(virDomainDefPtr def, IMachine *machine)
 }
 
 static int
-vboxAttachNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachNetwork(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     ISystemProperties *systemProperties = NULL;
     PRUint32 chipsetType = ChipsetType_Null;
@@ -1471,7 +1461,7 @@ vboxAttachNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static void
-vboxAttachSerial(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachSerial(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     ISystemProperties *systemProperties = NULL;
     PRUint32 serialPortCount = 0;
@@ -1547,7 +1537,7 @@ vboxAttachSerial(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static void
-vboxAttachParallel(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachParallel(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     ISystemProperties *systemProperties = NULL;
     PRUint32 parallelPortCount = 0;
@@ -1636,7 +1626,7 @@ vboxAttachVideo(virDomainDefPtr def, IMachine *machine)
 }
 
 static void
-vboxAttachDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachDisplay(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     int vrdpPresent = 0;
     int sdlPresent = 0;
@@ -1783,7 +1773,7 @@ vboxAttachDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static void
-vboxAttachUSB(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachUSB(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     IUSBCommon *USBCommon = NULL;
     size_t i = 0;
@@ -1887,7 +1877,7 @@ vboxAttachUSB(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static void
-vboxAttachSharedFolder(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxAttachSharedFolder(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     size_t i;
     PRUnichar *nameUtf16;
@@ -1916,7 +1906,7 @@ vboxAttachSharedFolder(virDomainDefPtr def, vboxGlobalData *data, IMachine *mach
 static virDomainPtr
 vboxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     IMachine *machine = NULL;
     IBIOSSettings *bios = NULL;
     vboxIIDUnion mchiid;
@@ -2064,7 +2054,7 @@ vboxDomainDefineXML(virConnectPtr conn, const char *xml)
 }
 
 static void
-detachDevices_common(vboxGlobalData *data, vboxIIDUnion *iidu)
+detachDevices_common(vboxDriverPtr data, vboxIIDUnion *iidu)
 {
     /* Block for checking if HDD's are attched to VM.
      * considering just IDE bus for now. Also skipped
@@ -2101,7 +2091,7 @@ detachDevices_common(vboxGlobalData *data, vboxIIDUnion *iidu)
 
 static int vboxDomainUndefineFlags(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     nsresult rc;
@@ -2144,7 +2134,7 @@ static int vboxDomainUndefine(virDomainPtr dom)
 static int
 vboxStartMachine(virDomainPtr dom, int maxDomID, IMachine *machine, vboxIIDUnion *iid)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     int vrdpPresent = 0;
     int sdlPresent = 0;
     int guiPresent = 0;
@@ -2296,7 +2286,7 @@ vboxStartMachine(virDomainPtr dom, int maxDomID, IMachine *machine, vboxIIDUnion
 
 static int vboxDomainCreateWithFlags(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     unsigned char uuid[VIR_UUID_BUFLEN] = {0};
     nsresult rc;
@@ -2401,7 +2391,7 @@ static virDomainPtr vboxDomainCreateXML(virConnectPtr conn, const char *xml,
 
 static int vboxDomainIsActive(virDomainPtr dom)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     vboxIIDUnion iid;
     char *machineNameUtf8 = NULL;
@@ -2473,7 +2463,7 @@ static int vboxDomainIsPersistent(virDomainPtr dom)
 {
     /* All domains are persistent.  However, we do want to check for
      * existence. */
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     int ret = -1;
@@ -2496,7 +2486,7 @@ static int vboxDomainIsUpdated(virDomainPtr dom)
 {
     /* VBox domains never have a persistent state that differs from
      * current state.  However, we do want to check for existence.  */
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     int ret = -1;
@@ -2517,7 +2507,7 @@ static int vboxDomainIsUpdated(virDomainPtr dom)
 
 static int vboxDomainSuspend(virDomainPtr dom)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     IConsole *console = NULL;
@@ -2568,7 +2558,7 @@ static int vboxDomainSuspend(virDomainPtr dom)
 
 static int vboxDomainResume(virDomainPtr dom)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     IConsole *console = NULL;
@@ -2619,7 +2609,7 @@ static int vboxDomainResume(virDomainPtr dom)
 
 static int vboxDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     IConsole *console = NULL;
@@ -2676,7 +2666,7 @@ static int vboxDomainShutdown(virDomainPtr dom)
 
 static int vboxDomainReboot(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     IConsole *console = NULL;
@@ -2724,7 +2714,7 @@ static int vboxDomainReboot(virDomainPtr dom, unsigned int flags)
 
 static int vboxDomainDestroyFlags(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     IConsole *console = NULL;
@@ -2790,7 +2780,7 @@ static char *vboxDomainGetOSType(virDomainPtr dom ATTRIBUTE_UNUSED) {
 
 static int vboxDomainSetMemory(virDomainPtr dom, unsigned long memory)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     PRUint32 state;
@@ -2848,7 +2838,7 @@ static int vboxDomainSetMemory(virDomainPtr dom, unsigned long memory)
 
 static int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     char *machineName = NULL;
     PRUnichar *machineNameUtf16 = NULL;
@@ -2932,7 +2922,7 @@ static int vboxDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
 static int vboxDomainGetState(virDomainPtr dom, int *state,
                               int *reason, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     PRUint32 mstate;
@@ -2963,7 +2953,7 @@ static int vboxDomainGetState(virDomainPtr dom, int *state,
 static int vboxDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
                                    unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     PRUint32 CPUCount = nvcpus;
@@ -3017,7 +3007,7 @@ static int vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
 
 static int vboxDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     ISystemProperties *systemProperties = NULL;
     PRUint32 maxCPUCount = 0;
     int ret = -1;
@@ -3054,7 +3044,7 @@ static int vboxDomainGetMaxVcpus(virDomainPtr dom)
 }
 
 static void
-vboxHostDeviceGetXMLDesc(vboxGlobalData *data, virDomainDefPtr def, IMachine *machine)
+vboxHostDeviceGetXMLDesc(vboxDriverPtr data, virDomainDefPtr def, IMachine *machine)
 {
     IUSBCommon *USBCommon = NULL;
     PRBool enabled = PR_FALSE;
@@ -3160,7 +3150,7 @@ vboxHostDeviceGetXMLDesc(vboxGlobalData *data, virDomainDefPtr def, IMachine *ma
 }
 
 static void
-vboxDumpIDEHDDsNew(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxDumpIDEHDDsNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     /* dump IDE hdds if present */
     vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER;
@@ -3321,7 +3311,7 @@ vboxDumpIDEHDDsNew(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static int
-vboxDumpVideo(virDomainDefPtr def, vboxGlobalData *data ATTRIBUTE_UNUSED,
+vboxDumpVideo(virDomainDefPtr def, vboxDriverPtr data ATTRIBUTE_UNUSED,
               IMachine *machine)
 {
     /* dump video options vram/2d/3d/directx/etc. */
@@ -3359,7 +3349,7 @@ vboxDumpVideo(virDomainDefPtr def, vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 
 static int
-vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxDumpDisplay(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     /* dump display options vrdp/gui/sdl */
     PRUnichar *keyUtf16 = NULL;
@@ -3479,7 +3469,7 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
 }
 
 static void
-vboxDumpSharedFolders(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+vboxDumpSharedFolders(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     /* shared folders */
     vboxArray sharedFolders = VBOX_ARRAY_INITIALIZER;
@@ -3540,7 +3530,7 @@ vboxDumpSharedFolders(virDomainDefPtr def, vboxGlobalData *data, IMachine *machi
 }
 
 static void
-vboxDumpNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, PRUint32 networkAdapterCount)
+vboxDumpNetwork(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine, PRUint32 networkAdapterCount)
 {
     PRUint32 netAdpIncCnt = 0;
     size_t i = 0;
@@ -3679,7 +3669,7 @@ vboxDumpNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, PR
 }
 
 static void
-vboxDumpAudio(virDomainDefPtr def, vboxGlobalData *data ATTRIBUTE_UNUSED,
+vboxDumpAudio(virDomainDefPtr def, vboxDriverPtr data ATTRIBUTE_UNUSED,
               IMachine *machine)
 {
     /* dump sound card if active */
@@ -3719,7 +3709,7 @@ vboxDumpAudio(virDomainDefPtr def, vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 
 static void
-vboxDumpSerial(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, PRUint32 serialPortCount)
+vboxDumpSerial(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine, PRUint32 serialPortCount)
 {
     PRUint32 serialPortIncCount = 0;
     size_t i = 0;
@@ -3807,7 +3797,7 @@ vboxDumpSerial(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, PRU
 }
 
 static void
-vboxDumpParallel(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, PRUint32 parallelPortCount)
+vboxDumpParallel(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine, PRUint32 parallelPortCount)
 {
     PRUint32 parallelPortIncCount = 0;
     size_t i = 0;
@@ -3882,7 +3872,7 @@ vboxDumpParallel(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine, P
 
 static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     virDomainDefPtr def = NULL;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
@@ -4050,7 +4040,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
 static int vboxConnectListDefinedDomains(virConnectPtr conn,
                                          char ** const names, int maxnames)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     char *machineName = NULL;
     PRUnichar *machineNameUtf16 = NULL;
@@ -4112,7 +4102,7 @@ static int vboxConnectListDefinedDomains(virConnectPtr conn,
 
 static int vboxConnectNumOfDefinedDomains(virConnectPtr conn)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     PRUint32 state;
     nsresult rc;
@@ -4157,7 +4147,7 @@ static int vboxDomainAttachDeviceImpl(virDomainPtr dom,
                                       const char *xml,
                                       int mediaChangeOnly ATTRIBUTE_UNUSED)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     PRUint32 state;
@@ -4288,7 +4278,7 @@ static int vboxDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
 
 static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IMachine *machine = NULL;
     vboxIIDUnion iid;
     PRUint32 state;
@@ -4401,7 +4391,7 @@ static int vboxDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
 
 static int vboxCloseDisksRecursively(virDomainPtr dom, char *location)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     nsresult rc;
     size_t i = 0;
     PRUnichar *locationUtf = NULL;
@@ -4502,7 +4492,7 @@ vboxSnapshotRedefine(virDomainPtr dom,
      *
      * Finally, we register the machine with the new virtualbox description file.
      */
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     nsresult rc;
@@ -5361,7 +5351,7 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom,
                             const char *xmlDesc,
                             unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     virDomainSnapshotDefPtr def = NULL;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
@@ -5562,7 +5552,7 @@ vboxDomainSnapshotGetAll(virDomainPtr dom,
 }
 
 static ISnapshot *
-vboxDomainSnapshotGet(vboxGlobalData *data,
+vboxDomainSnapshotGet(vboxDriverPtr data,
                       virDomainPtr dom,
                       IMachine *machine,
                       const char *name)
@@ -5615,7 +5605,7 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def,
                                          virDomainSnapshotPtr snapshot)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -5836,7 +5826,7 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr snapshot,
                                  virDomainSnapshotDefPtr def)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     ISnapshot *snap = NULL;
     IMachine *machine = NULL;
@@ -6055,7 +6045,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
                                           unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -6200,7 +6190,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
 
 static int vboxDomainSnapshotNum(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     nsresult rc;
@@ -6245,7 +6235,7 @@ static int vboxDomainSnapshotNum(virDomainPtr dom, unsigned int flags)
 static int vboxDomainSnapshotListNames(virDomainPtr dom, char **names,
                                        int nameslen, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     nsresult rc;
@@ -6326,7 +6316,7 @@ static virDomainSnapshotPtr
 vboxDomainSnapshotLookupByName(virDomainPtr dom, const char *name,
                                unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snapshot = NULL;
@@ -6355,7 +6345,7 @@ vboxDomainSnapshotLookupByName(virDomainPtr dom, const char *name,
 static int vboxDomainHasCurrentSnapshot(virDomainPtr dom,
                                         unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snapshot = NULL;
@@ -6393,7 +6383,7 @@ vboxDomainSnapshotGetParent(virDomainSnapshotPtr snapshot,
                             unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -6456,7 +6446,7 @@ vboxDomainSnapshotGetParent(virDomainSnapshotPtr snapshot,
 static virDomainSnapshotPtr
 vboxDomainSnapshotCurrent(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snapshot = NULL;
@@ -6514,7 +6504,7 @@ static int vboxDomainSnapshotIsCurrent(virDomainSnapshotPtr snapshot,
                                        unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -6575,7 +6565,7 @@ static int vboxDomainSnapshotHasMetadata(virDomainSnapshotPtr snapshot,
                                          unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -6606,7 +6596,7 @@ static int vboxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
                                       unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     ISnapshot *newSnapshot = NULL;
@@ -6676,7 +6666,7 @@ static int vboxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
 }
 
 static int
-vboxDomainSnapshotDeleteSingle(vboxGlobalData *data,
+vboxDomainSnapshotDeleteSingle(vboxDriverPtr data,
                                IConsole *console,
                                ISnapshot *snapshot)
 {
@@ -6723,7 +6713,7 @@ vboxDomainSnapshotDeleteSingle(vboxGlobalData *data,
 }
 
 static int
-vboxDomainSnapshotDeleteTree(vboxGlobalData *data,
+vboxDomainSnapshotDeleteTree(vboxDriverPtr data,
                              IConsole *console,
                              ISnapshot *snapshot)
 {
@@ -6770,7 +6760,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapshotPtr snapshot)
      */
 
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     virDomainSnapshotDefPtr def = NULL;
     char *defXml = NULL;
     vboxIIDUnion domiid;
@@ -7207,7 +7197,7 @@ static int vboxDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
                                     unsigned int flags)
 {
     virDomainPtr dom = snapshot->domain;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIIDUnion domiid;
     IMachine *machine = NULL;
     ISnapshot *snap = NULL;
@@ -7293,7 +7283,7 @@ vboxDomainScreenshot(virDomainPtr dom,
                      unsigned int screen,
                      unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IConsole *console = NULL;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
@@ -7434,7 +7424,7 @@ vboxConnectListAllDomains(virConnectPtr conn,
                           virDomainPtr **domains,
                           unsigned int flags)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     char *machineNameUtf8 = NULL;
     PRUnichar *machineNameUtf16 = NULL;
@@ -7646,7 +7636,7 @@ vboxNodeAllocPages(virConnectPtr conn ATTRIBUTE_UNUSED,
 static int
 vboxDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxArray machines = VBOX_ARRAY_INITIALIZER;
     vboxIIDUnion iid;
     char *machineNameUtf8 = NULL;
@@ -7722,7 +7712,7 @@ vboxDomainSendKey(virDomainPtr dom,
                   unsigned int flags)
 {
     int ret = -1;
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     IConsole *console = NULL;
     vboxIIDUnion iid;
     IMachine *machine = NULL;
diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h
index b178878..3be1aa4 100644
--- a/src/vbox/vbox_common.h
+++ b/src/vbox/vbox_common.h
@@ -397,7 +397,7 @@ typedef nsISupports IKeyboard;
 # define vboxIIDToUUID(iid, uuid)                gVBoxAPI.UIID.vboxIIDToUUID(data, iid, uuid)
 # define vboxIIDFromUUID(iid, uuid)              gVBoxAPI.UIID.vboxIIDFromUUID(data, iid, uuid)
 # define vboxIIDIsEqual(iid1, iid2)              gVBoxAPI.UIID.vboxIIDIsEqual(data, iid1, iid2)
-# define DEBUGIID(msg, iid)                      gVBoxAPI.UIID.DEBUGIID(msg, iid)
+# define DEBUGIID(msg, iid)                      gVBoxAPI.UIID.DEBUGIID(data, msg, iid)
 # define vboxIIDFromArrayItem(iid, array, idx) \
     gVBoxAPI.UIID.vboxIIDFromArrayItem(data, iid, array, idx)
 
diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c
index 0b944b6..0884b74 100644
--- a/src/vbox/vbox_network.c
+++ b/src/vbox/vbox_network.c
@@ -46,7 +46,7 @@ static vboxUniformedAPI gVBoxAPI;
 
 static int vboxConnectNumOfNetworks(virConnectPtr conn)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
     IHost *host = NULL;
     size_t i = 0;
@@ -91,7 +91,7 @@ static int vboxConnectNumOfNetworks(virConnectPtr conn)
 
 static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
     IHost *host = NULL;
     size_t i = 0;
@@ -148,7 +148,7 @@ static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int n
 
 static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
     IHost *host = NULL;
     size_t i = 0;
@@ -193,7 +193,7 @@ static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn)
 
 static int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
     IHost *host = NULL;
     size_t i = 0;
@@ -250,7 +250,7 @@ static int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names
 
 static virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     PRUint32 interfaceType = 0;
     char *nameUtf8 = NULL;
     PRUnichar *nameUtf16 = NULL;
@@ -302,7 +302,7 @@ static virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned
 
 static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     PRUnichar *nameUtf16 = NULL;
     IHostNetworkInterface *networkInterface = NULL;
     PRUint32 interfaceType = 0;
@@ -350,7 +350,7 @@ static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *nam
 }
 
 static PRUnichar *
-vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr)
+vboxSocketFormatAddrUtf16(vboxDriverPtr data, virSocketAddrPtr addr)
 {
     char *utf8 = NULL;
     PRUnichar *utf16 = NULL;
@@ -369,7 +369,7 @@ vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr)
 static virNetworkPtr
 vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     PRUnichar *networkInterfaceNameUtf16 = NULL;
     char *networkInterfaceNameUtf8 = NULL;
     PRUnichar *networkNameUtf16 = NULL;
@@ -563,7 +563,7 @@ static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml)
 static int
 vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface)
 {
-    vboxGlobalData *data = network->conn->privateData;
+    vboxDriverPtr data = network->conn->privateData;
     char *networkNameUtf8 = NULL;
     PRUnichar *networkInterfaceNameUtf16 = NULL;
     IHostNetworkInterface *networkInterface = NULL;
@@ -668,7 +668,7 @@ static int vboxNetworkDestroy(virNetworkPtr network)
 
 static int vboxNetworkCreate(virNetworkPtr network)
 {
-    vboxGlobalData *data = network->conn->privateData;
+    vboxDriverPtr data = network->conn->privateData;
     char *networkNameUtf8 = NULL;
     PRUnichar *networkInterfaceNameUtf16 = NULL;
     IHostNetworkInterface *networkInterface = NULL;
@@ -739,7 +739,7 @@ static int vboxNetworkCreate(virNetworkPtr network)
 }
 
 static int
-vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16,
+vboxSocketParseAddrUtf16(vboxDriverPtr data, const PRUnichar *utf16,
                          virSocketAddrPtr addr)
 {
     int result = -1;
@@ -760,7 +760,7 @@ vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16,
 
 static char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags)
 {
-    vboxGlobalData *data = network->conn->privateData;
+    vboxDriverPtr data = network->conn->privateData;
     virNetworkDefPtr def = NULL;
     virNetworkIPDefPtr ipdef = NULL;
     char *networkNameUtf8 = NULL;
diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c
index c849505..7954e9d 100644
--- a/src/vbox/vbox_storage.c
+++ b/src/vbox/vbox_storage.c
@@ -86,7 +86,7 @@ vboxStoragePoolLookupByName(virConnectPtr conn, const char *name)
 
 static int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
 {
-    vboxGlobalData *data = pool->conn->privateData;
+    vboxDriverPtr data = pool->conn->privateData;
     vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
     PRUint32 hardDiskAccessible = 0;
     nsresult rc;
@@ -127,7 +127,7 @@ static int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
 static int
 vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames)
 {
-    vboxGlobalData *data = pool->conn->privateData;
+    vboxDriverPtr data = pool->conn->privateData;
     vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
     PRUint32 numActive = 0;
     nsresult rc;
@@ -183,7 +183,7 @@ vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nname
 static virStorageVolPtr
 vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name)
 {
-    vboxGlobalData *data = pool->conn->privateData;
+    vboxDriverPtr data = pool->conn->privateData;
     vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
     nsresult rc;
     size_t i;
@@ -256,7 +256,7 @@ vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name)
 static virStorageVolPtr
 vboxStorageVolLookupByKey(virConnectPtr conn, const char *key)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     vboxIIDUnion hddIID;
     unsigned char uuid[VIR_UUID_BUFLEN];
     IHardDisk *hardDisk = NULL;
@@ -323,7 +323,7 @@ vboxStorageVolLookupByKey(virConnectPtr conn, const char *key)
 static virStorageVolPtr
 vboxStorageVolLookupByPath(virConnectPtr conn, const char *path)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     PRUnichar *hddPathUtf16 = NULL;
     IHardDisk *hardDisk = NULL;
     PRUnichar *hddNameUtf16 = NULL;
@@ -401,7 +401,7 @@ static virStorageVolPtr
 vboxStorageVolCreateXML(virStoragePoolPtr pool,
                         const char *xml, unsigned int flags)
 {
-    vboxGlobalData *data = pool->conn->privateData;
+    vboxDriverPtr data = pool->conn->privateData;
     virStorageVolDefPtr def = NULL;
     PRUnichar *hddFormatUtf16 = NULL;
     PRUnichar *hddNameUtf16 = NULL;
@@ -508,7 +508,7 @@ vboxStorageVolCreateXML(virStoragePoolPtr pool,
 
 static int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags)
 {
-    vboxGlobalData *data = vol->conn->privateData;
+    vboxDriverPtr data = vol->conn->privateData;
     unsigned char uuid[VIR_UUID_BUFLEN];
     IHardDisk *hardDisk = NULL;
     int deregister = 0;
@@ -663,7 +663,7 @@ static int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags)
 
 static int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info)
 {
-    vboxGlobalData *data = vol->conn->privateData;
+    vboxDriverPtr data = vol->conn->privateData;
     IHardDisk *hardDisk = NULL;
     unsigned char uuid[VIR_UUID_BUFLEN];
     PRUint32 hddstate;
@@ -718,7 +718,7 @@ static int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info
 
 static char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags)
 {
-    vboxGlobalData *data = vol->conn->privateData;
+    vboxDriverPtr data = vol->conn->privateData;
     IHardDisk *hardDisk = NULL;
     unsigned char uuid[VIR_UUID_BUFLEN];
     PRUnichar *hddFormatUtf16 = NULL;
@@ -810,7 +810,7 @@ static char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags)
 
 static char *vboxStorageVolGetPath(virStorageVolPtr vol)
 {
-    vboxGlobalData *data = vol->conn->privateData;
+    vboxDriverPtr data = vol->conn->privateData;
     IHardDisk *hardDisk = NULL;
     PRUnichar *hddLocationUtf16 = NULL;
     char *hddLocationUtf8 = NULL;
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 5de3ec7..998f20a 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -144,10 +144,10 @@ if (arg)\
 if (strUtf16) {\
     char *strUtf8 = NULL;\
 \
-    g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);\
+    data->pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);\
     if (strUtf8) {\
         VIR_DEBUG("%s: %s", msg, strUtf8);\
-        g_pVBoxGlobalData->pFuncs->pfnUtf8Free(strUtf8);\
+        data->pFuncs->pfnUtf8Free(strUtf8);\
     }\
 }
 
@@ -167,22 +167,6 @@ if (strUtf16) {\
           (unsigned)(iid)->m3[7]);\
 }\
 
-#if VBOX_API_VERSION > 2002000
-
-/* g_pVBoxGlobalData has to be global variable,
- * there is no other way to make the callbacks
- * work other then having g_pVBoxGlobalData as
- * global, because the functions namely AddRef,
- * Release, etc consider it as global and you
- * can't change the function definition as it
- * is XPCOM nsISupport::* function and it expects
- * them that way
- */
-
-static vboxGlobalData *g_pVBoxGlobalData;
-
-#endif /* !(VBOX_API_VERSION == 2002000) */
-
 #if VBOX_API_VERSION < 4000000
 
 # define VBOX_SESSION_OPEN(/* in */ iid_value, /* unused */ machine) \
@@ -201,23 +185,6 @@ static vboxGlobalData *g_pVBoxGlobalData;
 
 #endif /* VBOX_API_VERSION >= 4000000 */
 
-#if VBOX_API_VERSION > 2002000 && VBOX_API_VERSION < 4000000
-/* Since vboxConnectGetCapabilities has been rewritten,
- * vboxDriverLock and vboxDriverUnlock only be used in code for
- * 3.x release. */
-
-static void vboxDriverLock(vboxGlobalData *data)
-{
-    virMutexLock(&data->lock);
-}
-
-static void vboxDriverUnlock(vboxGlobalData *data)
-{
-    virMutexUnlock(&data->lock);
-}
-
-#endif
-
 #if VBOX_API_VERSION == 2002000
 
 static void nsIDtoChar(unsigned char *uuid, const nsID *iid)
@@ -309,14 +276,14 @@ typedef struct _vboxIID_v2_x_WIN32 vboxIID_v2_x_WIN32;
 #  define IID_MEMBER(name) (iidu->vboxIID_v2_x_WIN32.name)
 
 static void
-vboxIIDUnalloc_v2_x_WIN32(vboxGlobalData *data ATTRIBUTE_UNUSED,
+vboxIIDUnalloc_v2_x_WIN32(vboxDriverPtr data ATTRIBUTE_UNUSED,
                           vboxIID_v2_x_WIN32 *iid ATTRIBUTE_UNUSED)
 {
     /* Nothing to free */
 }
 
 static void
-_vboxIIDUnalloc(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vboxIIDUnalloc(vboxDriverPtr data ATTRIBUTE_UNUSED,
                 vboxIIDUnion *iid ATTRIBUTE_UNUSED)
 {
     /* Nothing to free */
@@ -329,13 +296,13 @@ vboxIIDToUUID_v2_x_WIN32(vboxIID_v2_x_WIN32 *iid, unsigned char *uuid)
 }
 
 static void
-_vboxIIDToUUID(vboxGlobalData *data ATTRIBUTE_UNUSED, vboxIIDUnion *iidu, unsigned char *uuid)
+_vboxIIDToUUID(vboxDriverPtr data ATTRIBUTE_UNUSED, vboxIIDUnion *iidu, unsigned char *uuid)
 {
     vboxIIDToUUID_v2_x_WIN32(&iidu->vboxIID_v2_x_WIN32, uuid);
 }
 
 static void
-vboxIIDFromUUID_v2_x_WIN32(vboxGlobalData *data, vboxIID_v2_x_WIN32 *iid,
+vboxIIDFromUUID_v2_x_WIN32(vboxDriverPtr data, vboxIID_v2_x_WIN32 *iid,
                            const unsigned char *uuid)
 {
     vboxIIDUnalloc_v2_x_WIN32(data, iid);
@@ -344,7 +311,7 @@ vboxIIDFromUUID_v2_x_WIN32(vboxGlobalData *data, vboxIID_v2_x_WIN32 *iid,
 }
 
 static void
-_vboxIIDFromUUID(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromUUID(vboxDriverPtr data, vboxIIDUnion *iidu,
                  const unsigned char *uuid)
 {
     vboxIIDFromUUID_v2_x_WIN32(data, &iidu->vboxIID_v2_x_WIN32, uuid);
@@ -357,13 +324,13 @@ vboxIIDIsEqual_v2_x_WIN32(vboxIID_v2_x_WIN32 *iid1, vboxIID_v2_x_WIN32 *iid2)
 }
 
 static bool
-_vboxIIDIsEqual(vboxGlobalData *data ATTRIBUTE_UNUSED, vboxIIDUnion *iidu1, vboxIIDUnion *iidu2)
+_vboxIIDIsEqual(vboxDriverPtr data ATTRIBUTE_UNUSED, vboxIIDUnion *iidu1, vboxIIDUnion *iidu2)
 {
     return vboxIIDIsEqual_v2_x_WIN32(&iidu1->vboxIID_v2_x_WIN32, &iidu2->vboxIID_v2_x_WIN32);
 }
 
 static void
-vboxIIDFromArrayItem_v2_x_WIN32(vboxGlobalData *data, vboxIID_v2_x_WIN32 *iid,
+vboxIIDFromArrayItem_v2_x_WIN32(vboxDriverPtr data, vboxIID_v2_x_WIN32 *iid,
                                 vboxArray *array, int idx)
 {
     GUID *items = (GUID *)array->items;
@@ -374,7 +341,7 @@ vboxIIDFromArrayItem_v2_x_WIN32(vboxGlobalData *data, vboxIID_v2_x_WIN32 *iid,
 }
 
 static void
-_vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromArrayItem(vboxDriverPtr data, vboxIIDUnion *iidu,
                       vboxArray *array, int idx)
 {
     vboxIIDFromArrayItem_v2_x_WIN32(data, &iidu->vboxIID_v2_x_WIN32, array, idx);
@@ -397,7 +364,7 @@ typedef struct _vboxIID_v2_x vboxIID_v2_x;
 #  define IID_MEMBER(name) (iidu->vboxIID_v2_x.name)
 
 static void
-vboxIIDUnalloc_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid)
+vboxIIDUnalloc_v2_x(vboxDriverPtr data, vboxIID_v2_x *iid)
 {
     if (iid->value == NULL)
         return;
@@ -409,7 +376,7 @@ vboxIIDUnalloc_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid)
 }
 
 static void
-_vboxIIDUnalloc(vboxGlobalData *data, vboxIIDUnion *iidu)
+_vboxIIDUnalloc(vboxDriverPtr data, vboxIIDUnion *iidu)
 {
     vboxIIDUnalloc_v2_x(data, &iidu->vboxIID_v2_x);
 }
@@ -421,14 +388,14 @@ vboxIIDToUUID_v2_x(vboxIID_v2_x *iid, unsigned char *uuid)
 }
 
 static void
-_vboxIIDToUUID(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vboxIIDToUUID(vboxDriverPtr data ATTRIBUTE_UNUSED,
                vboxIIDUnion *iidu, unsigned char *uuid)
 {
     vboxIIDToUUID_v2_x(&iidu->vboxIID_v2_x, uuid);
 }
 
 static void
-vboxIIDFromUUID_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid,
+vboxIIDFromUUID_v2_x(vboxDriverPtr data, vboxIID_v2_x *iid,
                      const unsigned char *uuid)
 {
     vboxIIDUnalloc_v2_x(data, iid);
@@ -440,7 +407,7 @@ vboxIIDFromUUID_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid,
 }
 
 static void
-_vboxIIDFromUUID(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromUUID(vboxDriverPtr data, vboxIIDUnion *iidu,
                  const unsigned char *uuid)
 {
     vboxIIDFromUUID_v2_x(data, &iidu->vboxIID_v2_x, uuid);
@@ -453,14 +420,14 @@ vboxIIDIsEqual_v2_x(vboxIID_v2_x *iid1, vboxIID_v2_x *iid2)
 }
 
 static bool
-_vboxIIDIsEqual(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vboxIIDIsEqual(vboxDriverPtr data ATTRIBUTE_UNUSED,
                 vboxIIDUnion *iidu1, vboxIIDUnion *iidu2)
 {
     return vboxIIDIsEqual_v2_x(&iidu1->vboxIID_v2_x, &iidu2->vboxIID_v2_x);
 }
 
 static void
-vboxIIDFromArrayItem_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid,
+vboxIIDFromArrayItem_v2_x(vboxDriverPtr data, vboxIID_v2_x *iid,
                           vboxArray *array, int idx)
 {
     vboxIIDUnalloc_v2_x(data, iid);
@@ -471,7 +438,7 @@ vboxIIDFromArrayItem_v2_x(vboxGlobalData *data, vboxIID_v2_x *iid,
 }
 
 static void
-_vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromArrayItem(vboxDriverPtr data, vboxIIDUnion *iidu,
                       vboxArray *array, int idx)
 {
     vboxIIDFromArrayItem_v2_x(data, &iidu->vboxIID_v2_x, array, idx);
@@ -496,7 +463,7 @@ typedef struct _vboxIID_v3_x vboxIID_v3_x;
 # define IID_MEMBER(name) (iidu->vboxIID_v3_x.name)
 
 static void
-vboxIIDUnalloc_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid)
+vboxIIDUnalloc_v3_x(vboxDriverPtr data, vboxIID_v3_x *iid)
 {
     if (iid->value != NULL && iid->owner)
         data->pFuncs->pfnUtf16Free(iid->value);
@@ -506,13 +473,13 @@ vboxIIDUnalloc_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid)
 }
 
 static void
-_vboxIIDUnalloc(vboxGlobalData *data, vboxIIDUnion *iidu)
+_vboxIIDUnalloc(vboxDriverPtr data, vboxIIDUnion *iidu)
 {
     vboxIIDUnalloc_v3_x(data, &iidu->vboxIID_v3_x);
 }
 
 static void
-vboxIIDToUUID_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
+vboxIIDToUUID_v3_x(vboxDriverPtr data, vboxIID_v3_x *iid,
                    unsigned char *uuid)
 {
     char *utf8 = NULL;
@@ -525,14 +492,14 @@ vboxIIDToUUID_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
 }
 
 static void
-_vboxIIDToUUID(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDToUUID(vboxDriverPtr data, vboxIIDUnion *iidu,
                unsigned char *uuid)
 {
     vboxIIDToUUID_v3_x(data, &iidu->vboxIID_v3_x, uuid);
 }
 
 static void
-vboxIIDFromUUID_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
+vboxIIDFromUUID_v3_x(vboxDriverPtr data, vboxIID_v3_x *iid,
                      const unsigned char *uuid)
 {
     char utf8[VIR_UUID_STRING_BUFLEN];
@@ -545,14 +512,14 @@ vboxIIDFromUUID_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
 }
 
 static void
-_vboxIIDFromUUID(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromUUID(vboxDriverPtr data, vboxIIDUnion *iidu,
                  const unsigned char *uuid)
 {
     vboxIIDFromUUID_v3_x(data, &iidu->vboxIID_v3_x, uuid);
 }
 
 static bool
-vboxIIDIsEqual_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid1,
+vboxIIDIsEqual_v3_x(vboxDriverPtr data, vboxIID_v3_x *iid1,
                     vboxIID_v3_x *iid2)
 {
     unsigned char uuid1[VIR_UUID_BUFLEN];
@@ -570,14 +537,14 @@ vboxIIDIsEqual_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid1,
 }
 
 static bool
-_vboxIIDIsEqual(vboxGlobalData *data, vboxIIDUnion *iidu1,
+_vboxIIDIsEqual(vboxDriverPtr data, vboxIIDUnion *iidu1,
                 vboxIIDUnion *iidu2)
 {
     return vboxIIDIsEqual_v3_x(data, &iidu1->vboxIID_v3_x, &iidu2->vboxIID_v3_x);
 }
 
 static void
-vboxIIDFromArrayItem_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
+vboxIIDFromArrayItem_v3_x(vboxDriverPtr data, vboxIID_v3_x *iid,
                           vboxArray *array, int idx)
 {
     vboxIIDUnalloc_v3_x(data, iid);
@@ -587,7 +554,7 @@ vboxIIDFromArrayItem_v3_x(vboxGlobalData *data, vboxIID_v3_x *iid,
 }
 
 static void
-_vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu,
+_vboxIIDFromArrayItem(vboxDriverPtr data, vboxIIDUnion *iidu,
                       vboxArray *array, int idx)
 {
     vboxIIDFromArrayItem_v3_x(data, &iidu->vboxIID_v3_x, array, idx);
@@ -730,7 +697,7 @@ static bool vboxGetMaxPortSlotValues(IVirtualBox *vbox,
 /**
  * Converts Utf-16 string to int
  */
-static int PRUnicharToInt(PRUnichar *strUtf16)
+static int PRUnicharToInt(PCVBOXXPCOM pFuncs, PRUnichar *strUtf16)
 {
     char *strUtf8 = NULL;
     int ret = 0;
@@ -738,14 +705,14 @@ static int PRUnicharToInt(PRUnichar *strUtf16)
     if (!strUtf16)
         return -1;
 
-    g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);
+    pFuncs->pfnUtf16ToUtf8(strUtf16, &strUtf8);
     if (!strUtf8)
         return -1;
 
     if (virStrToLong_i(strUtf8, NULL, 10, &ret) < 0)
         ret = -1;
 
-    g_pVBoxGlobalData->pFuncs->pfnUtf8Free(strUtf8);
+    pFuncs->pfnUtf8Free(strUtf8);
 
     return ret;
 }
@@ -753,13 +720,13 @@ static int PRUnicharToInt(PRUnichar *strUtf16)
 /**
  * Converts int to Utf-16 string
  */
-static PRUnichar *PRUnicharFromInt(int n) {
+static PRUnichar *PRUnicharFromInt(PCVBOXXPCOM pFuncs, int n) {
     PRUnichar *strUtf16 = NULL;
     char s[24];
 
     snprintf(s, sizeof(s), "%d", n);
 
-    g_pVBoxGlobalData->pFuncs->pfnUtf8ToUtf16(s, &strUtf16);
+    pFuncs->pfnUtf8ToUtf16(s, &strUtf16);
 
     return strUtf16;
 }
@@ -791,7 +758,7 @@ static virDomainState _vboxConvertState(PRUint32 state)
 #if VBOX_API_VERSION < 3001000
 
 static void
-_vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+_vboxAttachDrivesOld(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     size_t i;
     nsresult rc;
@@ -1037,7 +1004,7 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin
 #elif VBOX_API_VERSION < 4000000
 
 static void
-_vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
+_vboxAttachDrivesOld(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
 {
     size_t i;
     nsresult rc = 0;
@@ -1264,7 +1231,7 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin
 
 static void
 _vboxAttachDrivesOld(virDomainDefPtr def ATTRIBUTE_UNUSED,
-                     vboxGlobalData *data ATTRIBUTE_UNUSED,
+                     vboxDriverPtr data ATTRIBUTE_UNUSED,
                      IMachine *machine ATTRIBUTE_UNUSED)
 {
     vboxUnsupported();
@@ -1278,7 +1245,7 @@ _vboxDomainSnapshotRestore(virDomainPtr dom,
                           IMachine *machine,
                           ISnapshot *snapshot)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
     vboxIID iid = VBOX_IID_INITIALIZER;
     nsresult rc;
     int ret = -1;
@@ -1312,7 +1279,7 @@ _vboxDomainSnapshotRestore(virDomainPtr dom,
                           IMachine *machine,
                           ISnapshot *snapshot)
 {
-    vboxGlobalData *data = dom->conn->privateData;
+    vboxDriverPtr data = dom->conn->privateData;
 # if VBOX_API_VERSION < 5000000
     IConsole *console = NULL;
 # endif /*VBOX_API_VERSION < 5000000*/
@@ -1418,23 +1385,26 @@ static nsresult PR_COM_METHOD
 vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                  PRUnichar *machineId, PRUint32 state)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
     virDomainPtr dom = NULL;
+
     int event = 0;
     int detail = 0;
 
-    vboxDriverLock(g_pVBoxGlobalData);
+    virObjectLock(data);
 
-    VIR_DEBUG("IVirtualBoxCallback: %p, State: %d", pThis, state);
+    VIR_DEBUG("IVirtualBoxCallback: %p, State: %d", callback, state);
     DEBUGPRUnichar("machineId", machineId);
 
     if (machineId) {
         char *machineIdUtf8 = NULL;
         unsigned char uuid[VIR_UUID_BUFLEN];
 
-        g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
+        data->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
         ignore_value(virUUIDParse(machineIdUtf8, uuid));
 
-        dom = vboxDomainLookupByUUID(g_pVBoxGlobalData->conn, uuid);
+        dom = vboxDomainLookupByUUID(callback->conn, uuid);
         if (dom) {
             virObjectEventPtr ev;
 
@@ -1470,11 +1440,11 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
             ev = virDomainEventLifecycleNewFromDom(dom, event, detail);
 
             if (ev)
-                virObjectEventStateQueue(g_pVBoxGlobalData->domainEvents, ev);
+                virObjectEventStateQueue(data->domainEventState, ev);
         }
     }
 
-    vboxDriverUnlock(g_pVBoxGlobalData);
+    virObjectUnlock(data);
 
     return NS_OK;
 }
@@ -1483,6 +1453,9 @@ static nsresult PR_COM_METHOD
 vboxCallbackOnMachineDataChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                 PRUnichar *machineId)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
 
@@ -1496,6 +1469,9 @@ vboxCallbackOnExtraDataCanChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                  PRUnichar **error ATTRIBUTE_UNUSED,
                                  PRBool *allowChange ATTRIBUTE_UNUSED)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p, allowChange: %s", pThis, *allowChange ? "true" : "false");
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("key", key);
@@ -1509,6 +1485,9 @@ vboxCallbackOnExtraDataChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                               PRUnichar *machineId,
                               PRUnichar *key, PRUnichar *value)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("key", key);
@@ -1524,24 +1503,28 @@ vboxCallbackOnMediaRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                               PRUint32 mediaType ATTRIBUTE_UNUSED,
                               PRBool registered ATTRIBUTE_UNUSED)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p, registered: %s", pThis, registered ? "true" : "false");
     VIR_DEBUG("mediaType: %d", mediaType);
     DEBUGPRUnichar("mediaId", mediaId);
 
     return NS_OK;
 }
-# else  /* VBOX_API_VERSION >= 3001000 */
 # endif /* VBOX_API_VERSION >= 3001000 */
 
 static nsresult PR_COM_METHOD
 vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                 PRUnichar *machineId, PRBool registered)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
     virDomainPtr dom = NULL;
     int event = 0;
     int detail = 0;
 
-    vboxDriverLock(g_pVBoxGlobalData);
+    virObjectLock(data);
 
     VIR_DEBUG("IVirtualBoxCallback: %p, registered: %s", pThis, registered ? "true" : "false");
     DEBUGPRUnichar("machineId", machineId);
@@ -1550,10 +1533,10 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
         char *machineIdUtf8 = NULL;
         unsigned char uuid[VIR_UUID_BUFLEN];
 
-        g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
+        data->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
         ignore_value(virUUIDParse(machineIdUtf8, uuid));
 
-        dom = vboxDomainLookupByUUID(g_pVBoxGlobalData->conn, uuid);
+        dom = vboxDomainLookupByUUID(callback->conn, uuid);
         if (dom) {
             virObjectEventPtr ev;
 
@@ -1574,11 +1557,11 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
             ev = virDomainEventLifecycleNewFromDom(dom, event, detail);
 
             if (ev)
-                virObjectEventStateQueue(g_pVBoxGlobalData->domainEvents, ev);
+                virObjectEventStateQueue(data->domainEventState, ev);
         }
     }
 
-    vboxDriverUnlock(g_pVBoxGlobalData);
+    virObjectUnlock(data);
 
     return NS_OK;
 }
@@ -1588,6 +1571,9 @@ vboxCallbackOnSessionStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                  PRUnichar *machineId,
                                  PRUint32 state ATTRIBUTE_UNUSED)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p, state: %d", pThis, state);
     DEBUGPRUnichar("machineId", machineId);
 
@@ -1599,6 +1585,9 @@ vboxCallbackOnSnapshotTaken(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                             PRUnichar *machineId,
                             PRUnichar *snapshotId)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("snapshotId", snapshotId);
@@ -1611,6 +1600,9 @@ vboxCallbackOnSnapshotDiscarded(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                 PRUnichar *machineId,
                                 PRUnichar *snapshotId)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("snapshotId", snapshotId);
@@ -1623,6 +1615,9 @@ vboxCallbackOnSnapshotChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                              PRUnichar *machineId,
                              PRUnichar *snapshotId)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("snapshotId", snapshotId);
@@ -1635,6 +1630,9 @@ vboxCallbackOnGuestPropertyChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
                                   PRUnichar *machineId, PRUnichar *name,
                                   PRUnichar *value, PRUnichar *flags)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
+    vboxDriverPtr data = callback->conn->privateData;
+
     VIR_DEBUG("IVirtualBoxCallback: %p", pThis);
     DEBUGPRUnichar("machineId", machineId);
     DEBUGPRUnichar("name", name);
@@ -1647,9 +1645,10 @@ vboxCallbackOnGuestPropertyChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED,
 static nsresult PR_COM_METHOD
 vboxCallbackAddRef(nsISupports *pThis ATTRIBUTE_UNUSED)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
     nsresult c;
 
-    c = ++g_pVBoxGlobalData->vboxCallBackRefCount;
+    c = ++callback->vboxCallBackRefCount;
 
     VIR_DEBUG("pThis: %p, vboxCallback AddRef: %d", pThis, c);
 
@@ -1659,9 +1658,10 @@ vboxCallbackAddRef(nsISupports *pThis ATTRIBUTE_UNUSED)
 static nsresult PR_COM_METHOD
 vboxCallbackRelease(nsISupports *pThis)
 {
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
     nsresult c;
 
-    c = --g_pVBoxGlobalData->vboxCallBackRefCount;
+    c = --callback->vboxCallBackRefCount;
     if (c == 0) {
         /* delete object */
         VIR_FREE(pThis->vtbl);
@@ -1676,17 +1676,17 @@ vboxCallbackRelease(nsISupports *pThis)
 static nsresult PR_COM_METHOD
 vboxCallbackQueryInterface(nsISupports *pThis, const nsID *iid, void **resultp)
 {
-    IVirtualBoxCallback *that = (IVirtualBoxCallback *)pThis;
+    vboxCallbackPtr callback = (vboxCallbackPtr) pThis;
     static const nsID ivirtualboxCallbackUUID = IVIRTUALBOXCALLBACK_IID;
     static const nsID isupportIID = NS_ISUPPORTS_IID;
 
     /* Match UUID for IVirtualBoxCallback class */
     if (memcmp(iid, &ivirtualboxCallbackUUID, sizeof(nsID)) == 0 ||
         memcmp(iid, &isupportIID, sizeof(nsID)) == 0) {
-        g_pVBoxGlobalData->vboxCallBackRefCount++;
-        *resultp = that;
+        callback->vboxCallBackRefCount++;
+        *resultp = callback;
 
-        VIR_DEBUG("pThis: %p, vboxCallback QueryInterface: %d", pThis, g_pVBoxGlobalData->vboxCallBackRefCount);
+        VIR_DEBUG("pThis: %p, vboxCallback QueryInterface: %d", pThis, callback->vboxCallBackRefCount);
 
         return NS_OK;
     }
@@ -1699,60 +1699,64 @@ vboxCallbackQueryInterface(nsISupports *pThis, const nsID *iid, void **resultp)
 }
 
 
-static IVirtualBoxCallback *vboxAllocCallbackObj(void) {
-    IVirtualBoxCallback *vboxCallback = NULL;
+static vboxCallbackPtr
+vboxAllocCallbackObj(virConnectPtr conn)
+{
+    vboxCallbackPtr callback = NULL;
 
     /* Allocate, Initialize and return a valid
      * IVirtualBoxCallback object here
      */
-    if ((VIR_ALLOC(vboxCallback) < 0) || (VIR_ALLOC(vboxCallback->vtbl) < 0)) {
-        VIR_FREE(vboxCallback);
+    if ((VIR_ALLOC(callback) < 0) || (VIR_ALLOC(callback->vtbl) < 0)) {
+        VIR_FREE(callback);
         return NULL;
     }
 
     {
-        vboxCallback->vtbl->nsisupports.AddRef          = &vboxCallbackAddRef;
-        vboxCallback->vtbl->nsisupports.Release         = &vboxCallbackRelease;
-        vboxCallback->vtbl->nsisupports.QueryInterface  = &vboxCallbackQueryInterface;
-        vboxCallback->vtbl->OnMachineStateChange        = &vboxCallbackOnMachineStateChange;
-        vboxCallback->vtbl->OnMachineDataChange         = &vboxCallbackOnMachineDataChange;
-        vboxCallback->vtbl->OnExtraDataCanChange        = &vboxCallbackOnExtraDataCanChange;
-        vboxCallback->vtbl->OnExtraDataChange           = &vboxCallbackOnExtraDataChange;
+        callback->vtbl->nsisupports.AddRef          = &vboxCallbackAddRef;
+        callback->vtbl->nsisupports.Release         = &vboxCallbackRelease;
+        callback->vtbl->nsisupports.QueryInterface  = &vboxCallbackQueryInterface;
+        callback->vtbl->OnMachineStateChange        = &vboxCallbackOnMachineStateChange;
+        callback->vtbl->OnMachineDataChange         = &vboxCallbackOnMachineDataChange;
+        callback->vtbl->OnExtraDataCanChange        = &vboxCallbackOnExtraDataCanChange;
+        callback->vtbl->OnExtraDataChange           = &vboxCallbackOnExtraDataChange;
 # if VBOX_API_VERSION < 3001000
-        vboxCallback->vtbl->OnMediaRegistered           = &vboxCallbackOnMediaRegistered;
+        callback->vtbl->OnMediaRegistered           = &vboxCallbackOnMediaRegistered;
 # else  /* VBOX_API_VERSION >= 3001000 */
 # endif /* VBOX_API_VERSION >= 3001000 */
-        vboxCallback->vtbl->OnMachineRegistered         = &vboxCallbackOnMachineRegistered;
-        vboxCallback->vtbl->OnSessionStateChange        = &vboxCallbackOnSessionStateChange;
-        vboxCallback->vtbl->OnSnapshotTaken             = &vboxCallbackOnSnapshotTaken;
+        callback->vtbl->OnMachineRegistered         = &vboxCallbackOnMachineRegistered;
+        callback->vtbl->OnSessionStateChange        = &vboxCallbackOnSessionStateChange;
+        callback->vtbl->OnSnapshotTaken             = &vboxCallbackOnSnapshotTaken;
 # if VBOX_API_VERSION < 3002000
-        vboxCallback->vtbl->OnSnapshotDiscarded         = &vboxCallbackOnSnapshotDiscarded;
+        callback->vtbl->OnSnapshotDiscarded         = &vboxCallbackOnSnapshotDiscarded;
 # else /* VBOX_API_VERSION >= 3002000 */
-        vboxCallback->vtbl->OnSnapshotDeleted           = &vboxCallbackOnSnapshotDiscarded;
+        callback->vtbl->OnSnapshotDeleted           = &vboxCallbackOnSnapshotDiscarded;
 # endif /* VBOX_API_VERSION >= 3002000 */
-        vboxCallback->vtbl->OnSnapshotChange            = &vboxCallbackOnSnapshotChange;
-        vboxCallback->vtbl->OnGuestPropertyChange       = &vboxCallbackOnGuestPropertyChange;
-        g_pVBoxGlobalData->vboxCallBackRefCount = 1;
-
+        callback->vtbl->OnSnapshotChange            = &vboxCallbackOnSnapshotChange;
+        callback->vtbl->OnGuestPropertyChange       = &vboxCallbackOnGuestPropertyChange;
+        callback->vboxCallBackRefCount = 1;
     }
 
-    return vboxCallback;
+    callback->conn = conn;
+
+    return callback;
 }
 
 static void vboxReadCallback(int watch ATTRIBUTE_UNUSED,
                              int fd,
                              int events ATTRIBUTE_UNUSED,
-                             void *opaque ATTRIBUTE_UNUSED)
+                             void *opaque)
 {
+    vboxDriverPtr data = (vboxDriverPtr) opaque;
     if (fd >= 0) {
-        g_pVBoxGlobalData->vboxQueue->vtbl->ProcessPendingEvents(g_pVBoxGlobalData->vboxQueue);
+        data->vboxQueue->vtbl->ProcessPendingEvents(data->vboxQueue);
     } else {
         nsresult rc;
         PLEvent *pEvent = NULL;
 
-        rc = g_pVBoxGlobalData->vboxQueue->vtbl->WaitForEvent(g_pVBoxGlobalData->vboxQueue, &pEvent);
+        rc = data->vboxQueue->vtbl->WaitForEvent(data->vboxQueue, &pEvent);
         if (NS_SUCCEEDED(rc))
-            g_pVBoxGlobalData->vboxQueue->vtbl->HandleEvent(g_pVBoxGlobalData->vboxQueue, pEvent);
+            data->vboxQueue->vtbl->HandleEvent(data->vboxQueue, pEvent);
     }
 }
 
@@ -1762,7 +1766,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
                                void *opaque,
                                virFreeCallback freecb)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     int vboxRet = -1;
     nsresult rc;
     int ret = -1;
@@ -1773,12 +1777,13 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
     /* Locking has to be there as callbacks are not
      * really fully thread safe
      */
-    vboxDriverLock(data);
+    virObjectLock(data);
 
     if (data->vboxCallback == NULL) {
-        data->vboxCallback = vboxAllocCallbackObj();
+        data->vboxCallback = vboxAllocCallbackObj(conn);
         if (data->vboxCallback != NULL) {
-            rc = data->vboxObj->vtbl->RegisterCallback(data->vboxObj, data->vboxCallback);
+            rc = data->vboxObj->vtbl->RegisterCallback(data->vboxObj,
+                                                         (IVirtualBoxCallback *) data->vboxCallback);
             if (NS_SUCCEEDED(rc))
                 vboxRet = 0;
         }
@@ -1794,7 +1799,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
             PRInt32 vboxFileHandle;
             vboxFileHandle = data->vboxQueue->vtbl->GetEventQueueSelectFD(data->vboxQueue);
 
-            data->fdWatch = virEventAddHandle(vboxFileHandle, VIR_EVENT_HANDLE_READABLE, vboxReadCallback, NULL, NULL);
+            data->fdWatch = virEventAddHandle(vboxFileHandle, VIR_EVENT_HANDLE_READABLE, vboxReadCallback, data, NULL);
         }
 
         if (data->fdWatch >= 0) {
@@ -1803,7 +1808,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
              * later you can iterate over them
              */
 
-            ret = virDomainEventStateRegister(conn, data->domainEvents,
+            ret = virDomainEventStateRegister(conn, data->domainEventState,
                                               callback, opaque, freecb);
             VIR_DEBUG("virObjectEventStateRegister (ret = %d) (conn: %p, "
                       "callback: %p, opaque: %p, "
@@ -1812,13 +1817,14 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
         }
     }
 
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     if (ret >= 0) {
         return 0;
     } else {
         if (data->vboxObj && data->vboxCallback)
-            data->vboxObj->vtbl->UnregisterCallback(data->vboxObj, data->vboxCallback);
+            data->vboxObj->vtbl->UnregisterCallback(data->vboxObj,
+                                                      (IVirtualBoxCallback *) data->vboxCallback);
         return -1;
     }
 }
@@ -1827,7 +1833,7 @@ static int
 vboxConnectDomainEventDeregister(virConnectPtr conn,
                                  virConnectDomainEventCallback callback)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     int cnt;
     int ret = -1;
 
@@ -1837,13 +1843,14 @@ vboxConnectDomainEventDeregister(virConnectPtr conn,
     /* Locking has to be there as callbacks are not
      * really fully thread safe
      */
-    vboxDriverLock(data);
+    virObjectLock(data);
 
-    cnt = virDomainEventStateDeregister(conn, data->domainEvents,
+    cnt = virDomainEventStateDeregister(conn, data->domainEventState,
                                         callback);
 
     if (data->vboxCallback && cnt == 0) {
-        data->vboxObj->vtbl->UnregisterCallback(data->vboxObj, data->vboxCallback);
+        data->vboxObj->vtbl->UnregisterCallback(data->vboxObj,
+                                                  (IVirtualBoxCallback *) data->vboxCallback);
         VBOX_RELEASE(data->vboxCallback);
 
         /* Remove the Event file handle on which we are listening as well */
@@ -1851,7 +1858,7 @@ vboxConnectDomainEventDeregister(virConnectPtr conn,
         data->fdWatch = -1;
     }
 
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     if (cnt >= 0)
         ret = 0;
@@ -1866,7 +1873,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
                                              void *opaque,
                                              virFreeCallback freecb)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     int vboxRet = -1;
     nsresult rc;
     int ret = -1;
@@ -1877,12 +1884,13 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
     /* Locking has to be there as callbacks are not
      * really fully thread safe
      */
-    vboxDriverLock(data);
+    virObjectLock(data);
 
     if (data->vboxCallback == NULL) {
-        data->vboxCallback = vboxAllocCallbackObj();
+        data->vboxCallback = vboxAllocCallbackObj(conn);
         if (data->vboxCallback != NULL) {
-            rc = data->vboxObj->vtbl->RegisterCallback(data->vboxObj, data->vboxCallback);
+            rc = data->vboxObj->vtbl->RegisterCallback(data->vboxObj,
+                                                         (IVirtualBoxCallback *) data->vboxCallback);
             if (NS_SUCCEEDED(rc))
                 vboxRet = 0;
         }
@@ -1898,7 +1906,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
             PRInt32 vboxFileHandle;
             vboxFileHandle = data->vboxQueue->vtbl->GetEventQueueSelectFD(data->vboxQueue);
 
-            data->fdWatch = virEventAddHandle(vboxFileHandle, VIR_EVENT_HANDLE_READABLE, vboxReadCallback, NULL, NULL);
+            data->fdWatch = virEventAddHandle(vboxFileHandle, VIR_EVENT_HANDLE_READABLE, vboxReadCallback, data, NULL);
         }
 
         if (data->fdWatch >= 0) {
@@ -1907,7 +1915,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
              * later you can iterate over them
              */
 
-            if (virDomainEventStateRegisterID(conn, data->domainEvents,
+            if (virDomainEventStateRegisterID(conn, data->domainEventState,
                                               dom, eventID,
                                               callback, opaque, freecb, &ret) < 0)
                 ret = -1;
@@ -1918,13 +1926,14 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
         }
     }
 
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     if (ret >= 0) {
         return ret;
     } else {
         if (data->vboxObj && data->vboxCallback)
-            data->vboxObj->vtbl->UnregisterCallback(data->vboxObj, data->vboxCallback);
+            data->vboxObj->vtbl->UnregisterCallback(data->vboxObj,
+                                                      (IVirtualBoxCallback *) data->vboxCallback);
         return -1;
     }
 }
@@ -1933,7 +1942,7 @@ static int
 vboxConnectDomainEventDeregisterAny(virConnectPtr conn,
                                     int callbackID)
 {
-    vboxGlobalData *data = conn->privateData;
+    vboxDriverPtr data = conn->privateData;
     int cnt;
     int ret = -1;
 
@@ -1943,13 +1952,14 @@ vboxConnectDomainEventDeregisterAny(virConnectPtr conn,
     /* Locking has to be there as callbacks are not
      * really fully thread safe
      */
-    vboxDriverLock(data);
+    virObjectLock(data);
 
-    cnt = virObjectEventStateDeregisterID(conn, data->domainEvents,
+    cnt = virObjectEventStateDeregisterID(conn, data->domainEventState,
                                           callbackID);
 
     if (data->vboxCallback && cnt == 0) {
-        data->vboxObj->vtbl->UnregisterCallback(data->vboxObj, data->vboxCallback);
+        data->vboxObj->vtbl->UnregisterCallback(data->vboxObj,
+                                                  (IVirtualBoxCallback *) data->vboxCallback);
         VBOX_RELEASE(data->vboxCallback);
 
         /* Remove the Event file handle on which we are listening as well */
@@ -1957,7 +1967,7 @@ vboxConnectDomainEventDeregisterAny(virConnectPtr conn,
         data->fdWatch = -1;
     }
 
-    vboxDriverUnlock(data);
+    virObjectUnlock(data);
 
     if (cnt >= 0)
         ret = 0;
@@ -1995,21 +2005,11 @@ _initializeDomainEvent(vboxDriverPtr data ATTRIBUTE_UNUSED)
     return 0;
 }
 
-static
-void _registerGlobalData(vboxGlobalData *data ATTRIBUTE_UNUSED)
-{
-#if VBOX_API_VERSION == 2002000
-    vboxUnsupported();
-#else /* VBOX_API_VERSION != 2002000 */
-    g_pVBoxGlobalData = data;
-#endif /* VBOX_API_VERSION != 2002000 */
-}
-
 #if VBOX_API_VERSION < 4000000
 
 # if VBOX_API_VERSION < 3001000
 static void
-_detachDevices(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_detachDevices(vboxDriverPtr data ATTRIBUTE_UNUSED,
                IMachine *machine, PRUnichar *hddcnameUtf16)
 {
     /* Disconnect all the drives if present */
@@ -2019,7 +2019,7 @@ _detachDevices(vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 # else  /* VBOX_API_VERSION >= 3001000 */
 static void
-_detachDevices(vboxGlobalData *data, IMachine *machine,
+_detachDevices(vboxDriverPtr data, IMachine *machine,
                PRUnichar *hddcnameUtf16 ATTRIBUTE_UNUSED)
 {
     /* get all the controller first, then the attachments and
@@ -2071,7 +2071,7 @@ _detachDevices(vboxGlobalData *data, IMachine *machine,
 # endif /* VBOX_API_VERSION >= 3001000 */
 
 static nsresult
-_unregisterMachine(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine **machine)
+_unregisterMachine(vboxDriverPtr data, vboxIIDUnion *iidu, IMachine **machine)
 {
     return data->vboxObj->vtbl->UnregisterMachine(data->vboxObj, IID_MEMBER(value), machine);
 }
@@ -2085,7 +2085,7 @@ _deleteConfig(IMachine *machine)
 #else /* VBOX_API_VERSION >= 4000000 */
 
 static void
-_detachDevices(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_detachDevices(vboxDriverPtr data ATTRIBUTE_UNUSED,
                IMachine *machine ATTRIBUTE_UNUSED,
                PRUnichar *hddcnameUtf16 ATTRIBUTE_UNUSED)
 {
@@ -2093,7 +2093,7 @@ _detachDevices(vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 
 static nsresult
-_unregisterMachine(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine **machine)
+_unregisterMachine(vboxDriverPtr data, vboxIIDUnion *iidu, IMachine **machine)
 {
     nsresult rc;
     vboxArray media = VBOX_ARRAY_INITIALIZER;
@@ -2157,7 +2157,7 @@ _deleteConfig(IMachine *machine)
 
 static void
 _dumpIDEHDDsOld(virDomainDefPtr def,
-                vboxGlobalData *data,
+                vboxDriverPtr data,
                 IMachine *machine)
 {
     PRInt32 hddNum = 0;
@@ -2266,7 +2266,7 @@ _dumpIDEHDDsOld(virDomainDefPtr def,
 
 static void
 _dumpDVD(virDomainDefPtr def,
-         vboxGlobalData *data,
+         vboxDriverPtr data,
          IMachine *machine)
 {
     IDVDDrive *dvdDrive = NULL;
@@ -2321,7 +2321,7 @@ _dumpDVD(virDomainDefPtr def,
 }
 
 static int
-_attachDVD(vboxGlobalData *data, IMachine *machine, const char *src)
+_attachDVD(vboxDriverPtr data, IMachine *machine, const char *src)
 {
     IDVDDrive *dvdDrive = NULL;
     IDVDImage *dvdImage = NULL;
@@ -2405,7 +2405,7 @@ _detachDVD(IMachine *machine)
 
 static void
 _dumpFloppy(virDomainDefPtr def,
-            vboxGlobalData *data,
+            vboxDriverPtr data,
             IMachine *machine)
 {
     IFloppyDrive *floppyDrive = NULL;
@@ -2463,7 +2463,7 @@ _dumpFloppy(virDomainDefPtr def,
 }
 
 static int
-_attachFloppy(vboxGlobalData *data, IMachine *machine, const char *src)
+_attachFloppy(vboxDriverPtr data, IMachine *machine, const char *src)
 {
     IFloppyDrive *floppyDrive;
     IFloppyImage *floppyImage = NULL;
@@ -2560,7 +2560,7 @@ _detachFloppy(IMachine *machine)
 
 static void
 _dumpIDEHDDsOld(virDomainDefPtr def ATTRIBUTE_UNUSED,
-                vboxGlobalData *data ATTRIBUTE_UNUSED,
+                vboxDriverPtr data ATTRIBUTE_UNUSED,
                 IMachine *machine ATTRIBUTE_UNUSED)
 {
     vboxUnsupported();
@@ -2568,14 +2568,14 @@ _dumpIDEHDDsOld(virDomainDefPtr def ATTRIBUTE_UNUSED,
 
 static void
 _dumpDVD(virDomainDefPtr def ATTRIBUTE_UNUSED,
-         vboxGlobalData *data ATTRIBUTE_UNUSED,
+         vboxDriverPtr data ATTRIBUTE_UNUSED,
          IMachine *machine ATTRIBUTE_UNUSED)
 {
     vboxUnsupported();
 }
 
 static int
-_attachDVD(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_attachDVD(vboxDriverPtr data ATTRIBUTE_UNUSED,
            IMachine *machine ATTRIBUTE_UNUSED,
            const char *src ATTRIBUTE_UNUSED)
 {
@@ -2592,14 +2592,14 @@ _detachDVD(IMachine *machine ATTRIBUTE_UNUSED)
 
 static void
 _dumpFloppy(virDomainDefPtr def ATTRIBUTE_UNUSED,
-            vboxGlobalData *data ATTRIBUTE_UNUSED,
+            vboxDriverPtr data ATTRIBUTE_UNUSED,
             IMachine *machine ATTRIBUTE_UNUSED)
 {
     vboxUnsupported();
 }
 
 static int
-_attachFloppy(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_attachFloppy(vboxDriverPtr data ATTRIBUTE_UNUSED,
               IMachine *machine ATTRIBUTE_UNUSED,
               const char *src ATTRIBUTE_UNUSED)
 {
@@ -2694,7 +2694,7 @@ static void _vboxIIDInitialize(vboxIIDUnion *iidu)
     memset(iidu, 0, sizeof(vboxIIDUnion));
 }
 
-static void _DEBUGIID(const char *msg, vboxIIDUnion *iidu)
+static void _DEBUGIID(vboxDriverPtr driver ATTRIBUTE_UNUSED, const char *msg, vboxIIDUnion *iidu)
 {
 # ifdef WIN32
     DEBUGUUID(msg, (nsID *)&IID_MEMBER(value));
@@ -2711,7 +2711,7 @@ static void _vboxIIDInitialize(vboxIIDUnion *iidu)
     IID_MEMBER(owner) = true;
 }
 
-static void _DEBUGIID(const char *msg, vboxIIDUnion *iidu)
+static void _DEBUGIID(vboxDriverPtr data, const char *msg, vboxIIDUnion *iidu)
 {
     DEBUGPRUnichar(msg, IID_MEMBER(value));
 }
@@ -2719,7 +2719,7 @@ static void _DEBUGIID(const char *msg, vboxIIDUnion *iidu)
 #endif /* VBOX_API_VERSION != 2002000 */
 
 static void
-_vboxIIDToUtf8(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vboxIIDToUtf8(vboxDriverPtr data ATTRIBUTE_UNUSED,
                vboxIIDUnion *iidu ATTRIBUTE_UNUSED,
                char **utf8 ATTRIBUTE_UNUSED)
 {
@@ -2848,7 +2848,7 @@ _virtualboxGetHost(IVirtualBox *vboxObj, IHost **host)
 }
 
 static nsresult
-_virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED)
+_virtualboxCreateMachine(vboxDriverPtr data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED)
 {
     vboxIID iid = VBOX_IID_INITIALIZER;
     PRUnichar *machineNameUtf16 = NULL;
@@ -3058,7 +3058,7 @@ _machineRemoveSharedFolder(IMachine *machine, PRUnichar *name)
 }
 
 static nsresult
-_machineLaunchVMProcess(vboxGlobalData *data,
+_machineLaunchVMProcess(vboxDriverPtr data,
                         IMachine *machine ATTRIBUTE_UNUSED,
                         vboxIIDUnion *iidu ATTRIBUTE_UNUSED,
                         PRUnichar *sessionType, PRUnichar *env,
@@ -3356,13 +3356,13 @@ _machineSaveSettings(IMachine *machine)
 #if VBOX_API_VERSION < 4000000
 
 static nsresult
-_sessionOpen(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine *machine ATTRIBUTE_UNUSED)
+_sessionOpen(vboxDriverPtr data, vboxIIDUnion *iidu, IMachine *machine ATTRIBUTE_UNUSED)
 {
     return data->vboxObj->vtbl->OpenSession(data->vboxObj, data->vboxSession, IID_MEMBER(value));
 }
 
 static nsresult
-_sessionOpenExisting(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine *machine ATTRIBUTE_UNUSED)
+_sessionOpenExisting(vboxDriverPtr data, vboxIIDUnion *iidu, IMachine *machine ATTRIBUTE_UNUSED)
 {
     return data->vboxObj->vtbl->OpenExistingSession(data->vboxObj, data->vboxSession, IID_MEMBER(value));
 }
@@ -3376,13 +3376,13 @@ _sessionClose(ISession *session)
 #else /* VBOX_API_VERSION >= 4000000 */
 
 static nsresult
-_sessionOpen(vboxGlobalData *data, vboxIIDUnion *iidu ATTRIBUTE_UNUSED, IMachine *machine)
+_sessionOpen(vboxDriverPtr data, vboxIIDUnion *iidu ATTRIBUTE_UNUSED, IMachine *machine)
 {
     return machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Write);
 }
 
 static nsresult
-_sessionOpenExisting(vboxGlobalData *data, vboxIIDUnion *iidu ATTRIBUTE_UNUSED, IMachine *machine)
+_sessionOpenExisting(vboxDriverPtr data, vboxIIDUnion *iidu ATTRIBUTE_UNUSED, IMachine *machine)
 {
     return machine->vtbl->LockMachine(machine, data->vboxSession, LockType_Shared);
 }
@@ -3957,7 +3957,7 @@ _vrdxServerSetEnabled(IVRDxServer *VRDxServer, PRBool enabled)
 }
 
 static nsresult
-_vrdxServerGetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vrdxServerGetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                     IVRDxServer *VRDxServer, virDomainGraphicsDefPtr graphics)
 {
     nsresult rc;
@@ -3974,7 +3974,7 @@ _vrdxServerGetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
     rc = VRDxServer->vtbl->GetPorts(VRDxServer, &VRDPport);
     if (VRDPport) {
         /* even if vbox supports mutilpe ports, single port for now here */
-        graphics->data.rdp.port = PRUnicharToInt(VRDPport);
+        graphics->data.rdp.port = PRUnicharToInt(data->pFuncs, VRDPport);
         VBOX_UTF16_FREE(VRDPport);
     } else {
         graphics->data.rdp.autoport = true;
@@ -3987,7 +3987,7 @@ _vrdxServerGetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
     VBOX_UTF16_FREE(VRDEPortsKey);
     if (VRDEPortsValue) {
         /* even if vbox supports mutilpe ports, single port for now here */
-        graphics->data.rdp.port = PRUnicharToInt(VRDEPortsValue);
+        graphics->data.rdp.port = PRUnicharToInt(data->pFuncs, VRDEPortsValue);
         VBOX_UTF16_FREE(VRDEPortsValue);
     } else {
         graphics->data.rdp.autoport = true;
@@ -3997,7 +3997,7 @@ _vrdxServerGetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 
 static nsresult
-_vrdxServerSetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vrdxServerSetPorts(vboxDriverPtr data ATTRIBUTE_UNUSED,
                     IVRDxServer *VRDxServer, virDomainGraphicsDefPtr graphics)
 {
     nsresult rc = 0;
@@ -4016,14 +4016,14 @@ _vrdxServerSetPorts(vboxGlobalData *data ATTRIBUTE_UNUSED,
     }
 #elif VBOX_API_VERSION < 4000000 /* 3001000 <= VBOX_API_VERSION < 4000000 */
     PRUnichar *portUtf16 = NULL;
-    portUtf16 = PRUnicharFromInt(graphics->data.rdp.port);
+    portUtf16 = PRUnicharFromInt(data->pFuncs, graphics->data.rdp.port);
     rc = VRDxServer->vtbl->SetPorts(VRDxServer, portUtf16);
     VBOX_UTF16_FREE(portUtf16);
 #else /* VBOX_API_VERSION >= 4000000 */
     PRUnichar *VRDEPortsKey = NULL;
     PRUnichar *VRDEPortsValue = NULL;
     VBOX_UTF8_TO_UTF16("TCP/Ports", &VRDEPortsKey);
-    VRDEPortsValue = PRUnicharFromInt(graphics->data.rdp.port);
+    VRDEPortsValue = PRUnicharFromInt(data->pFuncs, graphics->data.rdp.port);
     rc = VRDxServer->vtbl->SetVRDEProperty(VRDxServer, VRDEPortsKey,
                                            VRDEPortsValue);
     VBOX_UTF16_FREE(VRDEPortsKey);
@@ -4057,7 +4057,7 @@ _vrdxServerSetAllowMultiConnection(IVRDxServer *VRDxServer, PRBool enabled)
 }
 
 static nsresult
-_vrdxServerGetNetAddress(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vrdxServerGetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                          IVRDxServer *VRDxServer, PRUnichar **netAddress)
 {
 #if VBOX_API_VERSION >= 4000000
@@ -4073,7 +4073,7 @@ _vrdxServerGetNetAddress(vboxGlobalData *data ATTRIBUTE_UNUSED,
 }
 
 static nsresult
-_vrdxServerSetNetAddress(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_vrdxServerSetNetAddress(vboxDriverPtr data ATTRIBUTE_UNUSED,
                          IVRDxServer *VRDxServer, PRUnichar *netAddress)
 {
 #if VBOX_API_VERSION < 4000000
@@ -4483,7 +4483,7 @@ _hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name,
 }
 
 static nsresult
-_hostCreateHostOnlyNetworkInterface(vboxGlobalData *data ATTRIBUTE_UNUSED,
+_hostCreateHostOnlyNetworkInterface(vboxDriverPtr data ATTRIBUTE_UNUSED,
                                     IHost *host, char *name ATTRIBUTE_UNUSED,
                                     IHostNetworkInterface **networkInterface)
 {
@@ -5087,7 +5087,6 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
     pVBoxAPI->APIVersion = VBOX_API_VERSION;
     pVBoxAPI->XPCOMCVersion = VBOX_XPCOMC_VERSION;
     pVBoxAPI->initializeDomainEvent = _initializeDomainEvent;
-    pVBoxAPI->registerGlobalData = _registerGlobalData;
     pVBoxAPI->detachDevices = _detachDevices;
     pVBoxAPI->unregisterMachine = _unregisterMachine;
     pVBoxAPI->deleteConfig = _deleteConfig;
@@ -5139,12 +5138,6 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
     pVBoxAPI->domainEventCallbacks = 1;
 #endif /* VBOX_API_VERSION > 2002000 || VBOX_API_VERSION < 4000000 */
 
-#if VBOX_API_VERSION == 2002000
-    pVBoxAPI->hasStaticGlobalData = 0;
-#else /* VBOX_API_VERSION > 2002000 */
-    pVBoxAPI->hasStaticGlobalData = 1;
-#endif /* VBOX_API_VERSION > 2002000 */
-
 #if VBOX_API_VERSION >= 4000000
     /* Get machine for the call to VBOX_SESSION_OPEN_EXISTING */
     pVBoxAPI->getMachineForSession = 1;
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 704c377..dae2cf1 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -96,45 +96,14 @@ typedef union {
     PRInt32 resultCode;
 } resultCodeUnion;
 
-typedef struct {
-    virMutex lock;
-    unsigned long version;
-
-    virCapsPtr caps;
-    virDomainXMLOptionPtr xmlopt;
-
-    IVirtualBox *vboxObj;
-    ISession *vboxSession;
-
-    /** Our version specific API table pointer. */
-    PCVBOXXPCOM pFuncs;
-
-    /* The next is used for domainEvent */
-# if defined(VBOX_API_VERSION) && VBOX_API_VERSION > 2002000 && VBOX_API_VERSION < 4000000
-
-    /* Async event handling */
-    virObjectEventStatePtr domainEvents;
-    int fdWatch;
-    IVirtualBoxCallback *vboxCallback;
-    nsIEventQueue *vboxQueue;
-
-    int volatile vboxCallBackRefCount;
-
-    /* pointer back to the connection */
+struct _vboxCallback {
+    struct IVirtualBoxCallback_vtbl *vtbl;
     virConnectPtr conn;
+    int vboxCallBackRefCount;
+};
 
-# else /* VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000 || VBOX_API_VERSION undefined */
-
-    virObjectEventStatePtr domainEvents;
-    int fdWatch;
-    void *vboxCallback;
-    void *vboxQueue;
-    int volatile vboxCallBackRefCount;
-    virConnectPtr conn;
-
-# endif /* VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000 || VBOX_API_VERSION undefined */
-
-} vboxGlobalData;
+typedef struct _vboxCallback vboxCallback;
+typedef struct _vboxCallback *vboxCallbackPtr;
 
 struct _vboxDriver {
     virObjectLockable parent;
@@ -152,11 +121,10 @@ struct _vboxDriver {
 # endif
 
     int fdWatch;
+    vboxCallbackPtr vboxCallback;
 # if VBOX_API_VERSION > 2002000 && VBOX_API_VERSION < 4000000
-    IVirtualBoxCallback *vboxCallback;
     nsIEventQueue *vboxQueue;
 # else
-    void *vboxCallback;
     void *vboxQueue;
 # endif
     unsigned long version;
@@ -186,13 +154,13 @@ typedef struct {
 /* Functions for vboxIID */
 typedef struct {
     void (*vboxIIDInitialize)(vboxIIDUnion *iidu);
-    void (*vboxIIDUnalloc)(vboxGlobalData *data, vboxIIDUnion *iidu);
-    void (*vboxIIDToUUID)(vboxGlobalData *data, vboxIIDUnion *iidu, unsigned char *uuid);
-    void (*vboxIIDFromUUID)(vboxGlobalData *data, vboxIIDUnion *iidu, const unsigned char *uuid);
-    bool (*vboxIIDIsEqual)(vboxGlobalData *data, vboxIIDUnion *iidu1, vboxIIDUnion *iidu2);
-    void (*vboxIIDFromArrayItem)(vboxGlobalData *data, vboxIIDUnion *iidu, vboxArray *array, int idx);
-    void (*vboxIIDToUtf8)(vboxGlobalData *data, vboxIIDUnion *iidu, char **utf8);
-    void (*DEBUGIID)(const char *msg, vboxIIDUnion *iidu);
+    void (*vboxIIDUnalloc)(vboxDriverPtr driver, vboxIIDUnion *iidu);
+    void (*vboxIIDToUUID)(vboxDriverPtr driver, vboxIIDUnion *iidu, unsigned char *uuid);
+    void (*vboxIIDFromUUID)(vboxDriverPtr driver, vboxIIDUnion *iidu, const unsigned char *uuid);
+    bool (*vboxIIDIsEqual)(vboxDriverPtr driver, vboxIIDUnion *iidu1, vboxIIDUnion *iidu2);
+    void (*vboxIIDFromArrayItem)(vboxDriverPtr driver, vboxIIDUnion *iidu, vboxArray *array, int idx);
+    void (*vboxIIDToUtf8)(vboxDriverPtr driver, vboxIIDUnion *iidu, char **utf8);
+    void (*DEBUGIID)(vboxDriverPtr driver, const char *msg, vboxIIDUnion *iidu);
 } vboxUniformedIID;
 
 /* Functions for vboxArray */
@@ -227,7 +195,7 @@ typedef struct {
     nsresult (*OpenMachine)(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine);
     nsresult (*GetSystemProperties)(IVirtualBox *vboxObj, ISystemProperties **systemProperties);
     nsresult (*GetHost)(IVirtualBox *vboxObj, IHost **host);
-    nsresult (*CreateMachine)(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr);
+    nsresult (*CreateMachine)(vboxDriverPtr driver, virDomainDefPtr def, IMachine **machine, char *uuidstr);
     nsresult (*CreateHardDisk)(IVirtualBox *vboxObj, PRUnichar *format, PRUnichar *location, IHardDisk **hardDisk);
     nsresult (*RegisterMachine)(IVirtualBox *vboxObj, IMachine *machine);
     nsresult (*FindHardDisk)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType,
@@ -252,7 +220,7 @@ typedef struct {
                                    PRUnichar *hostPath, PRBool writable,
                                    PRBool automount);
     nsresult (*RemoveSharedFolder)(IMachine *machine, PRUnichar *name);
-    nsresult (*LaunchVMProcess)(vboxGlobalData *data, IMachine *machine,
+    nsresult (*LaunchVMProcess)(vboxDriverPtr driver, IMachine *machine,
                                 vboxIIDUnion *iidu,
                                 PRUnichar *sessionType, PRUnichar *env,
                                 IProgress **progress);
@@ -299,8 +267,8 @@ typedef struct {
 
 /* Functions for ISession */
 typedef struct {
-    nsresult (*Open)(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine *machine);
-    nsresult (*OpenExisting)(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine *machine);
+    nsresult (*Open)(vboxDriverPtr driver, vboxIIDUnion *iidu, IMachine *machine);
+    nsresult (*OpenExisting)(vboxDriverPtr driver, vboxIIDUnion *iidu, IMachine *machine);
     nsresult (*GetConsole)(ISession *session, IConsole **console);
     nsresult (*GetMachine)(ISession *session, IMachine **machine);
     nsresult (*Close)(ISession *session);
@@ -410,17 +378,17 @@ typedef struct {
 typedef struct {
     nsresult (*GetEnabled)(IVRDxServer *VRDxServer, PRBool *enabled);
     nsresult (*SetEnabled)(IVRDxServer *VRDxServer, PRBool enabled);
-    nsresult (*GetPorts)(vboxGlobalData *data, IVRDxServer *VRDxServer,
+    nsresult (*GetPorts)(vboxDriverPtr driver, IVRDxServer *VRDxServer,
                          virDomainGraphicsDefPtr graphics);
-    nsresult (*SetPorts)(vboxGlobalData *data, IVRDxServer *VRDxServer,
+    nsresult (*SetPorts)(vboxDriverPtr driver, IVRDxServer *VRDxServer,
                          virDomainGraphicsDefPtr graphics);
     nsresult (*GetReuseSingleConnection)(IVRDxServer *VRDxServer, PRBool *enabled);
     nsresult (*SetReuseSingleConnection)(IVRDxServer *VRDxServer, PRBool enabled);
     nsresult (*GetAllowMultiConnection)(IVRDxServer *VRDxServer, PRBool *enabled);
     nsresult (*SetAllowMultiConnection)(IVRDxServer *VRDxServer, PRBool enabled);
-    nsresult (*GetNetAddress)(vboxGlobalData *data, IVRDxServer *VRDxServer,
+    nsresult (*GetNetAddress)(vboxDriverPtr driver, IVRDxServer *VRDxServer,
                               PRUnichar **netAddress);
-    nsresult (*SetNetAddress)(vboxGlobalData *data, IVRDxServer *VRDxServer,
+    nsresult (*SetNetAddress)(vboxDriverPtr driver, IVRDxServer *VRDxServer,
                               PRUnichar *netAddress);
 } vboxUniformedIVRDxServer;
 
@@ -518,7 +486,7 @@ typedef struct {
                                              IHostNetworkInterface **networkInterface);
     nsresult (*FindHostNetworkInterfaceByName)(IHost *host, PRUnichar *name,
                                                IHostNetworkInterface **networkInterface);
-    nsresult (*CreateHostOnlyNetworkInterface)(vboxGlobalData *data,
+    nsresult (*CreateHostOnlyNetworkInterface)(vboxDriverPtr driver,
                                                IHost *host, char *name,
                                                IHostNetworkInterface **networkInterface);
     nsresult (*RemoveHostOnlyNetworkInterface)(IHost *host, vboxIIDUnion *iidu,
@@ -587,18 +555,17 @@ typedef struct {
     uint32_t XPCOMCVersion;
     /* vbox APIs */
     int (*initializeDomainEvent)(vboxDriverPtr driver);
-    void (*registerGlobalData)(vboxGlobalData *data);
-    void (*detachDevices)(vboxGlobalData *data, IMachine *machine, PRUnichar *hddcnameUtf16);
-    nsresult (*unregisterMachine)(vboxGlobalData *data, vboxIIDUnion *iidu, IMachine **machine);
+    void (*detachDevices)(vboxDriverPtr driver, IMachine *machine, PRUnichar *hddcnameUtf16);
+    nsresult (*unregisterMachine)(vboxDriverPtr driver, vboxIIDUnion *iidu, IMachine **machine);
     void (*deleteConfig)(IMachine *machine);
-    void (*vboxAttachDrivesOld)(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine);
+    void (*vboxAttachDrivesOld)(virDomainDefPtr def, vboxDriverPtr driver, IMachine *machine);
     virDomainState (*vboxConvertState)(PRUint32 state);
-    void (*dumpIDEHDDsOld)(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine);
-    void (*dumpDVD)(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine);
-    int (*attachDVD)(vboxGlobalData *data, IMachine *machine, const char *src);
+    void (*dumpIDEHDDsOld)(virDomainDefPtr def, vboxDriverPtr driver, IMachine *machine);
+    void (*dumpDVD)(virDomainDefPtr def, vboxDriverPtr driver, IMachine *machine);
+    int (*attachDVD)(vboxDriverPtr driver, IMachine *machine, const char *src);
     int (*detachDVD)(IMachine *machine);
-    void (*dumpFloppy)(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine);
-    int (*attachFloppy)(vboxGlobalData *data, IMachine *machine, const char *src);
+    void (*dumpFloppy)(virDomainDefPtr def, vboxDriverPtr driver, IMachine *machine);
+    int (*attachFloppy)(vboxDriverPtr driver, IMachine *machine, const char *src);
     int (*detachFloppy)(IMachine *machine);
     int (*snapshotRestore)(virDomainPtr dom, IMachine *machine, ISnapshot *snapshot);
     void (*registerDomainEvent)(virHypervisorDriverPtr driver);
@@ -634,7 +601,6 @@ typedef struct {
     uniformedMachineStateChecker machineStateChecker;
     /* vbox API features */
     bool domainEventCallbacks;
-    bool hasStaticGlobalData;
     bool getMachineForSession;
     bool detachDevicesExplicitly;
     bool chipsetType;
-- 
2.9.3




More information about the libvir-list mailing list