req.h revision 19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** @file
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * InnoTek Portable Runtime - Request packets
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/*
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Copyright (C) 2006 InnoTek Systemberatung GmbH
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * available from http://www.virtualbox.org. This file is free software;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * you can redistribute it and/or modify it under the terms of the GNU
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * General Public License as published by the Free Software Foundation,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If you received this file as part of a commercial VirtualBox
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * distribution, then only the terms of your commercial VirtualBox
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * license agreement apply instead of the previous paragraph.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#ifndef __iprt_req_h__
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#define __iprt_req_h__
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#include <iprt/cdefs.h>
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#include <iprt/types.h>
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#include <iprt/stdarg.h>
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync__BEGIN_DECLS
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** @defgroup grp_rt_req RTReq - Request Packet Management
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @ingroup grp_rt
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Request type.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef enum RTREQTYPE
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Invalid request. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQTYPE_INVALID = 0,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** RT: Internal. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQTYPE_INTERNAL,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Maximum request type (exclusive). Used for validation. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQTYPE_MAX
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync} RTREQTYPE;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Request state.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef enum RTREQSTATE
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The state is invalid. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_INVALID = 0,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request have been allocated and is in the process of being filed. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_ALLOCATED,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request is queued by the requester. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_QUEUED,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request is begin processed. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_PROCESSING,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request is completed, the requester is begin notified. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_COMPLETED,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request packet is in the free chain. (The requester */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQSTATE_FREE
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync} RTREQSTATE;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Request flags.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef enum RTREQFLAGS
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request returns a iprt status code. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQFLAGS_VBOX_STATUS = 0,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The request is a void request and have no status code. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQFLAGS_VOID = 1,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Return type mask. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQFLAGS_RETURN_MASK = 1,
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Caller does not wait on the packet, Queue process thread will free it. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQFLAGS_NO_WAIT = 2
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync} RTREQFLAGS;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/* Forward declaration. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncstruct RTREQQUEUE;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * RT Request packet.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This is used to request an action in the queue handler thread.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef struct RTREQ
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Pointer to the next request in the chain. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync struct RTREQ * volatile pNext;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Pointer to the queue this packet belongs to. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQQUEUE *pQueue;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Request state. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile RTREQSTATE enmState;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** iprt status code for the completed request. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile int iStatus;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Requester event sem.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The request can use this event semaphore to wait/poll for completion
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * of the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTSEMEVENT EventSem;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Set if the event semaphore is clear. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile bool fEventSemClear;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Flags, RTREQ_FLAGS_*. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync unsigned fFlags;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Request type. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTREQTYPE enmType;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Request specific data. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync union RTREQ_U
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync {
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** RTREQTYPE_INTERNAL. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync struct
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync {
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Pointer to the function to be called. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync PFNRT pfn;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Number of arguments. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync unsigned cArgs;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Array of arguments. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync uintptr_t aArgs[64];
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync } Internal;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync } u;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync} RTREQ;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** Pointer to an RT request packet. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef RTREQ *PRTREQ;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** @todo hide this */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef struct RTREQQUEUE
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync{
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Head of the request queue. Atomic. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile PRTREQ pReqs;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** The last index used during alloc/free. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile uint32_t iReqFree;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Array of pointers to lists of free request packets. Atomic. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile PRTREQ apReqFree[9];
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Number of free request packets. */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync volatile uint32_t cReqFree;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync /** Requester event sem.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The request can use this event semaphore to wait/poll for new requests.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync RTSEMEVENT EventSem;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync} RTREQQUEUE;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** Pointer to a request queue */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsynctypedef RTREQQUEUE *PRTREQQUEUE;
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#ifdef IN_RING3
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Create a request packet queueu
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqCreateQueue(PRTREQQUEUE *ppQueue);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Destroy a request packet queueu
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqDestroyQueue(PRTREQQUEUE pQueue);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Process one or more request packets
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being added.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for a pending request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Use RT_INDEFINITE_WAIT to only wait till one is added.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqProcess(PRTREQQUEUE pQueue, unsigned cMillies);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Allocate and queue a call request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If it's desired to poll on the completion of the request set cMillies
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * to 0 and use RTReqWait() to check for completation. In the other case
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * use RT_INDEFINITE_WAIT.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The returned request packet must be freed using RTReqFree().
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt statuscode.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ppReq Where to store the pointer to the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This will be NULL or a valid request pointer not matter what happends.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for the request to
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be completed. Use RT_INDEFINITE_WAIT to only
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pfnFunction Pointer to the function to call.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cArgs Number of arguments following in the ellipsis.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Not possible to pass 64-bit arguments!
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ... Function arguments.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqCall(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, PFNRT pfnFunction, unsigned cArgs, ...);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Allocate and queue a call request to a void function.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If it's desired to poll on the completion of the request set cMillies
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * to 0 and use RTReqWait() to check for completation. In the other case
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * use RT_INDEFINITE_WAIT.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The returned request packet must be freed using RTReqFree().
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ppReq Where to store the pointer to the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This will be NULL or a valid request pointer not matter what happends.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for the request to
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be completed. Use RT_INDEFINITE_WAIT to only
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pfnFunction Pointer to the function to call.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cArgs Number of arguments following in the ellipsis.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Not possible to pass 64-bit arguments!
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ... Function arguments.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqCallVoid(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, PFNRT pfnFunction, unsigned cArgs, ...);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Allocate and queue a call request to a void function.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If it's desired to poll on the completion of the request set cMillies
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * to 0 and use RTReqWait() to check for completation. In the other case
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * use RT_INDEFINITE_WAIT.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The returned request packet must be freed using RTReqFree().
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ppReq Where to store the pointer to the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This will be NULL or a valid request pointer not matter what happends, unless fFlags
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * contains RTREQFLAGS_NO_WAIT when it will be optional and always NULL.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for the request to
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be completed. Use RT_INDEFINITE_WAIT to only
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param fFlags A combination of the RTREQFLAGS values.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pfnFunction Pointer to the function to call.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cArgs Number of arguments following in the ellipsis.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Not possible to pass 64-bit arguments!
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ... Function arguments.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqCallEx(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, unsigned fFlags, PFNRT pfnFunction, unsigned cArgs, ...);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Allocate and queue a call request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If it's desired to poll on the completion of the request set cMillies
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * to 0 and use RTReqWait() to check for completation. In the other case
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * use RT_INDEFINITE_WAIT.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The returned request packet must be freed using RTReqFree().
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ppReq Where to store the pointer to the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * This will be NULL or a valid request pointer not matter what happends, unless fFlags
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * contains RTREQFLAGS_NO_WAIT when it will be optional and always NULL.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for the request to
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be completed. Use RT_INDEFINITE_WAIT to only
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param fFlags A combination of the RTREQFLAGS values.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pfnFunction Pointer to the function to call.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cArgs Number of arguments following in the ellipsis.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Not possible to pass 64-bit arguments!
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pvArgs Pointer to function arguments.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqCallV(PRTREQQUEUE pQueue, PRTREQ *ppReq, unsigned cMillies, unsigned fFlags, PFNRT pfnFunction, unsigned cArgs, va_list Args);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Allocates a request packet.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The caller allocates a request packet, fills in the request data
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * union and queues the request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReqQueue The request queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param ppReq Where to store the pointer to the allocated packet.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param enmType Package type.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqAlloc(PRTREQQUEUE pQueue, PRTREQ *ppReq, RTREQTYPE enmType);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Free a request packet.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReq Package to free.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @remark The request packet must be in allocated or completed state!
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqFree(PRTREQ pReq);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Queue a request.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * The quest must be allocated using RTReqAlloc() and contain
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * all the required data.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * If it's disired to poll on the completion of the request set cMillies
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * to 0 and use RTReqWait() to check for completation. In the other case
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * use RT_INDEFINITE_WAIT.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReq The request to queue.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait for the request to
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * be completed. Use RT_INDEFINITE_WAIT to only
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqQueue(PRTREQ pReq, unsigned cMillies);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/**
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Wait for a request to be completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns iprt status code.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Will not return VERR_INTERRUPTED.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @returns VERR_TIMEOUT if cMillies was reached without the packet being completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync *
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param pReq The request to wait for.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * @param cMillies Number of milliseconds to wait.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync * Use RT_INDEFINITE_WAIT to only wait till it's completed.
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsyncRTDECL(int) RTReqWait(PRTREQ pReq, unsigned cMillies);
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#endif /* IN_RING3 */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync/** @} */
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync__END_DECLS
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync#endif
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync
19c976d0829db79a6f0aa68fbcc9c9bb8f0e5126vboxsync