VirtualBox

source: vbox/trunk/src/VBox/VMM/PDMAsyncCompletionInternal.h@ 25414

Last change on this file since 25414 was 22309, checked in by vboxsync, 15 years ago

PDMAsyncCompletion: Add first part of the cache for file I/O

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.1 KB
Line 
1/* $Id: PDMAsyncCompletionInternal.h 22309 2009-08-17 20:59:28Z vboxsync $ */
2/** @file
3 * PDM - Pluggable Device Manager, Async I/O Completion internal header.
4 */
5
6/*
7 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21#ifndef __PDMAsyncCompletionInternal_h
22#define __PDMAsyncCompletionInternal_h
23
24#include "PDMInternal.h"
25#include <iprt/cdefs.h>
26#include <iprt/critsect.h>
27#include <VBox/types.h>
28#include <VBox/cfgm.h>
29#include <VBox/pdmasynccompletion.h>
30
31RT_C_DECLS_BEGIN
32
33/**
34 * Supported endpoint classes.
35 */
36typedef enum PDMASYNCCOMPLETIONEPCLASSTYPE
37{
38 /** File class. */
39 PDMASYNCCOMPLETIONEPCLASSTYPE_FILE = 0,
40 /** Number of supported classes. */
41 PDMASYNCCOMPLETIONEPCLASSTYPE_MAX,
42 /** 32bit hack. */
43 PDMASYNCCOMPLETIONEPCLASSTYPE_32BIT_HACK = 0x7fffffff
44} PDMASYNCCOMPLETIONEPCLASSTYPE;
45
46/**
47 * PDM Async completion endpoint operations.
48 */
49typedef struct PDMASYNCCOMPLETIONEPCLASSOPS
50{
51 /** Version identifier. */
52 uint32_t u32Version;
53 /** Name of the endpoint class. */
54 const char *pcszName;
55 /** Class type. */
56 PDMASYNCCOMPLETIONEPCLASSTYPE enmClassType;
57 /** Size of the global endpoint class data in bytes. */
58 size_t cbEndpointClassGlobal;
59 /** Size of an endpoint in bytes. */
60 size_t cbEndpoint;
61 /** size of a task in bytes. */
62 size_t cbTask;
63
64 /**
65 * Initializes the global data for a endpoint class.
66 *
67 * @returns VBox status code.
68 * @param pClassGlobals Pointer to the uninitialized globals data.
69 * @param pCfgNode Node for querying configuration data.
70 */
71 DECLR3CALLBACKMEMBER(int, pfnInitialize, (PPDMASYNCCOMPLETIONEPCLASS pClassGlobals, PCFGMNODE pCfgNode));
72
73 /**
74 * Frees all allocated ressources which were allocated during init.
75 *
76 * @returns VBox status code.
77 * @param pClassGlobals Pointer to the globals data.
78 */
79 DECLR3CALLBACKMEMBER(void, pfnTerminate, (PPDMASYNCCOMPLETIONEPCLASS pClassGlobals));
80
81 /**
82 * Initializes a given endpoint.
83 *
84 * @returns VBox status code.
85 * @param pEndpoint Pointer to the uninitialized endpoint.
86 * @param pszUri Pointer to the string containing the endpoint
87 * destination (filename, IP address, ...)
88 * @param fFlags Creation flags.
89 */
90 DECLR3CALLBACKMEMBER(int, pfnEpInitialize, (PPDMASYNCCOMPLETIONENDPOINT pEndpoint,
91 const char *pszUri, uint32_t fFlags));
92
93 /**
94 * Closes a endpoint finishing all tasks.
95 *
96 * @returns VBox status code.
97 * @param pEndpoint Pointer to the endpoint to be closed.
98 */
99 DECLR3CALLBACKMEMBER(int, pfnEpClose, (PPDMASYNCCOMPLETIONENDPOINT pEndpoint));
100
101 /**
102 * Initiates a read request from the given endpoint.
103 *
104 * @returns VBox status code.
105 * @param pTask Pointer to the task object associated with the request.
106 * @param pEndpoint Endpoint the request is for.
107 * @param off Where to start reading from.
108 * @param paSegments Scatter gather list to store the data in.
109 * @param cSegments Number of segments in the list.
110 * @param cbRead The overall number of bytes to read.
111 */
112 DECLR3CALLBACKMEMBER(int, pfnEpRead, (PPDMASYNCCOMPLETIONTASK pTask,
113 PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
114 PCPDMDATASEG paSegments, size_t cSegments,
115 size_t cbRead));
116
117 /**
118 * Initiates a write request to the given endpoint.
119 *
120 * @returns VBox status code.
121 * @param pTask Pointer to the task object associated with the request.
122 * @param pEndpoint Endpoint the request is for.
123 * @param off Where to start writing to.
124 * @param paSegments Scatter gather list to store the data in.
125 * @param cSegments Number of segments in the list.
126 * @param cbRead The overall number of bytes to write.
127 */
128 DECLR3CALLBACKMEMBER(int, pfnEpWrite, (PPDMASYNCCOMPLETIONTASK pTask,
129 PPDMASYNCCOMPLETIONENDPOINT pEndpoint, RTFOFF off,
130 PCPDMDATASEG paSegments, size_t cSegments,
131 size_t cbWrite));
132
133 /**
134 * Initiates a flush request on the given endpoint.
135 *
136 * @returns VBox status code.
137 * @param pTask Pointer to the task object associated with the request.
138 * @param pEndpoint Endpoint the request is for.
139 */
140 DECLR3CALLBACKMEMBER(int, pfnEpFlush, (PPDMASYNCCOMPLETIONTASK pTask,
141 PPDMASYNCCOMPLETIONENDPOINT pEndpoint));
142
143 /**
144 * Initiates a flush request on the given endpoint.
145 *
146 * @returns VBox status code.
147 * @param pEndpoint Endpoint the request is for.
148 * @param pcbSize Where to store the size of the endpoint.
149 */
150 DECLR3CALLBACKMEMBER(int, pfnEpGetSize, (PPDMASYNCCOMPLETIONENDPOINT pEndpoint,
151 uint64_t *pcbSize));
152
153 /** Initialization safety marker. */
154 uint32_t u32VersionEnd;
155} PDMASYNCCOMPLETIONEPCLASSOPS;
156/** Pointer to a async completion endpoint class operation table. */
157typedef PDMASYNCCOMPLETIONEPCLASSOPS *PPDMASYNCCOMPLETIONEPCLASSOPS;
158/** Const pointer to a async completion endpoint class operation table. */
159typedef const PDMASYNCCOMPLETIONEPCLASSOPS *PCPDMASYNCCOMPLETIONEPCLASSOPS;
160
161/** Version for the endpoint class operations structure. */
162#define PDMAC_EPCLASS_OPS_VERSION 0x00000001
163
164/**
165 * PDM Async completion endpoint class.
166 * Common data.
167 */
168typedef struct PDMASYNCCOMPLETIONEPCLASS
169{
170 /** Pointer to the shared VM structure. */
171 PVM pVM;
172 /** @name Things configurable through CFGM
173 * @{ */
174 /** Size of the per endpoint cache. */
175 uint32_t cEndpointCacheSize;
176 /** Size of the per class cache. */
177 uint32_t cEpClassCacheSize;
178 /** @} */
179 /** Critical section protecting the endpoint list. */
180 RTCRITSECT CritSect;
181 /** Number of endpoints in the list. */
182 volatile unsigned cEndpoints;
183 /** Head of endpoints with this class. */
184 R3PTRTYPE(PPDMASYNCCOMPLETIONENDPOINT) pEndpointsHead;
185 /** Pointer to the callback table. */
186 R3PTRTYPE(PCPDMASYNCCOMPLETIONEPCLASSOPS) pEndpointOps;
187 /** Bigger cache for free task items used by all endpoints
188 * of this class. */
189 R3PTRTYPE(volatile PPDMASYNCCOMPLETIONTASK) apTaskCache[10];
190 /** Number of tasks cached */
191 volatile uint32_t cTasksCached;
192} PDMASYNCCOMPLETIONEPCLASS;
193/** Pointer to the PDM async completion endpoint class data. */
194typedef PDMASYNCCOMPLETIONEPCLASS *PPDMASYNCCOMPLETIONEPCLASS;
195
196/**
197 * A PDM Async completion endpoint.
198 * Common data.
199 */
200typedef struct PDMASYNCCOMPLETIONENDPOINT
201{
202 /** Next endpoint in the list. */
203 R3PTRTYPE(PPDMASYNCCOMPLETIONENDPOINT) pNext;
204 /** Previous endpoint in the list. */
205 R3PTRTYPE(PPDMASYNCCOMPLETIONENDPOINT) pPrev;
206 /** Pointer to the class this endpoint belongs to. */
207 R3PTRTYPE(PPDMASYNCCOMPLETIONEPCLASS) pEpClass;
208 /** Head of the small cache for allocated task structures for exclusive
209 * use by this endpoint. */
210 R3PTRTYPE(volatile PPDMASYNCCOMPLETIONTASK) pTasksFreeHead;
211 /** Tail of the small cache for allocated task structures for exclusive
212 * use by this endpoint. */
213 R3PTRTYPE(volatile PPDMASYNCCOMPLETIONTASK) pTasksFreeTail;
214 /** Number of elements in the cache. */
215 volatile uint32_t cTasksCached;
216 /** Start slot for the global task cache. */
217 unsigned iSlotStart;
218 /** ID of the next task to ensure consistency. */
219 volatile uint32_t uTaskIdNext;
220 /** Flag whether a wraparound occurred for the ID counter. */
221 bool fTaskIdWraparound;
222 /** Template associated with this endpoint. */
223 PPDMASYNCCOMPLETIONTEMPLATE pTemplate;
224 /** Reference count. */
225 unsigned cUsers;
226 /** URI describing the endpoint */
227 char *pszUri;
228} PDMASYNCCOMPLETIONENDPOINT;
229
230/**
231 * A PDM async completion task handle.
232 * Common data.
233 */
234typedef struct PDMASYNCCOMPLETIONTASK
235{
236 /** Next task in the list
237 * (for free and assigned tasks). */
238 R3PTRTYPE(PPDMASYNCCOMPLETIONTASK) pNext;
239 /** Previous task in the list
240 * (for free and assigned tasks). */
241 R3PTRTYPE(PPDMASYNCCOMPLETIONTASK) pPrev;
242 /** Endpoint this task is assigned to. */
243 R3PTRTYPE(PPDMASYNCCOMPLETIONENDPOINT) pEndpoint;
244 /** Opaque user data for this task. */
245 void *pvUser;
246 /** Task id. */
247 uint32_t uTaskId;
248} PDMASYNCCOMPLETIONTASK;
249
250/**
251 * Called by the endpoint if a task has finished.
252 *
253 * @returns nothing
254 * @param pTask Pointer to the finished task.
255 */
256void pdmR3AsyncCompletionCompleteTask(PPDMASYNCCOMPLETIONTASK pTask);
257
258RT_C_DECLS_END
259
260extern const PDMASYNCCOMPLETIONEPCLASSOPS g_PDMAsyncCompletionEndpointClassFile;
261
262#endif /* __PDMAsyncCompletionInternal_h */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use