HGCMObjects.cpp revision bd8e360cd1db83dcb2694ea9122ce3bc5bae678a
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * HGCM (Host-Guest Communication Manager):
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * HGCMObjects - Host-Guest Communication Manager objects
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Copyright (C) 2006-2007 innotek GmbH
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/* 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.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjMake (HGCMObject *pObject, uint32_t u32HandleIn)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync LogFlow(("MAIN::hgcmObjGenerateHandle: pObject %p\n", pObject));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* Generate a new handle value. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t volatile *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT?
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* Rollover. Something is wrong. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* 0 and 0x80000000 are not valid handles. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Over the invalid value, reinitialize the source. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT?
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync 0x80000000;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Insert object to AVL tree. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync bool bRC = RTAvlULInsert(&g_pTree, &pCore->AvlCore);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Could not insert a handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Try another generated handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Could not use the specified handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Initialize backlink. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Reference the object for time while it resides in the tree. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Store returned handle. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync AssertReleaseMsgFailed (("MAIN::hgcmObjGenerateHandle: Failed to acquire object pool semaphore"));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjGenerateHandle: handle = 0x%08X, rc = %Vrc, return void\n", handle, rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjGenerateHandle (HGCMObject *pObject)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncuint32_t hgcmObjAssignHandle (HGCMObject *pObject, uint32_t u32Handle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjDeleteHandle: handle 0x%08X\n", handle));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ObjectAVLCore *pCore = (ObjectAVLCore *)RTAvlULRemove (&g_pTree, handle);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync AssertReleaseMsgFailed (("Failed to acquire object pool semaphore, rc = %Vrc", rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjDeleteHandle: rc = %Vrc, return void\n", rc));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncHGCMObject *hgcmObjReference (uint32_t handle, HGCMOBJ_TYPE enmObjType)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlow(("MAIN::hgcmObjReference: handle 0x%08X\n", handle));
return pObject;
if ( pCore
hgcmObjLeave ();
return pObject;
return g_u32ClientHandleCount;
hgcmObjLeave ();