HGCMObjects.cpp revision bd8e360cd1db83dcb2694ea9122ce3bc5bae678a
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** @file
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * HGCM (Host-Guest Communication Manager):
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * HGCMObjects - Host-Guest Communication Manager objects
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Copyright (C) 2006-2007 innotek GmbH
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * available from http://www.virtualbox.org. This file is free software;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * you can redistribute it and/or modify it under the terms of the GNU
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * General Public License (GPL) as published by the Free Software
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define LOG_GROUP_MAIN_OVERRIDE LOG_GROUP_HGCM
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "Logging.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "HGCMObjects.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <string.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <VBox/err.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsyncstatic RTCRITSECT g_critsect;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* There are internal handles, which are not saved,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * and client handles, which are saved.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * They use different range of values:
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 1..7FFFFFFF for clients,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 0x80000001..0xFFFFFFFF for other handles.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic uint32_t volatile g_u32InternalHandleCount;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic uint32_t volatile g_u32ClientHandleCount;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic PAVLULNODECORE g_pTree;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncDECLINLINE(int) hgcmObjEnter (void)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return RTCritSectEnter (&g_critsect);
185aed3c4ef2ff30c7152e65fe49d6025b368190vboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncDECLINLINE(void) hgcmObjLeave (void)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTCritSectLeave (&g_critsect);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncint hgcmObjInit (void)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = VINF_SUCCESS;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjInit\n"));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync g_u32InternalHandleCount = 0x80000000;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync g_u32ClientHandleCount = 0;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync g_pTree = NULL;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync rc = RTCritSectInit (&g_critsect);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjInit: rc = %Vrc\n", rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return rc;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncvoid hgcmObjUninit (void)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (RTCritSectIsInitialized (&g_critsect))
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTCritSectDelete (&g_critsect);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjMake (HGCMObject *pObject, uint32_t u32HandleIn)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int handle = 0;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync LogFlow(("MAIN::hgcmObjGenerateHandle: pObject %p\n", pObject));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int rc = hgcmObjEnter ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync if (VBOX_SUCCESS(rc))
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ObjectAVLCore *pCore = &pObject->Core;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* Generate a new handle value. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t volatile *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT?
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync &g_u32ClientHandleCount:
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync &g_u32InternalHandleCount;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t u32Start = *pu32HandleCountSource;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync for (;;)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t Key;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync if (u32HandleIn == 0)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Key = ASMAtomicIncU32 (pu32HandleCountSource);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync if (Key == u32Start)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* Rollover. Something is wrong. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync AssertReleaseFailed ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync break;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* 0 and 0x80000000 are not valid handles. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if ((Key & 0x7FFFFFFF) == 0)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Over the invalid value, reinitialize the source. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT?
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync 0:
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync 0x80000000;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync continue;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync else
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Key = u32HandleIn;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Insert object to AVL tree. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync pCore->AvlCore.Key = Key;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync bool bRC = RTAvlULInsert(&g_pTree, &pCore->AvlCore);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Could not insert a handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (!bRC)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (u32HandleIn == 0)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Try another generated handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync continue;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync else
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Could not use the specified handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync break;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Initialize backlink. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync pCore->pSelf = pObject;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Reference the object for time while it resides in the tree. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync pObject->Reference ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Store returned handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync handle = Key;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Log(("Object key inserted 0x%08X\n", Key));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync break;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync hgcmObjLeave ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync else
e961f5bfe1727c6816d3dad3805ebe21b6ba1c64vboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync AssertReleaseMsgFailed (("MAIN::hgcmObjGenerateHandle: Failed to acquire object pool semaphore"));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjGenerateHandle: handle = 0x%08X, rc = %Vrc, return void\n", handle, rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return handle;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync}
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjGenerateHandle (HGCMObject *pObject)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync{
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync return hgcmObjMake (pObject, 0);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync}
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjAssignHandle (HGCMObject *pObject, uint32_t u32Handle)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync{
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync return hgcmObjMake (pObject, u32Handle);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncvoid hgcmObjDeleteHandle (uint32_t handle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = VINF_SUCCESS;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjDeleteHandle: handle 0x%08X\n", handle));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (handle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync rc = hgcmObjEnter ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync if (VBOX_SUCCESS(rc))
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ObjectAVLCore *pCore = (ObjectAVLCore *)RTAvlULRemove (&g_pTree, handle);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync if (pCore)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync AssertRelease(pCore->pSelf);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync pCore->pSelf->Dereference ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync hgcmObjLeave ();
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync }
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync else
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync AssertReleaseMsgFailed (("Failed to acquire object pool semaphore, rc = %Vrc", rc));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync }
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync }
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjDeleteHandle: rc = %Vrc, return void\n", rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync}
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncHGCMObject *hgcmObjReference (uint32_t handle, HGCMOBJ_TYPE enmObjType)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjReference: handle 0x%08X\n", handle));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync HGCMObject *pObject = NULL;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
if ((handle & 0x7FFFFFFF) == 0)
{
return pObject;
}
int rc = hgcmObjEnter ();
if (VBOX_SUCCESS(rc))
{
ObjectAVLCore *pCore = (ObjectAVLCore *)RTAvlULGet (&g_pTree, handle);
Assert(!pCore || (pCore->pSelf && pCore->pSelf->Type() == enmObjType));
if ( pCore
&& pCore->pSelf
&& pCore->pSelf->Type() == enmObjType)
{
pObject = pCore->pSelf;
AssertRelease(pObject);
pObject->Reference ();
}
hgcmObjLeave ();
}
else
{
AssertReleaseMsgFailed (("Failed to acquire object pool semaphore, rc = %Vrc", rc));
}
LogFlow(("MAIN::hgcmObjReference: return pObject %p\n", pObject));
return pObject;
}
void hgcmObjDereference (HGCMObject *pObject)
{
LogFlow(("MAIN::hgcmObjDereference: pObject %p\n", pObject));
AssertRelease(pObject);
pObject->Dereference ();
LogFlow(("MAIN::hgcmObjDereference: return\n"));
}
uint32_t hgcmObjQueryHandleCount ()
{
return g_u32ClientHandleCount;
}
void hgcmObjSetHandleCount (uint32_t u32ClientHandleCount)
{
Assert(g_u32ClientHandleCount <= u32ClientHandleCount);
int rc = hgcmObjEnter ();
if (VBOX_SUCCESS(rc))
{
if (g_u32ClientHandleCount <= u32ClientHandleCount)
g_u32ClientHandleCount = u32ClientHandleCount;
hgcmObjLeave ();
}
}