handletable.h revision c8dfb9c4df92b82e92a48d90d984cfd7b6339111
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * IPRT - Handle Tables.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2008 Oracle Corporation
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * The contents of this file may alternatively be used under the terms
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * of the Common Development and Distribution License Version 1.0
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * VirtualBox OSE distribution, in which case the provisions of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * CDDL are applicable instead of those of the GPL.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * You may elect to license modified versions of this file under the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * terms and conditions of either the GPL or the CDDL or both.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef ___iprt_handletable_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define ___iprt_handletable_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/cdefs.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/types.h>
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_BEGIN
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @defgroup grp_rt_handletable RTHandleTable - Handle Tables
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @ingroup grp_rt
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Callback for retaining an object during the lookup and free calls.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * This callback is executed when a handle is being looked up in one
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * way or another from behind the handle table lock. This allows you
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to increase the reference (or some equivalent thing) during the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * handle lookup and thereby eliminate any race with anyone trying
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to free the handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync * Note that there is no counterpart to this callback, so if you make
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * use of this you'll have to release the object manually of course.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync * Another use of this callback is to do some extra access checking.
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync * Use the return code to indicate whether the lookup should fail
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * or not (no object is returned on faliure, naturally).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code for the lookup (the caller won't see this).
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle table handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvObj The object which has been looked up.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvCtx The context argument if the handle table was created with the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * RTHANDLETABLE_FLAGS_CONTEXT set. Otherwise NULL.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvUser The user context argument specified when creating the table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(int) FNRTHANDLETABLERETAIN(RTHANDLETABLE hHandleTable, void *pvObj, void *pvCtx, void *pvUser);
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync/** Pointer to a FNHANDLETABLERETAIN. */
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsynctypedef FNRTHANDLETABLERETAIN *PFNRTHANDLETABLERETAIN;
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync/**
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * Callback for deleting a left over object during RTHandleTableDestroy.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync *
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * @param hHandleTable The handle table handle.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * @param h The handle.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * @param pvObj The object.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * @param pvCtx The context argument if the handle table was created with the
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * RTHANDLETABLE_FLAGS_CONTEXT set. Otherwise NULL.
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync * @param pvUser The user context argument specified when creating the table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef DECLCALLBACK(void) FNRTHANDLETABLEDELETE(RTHANDLETABLE hHandleTable, uint32_t h, void *pvObj, void *pvCtx, void *pvUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Pointer to a FNRTHANDLETABLEDELETE. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef FNRTHANDLETABLEDELETE *PFNRTHANDLETABLEDELETE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @name RTHandleTableCreateEx flags
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Whether the handle table entries takes a context or not.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This can be useful for associating a handle with for instance a process or
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * similar in order to prevent anyone but the owner from using the handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Setting this means you will have to use the WithCtx functions to do the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * handle management. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define RTHANDLETABLE_FLAGS_CONTEXT RT_BIT_32(0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Whether the handle table should take care of the serialization.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * If not specified the caller will have to take care of that. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define RTHANDLETABLE_FLAGS_LOCKED RT_BIT_32(1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** The mask of valid flags. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#define RTHANDLETABLE_FLAGS_MASK UINT32_C(0x00000003)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** @} */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Creates a handle table.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * The handle table translates a 32-bit handle into an object pointer,
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * optionally calling you back so you can retain the object without
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * racing RTHandleTableFree.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @returns IPRT status code and on success a handle table handle will be stored at the
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * location phHandleTable points at.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param phHandleTable Where to store the handle table handle on success.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param fFlags Flags, see RTHANDLETABLE_FLAGS_*.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param uBase The handle base value. This is the value of the
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * first handle to be returned.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param cMax The max number of handles. When exceeded the RTHandleTableAlloc
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * or RTHandleTableAllocWithCtx calls will fail. Note that this
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * number will be rounded up to a multiple of the sub-table size,
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * or if it's too close to UINT32_MAX it will be rounded down.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param pfnRetain Optional retain callback that will be called from behind the
7b80828e5760a8814fe6cd494d2715a4544fbddcvboxsync * lock (if any) during lookup.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param pvUser The user argument to the retain callback.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncRTDECL(int) RTHandleTableCreateEx(PRTHANDLETABLE phHandleTable, uint32_t fFlags, uint32_t uBase, uint32_t cMax,
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PFNRTHANDLETABLERETAIN pfnRetain, void *pvUser);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * A simplified version of the RTHandleTableCreateEx API.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * It assumes a max of about 64K handles with 1 being the base. The table
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * access will serialized (RTHANDLETABLE_FLAGS_LOCKED).
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @returns IPRT status code and *phHandleTable.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param phHandleTable Where to store the handle table handle on success.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncRTDECL(int) RTHandleTableCreate(PRTHANDLETABLE phHandleTable);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Destroys a handle table.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync * If any entries are still in used the pfnDelete callback will be invoked
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * on each of them (if specfied) to allow to you clean things up.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pfnDelete Function to be called back on each handle still in use. Optional.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvUser The user argument to pfnDelete.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTHandleTableDestroy(RTHANDLETABLE hHandleTable, PFNRTHANDLETABLEDELETE pfnDelete, void *pvUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Allocates a handle from the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code, almost any.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @retval VINF_SUCCESS on success.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @retval VERR_NO_MEMORY if we failed to extend the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @retval VERR_NO_MORE_HANDLES if we're out of handles.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvObj The object to associate with the new handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This must be aligned on a 4 byte boundary.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ph Where to return the handle on success.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Do not call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTHandleTableAlloc(RTHANDLETABLE hHandleTable, void *pvObj, uint32_t *ph);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Looks up a handle.
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync *
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync * @returns The object pointer on success. NULL on failure.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param h The handle to lookup.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Do not call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void *) RTHandleTableLookup(RTHANDLETABLE hHandleTable, uint32_t h);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Looks up and frees a handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns The object pointer on success. NULL on failure.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param h The handle to lookup.
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Do not call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void *) RTHandleTableFree(RTHANDLETABLE hHandleTable, uint32_t h);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Allocates a handle from the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code, almost any.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @retval VINF_SUCCESS on success.
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync * @retval VERR_NO_MEMORY if we failed to extend the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @retval VERR_NO_MORE_HANDLES if we're out of handles.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvObj The object to associate with the new handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This must be aligned on a 4 byte boundary.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvCtx The context to associate with the new handle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ph Where to return the handle on success.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTHandleTableAllocWithCtx(RTHANDLETABLE hHandleTable, void *pvObj, void *pvCtx, uint32_t *ph);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync/**
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * Looks up a handle.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * @returns The object pointer on success. NULL on failure.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * @param hHandleTable The handle to the handle table.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * @param h The handle to lookup.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvCtx The handle context, this must match what was given on allocation.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncRTDECL(void *) RTHandleTableLookupWithCtx(RTHANDLETABLE hHandleTable, uint32_t h, void *pvCtx);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync * Looks up and frees a handle.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns The object pointer on success. NULL on failure.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param hHandleTable The handle to the handle table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param h The handle to lookup.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pvCtx The handle context, this must match what was given on allocation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remarks Call this if RTHANDLETABLE_FLAGS_CONTEXT was used during creation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void *) RTHandleTableFreeWithCtx(RTHANDLETABLE hHandleTable, uint32_t h, void *pvCtx);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_END
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync