PDMAsyncCompletionInternal.h revision 2af0dd14e6c1c9297537694bd8ff24ae5838620c
/* $Id$ */
/** @file
* PDM - Pluggable Device Manager, Async I/O Completion internal header.
*/
/*
* Copyright (C) 2006-2008 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#ifndef __PDMAsyncCompletionInternal_h
#define __PDMAsyncCompletionInternal_h
#include "PDMInternal.h"
#include <iprt/critsect.h>
#include <VBox/pdmasynccompletion.h>
/**
* Supported endpoint classes.
*/
typedef enum PDMASYNCCOMPLETIONEPCLASSTYPE
{
/** File class. */
/** Number of supported classes. */
/** 32bit hack. */
PDMASYNCCOMPLETIONEPCLASSTYPE_32BIT_HACK = 0x7fffffff
/**
* PDM Async completion endpoint operations.
*/
typedef struct PDMASYNCCOMPLETIONEPCLASSOPS
{
/** Version identifier. */
/** Name of the endpoint class. */
const char *pcszName;
/** Class type. */
/** Size of the global endpoint class data in bytes. */
/** Size of an endpoint in bytes. */
/** size of a task in bytes. */
/**
* Initializes the global data for a endpoint class.
*
* @returns VBox status code.
* @param pClassGlobals Pointer to the uninitialized globals data.
* @param pCfgNode Node for querying configuration data.
*/
DECLR3CALLBACKMEMBER(int, pfnInitialize, (PPDMASYNCCOMPLETIONEPCLASS pClassGlobals, PCFGMNODE pCfgNode));
/**
* Frees all allocated ressources which were allocated during init.
*
* @returns VBox status code.
* @param pClassGlobals Pointer to the globals data.
*/
/**
* Initializes a given endpoint.
*
* @returns VBox status code.
* @param pEndpoint Pointer to the uninitialized endpoint.
* @param pszUri Pointer to the string containing the endpoint
* destination (filename, IP address, ...)
* @param fFlags Creation flags.
*/
/**
* Closes a endpoint finishing all tasks.
*
* @returns VBox status code.
* @param pEndpoint Pointer to the endpoint to be closed.
*/
/**
* Initiates a read request from the given endpoint.
*
* @returns VBox status code.
* @param pTask Pointer to the task object associated with the request.
* @param pEndpoint Endpoint the request is for.
* @param off Where to start reading from.
* @param paSegments Scatter gather list to store the data in.
* @param cSegments Number of segments in the list.
* @param cbRead The overall number of bytes to read.
*/
/**
* Initiates a write request to the given endpoint.
*
* @returns VBox status code.
* @param pTask Pointer to the task object associated with the request.
* @param pEndpoint Endpoint the request is for.
* @param off Where to start writing to.
* @param paSegments Scatter gather list to store the data in.
* @param cSegments Number of segments in the list.
* @param cbRead The overall number of bytes to write.
*/
/**
* Initiates a flush request on the given endpoint.
*
* @returns VBox status code.
* @param pTask Pointer to the task object associated with the request.
* @param pEndpoint Endpoint the request is for.
*/
/**
* Initiates a flush request on the given endpoint.
*
* @returns VBox status code.
* @param pEndpoint Endpoint the request is for.
* @param pcbSize Where to store the size of the endpoint.
*/
/** Initialization safety marker. */
/** Pointer to a async completion endpoint class operation table. */
/** Const pointer to a async completion endpoint class operation table. */
typedef const PDMASYNCCOMPLETIONEPCLASSOPS *PCPDMASYNCCOMPLETIONEPCLASSOPS;
/** Version for the endpoint class operations structure. */
#define PDMAC_EPCLASS_OPS_VERSION 0x00000001
/**
* PDM Async completion endpoint class.
* Common data.
*/
typedef struct PDMASYNCCOMPLETIONEPCLASS
{
/** Pointer to the shared VM structure. */
/** @name Things configurable through CFGM
* @{ */
/** Size of the per endpoint cache. */
/** Size of the per class cache. */
/** @} */
/** Critical section protecting the endpoint list. */
/** Number of endpoints in the list. */
volatile unsigned cEndpoints;
/** Head of endpoints with this class. */
/** Pointer to the callback table. */
/** Bigger cache for free task items used by all endpoints
* of this class. */
/** Number of tasks cached */
volatile uint32_t cTasksCached;
/** Pointer to the PDM async completion endpoint class data. */
/**
* A PDM Async completion endpoint.
* Common data.
*/
typedef struct PDMASYNCCOMPLETIONENDPOINT
{
/** Next endpoint in the list. */
/** previous endpoint in the list. */
/** Pointer to the class this endpoint belongs to. */
/** Head of the small cache for allocated task structures for exclusive
* use by this endpoint. */
/** Tail of the small cache for allocated task structures for exclusive
* use by this endpoint. */
/** Number of elements in the cache. */
volatile uint32_t cTasksCached;
/** Start slot for the global task cache. */
unsigned iSlotStart;
/** ID of the next task to ensure consistency. */
volatile uint32_t uTaskIdNext;
/** Flag whether a wraparound occurred for the ID counter. */
bool fTaskIdWraparound;
/** Template associated with this endpoint. */
/**
* A PDM async completion task handle.
* Common data.
*/
typedef struct PDMASYNCCOMPLETIONTASK
{
/** Next task in the list
* (for free and assigned tasks). */
/** Previous task in the list
* (for free and assigned tasks). */
/** Endpoint this task is assigned to. */
/** Opaque user data for this task. */
void *pvUser;
/** Task id. */
/**
* Called by the endpoint if a task has finished.
*
* @returns nothing
* @param pTask Pointer to the finished task.
*/
#endif /* __PDMAsyncCompletionInternal_h */