Changeset 33822 in vbox for trunk/src/VBox
- Timestamp:
- Nov 7, 2010 8:25:30 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/vfs/vfsbase.cpp
r33820 r33822 184 184 185 185 186 RTDECL(uint32_t) RTVfsIoStrmRetain(RTVFSIOSTREAM hVfsIos) 187 { 188 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 189 AssertPtrReturn(pThis, UINT32_MAX); 190 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, UINT32_MAX); 191 return rtVfsRetain(&pThis->cRefs); 192 } 193 194 195 RTDECL(uint32_t) RTVfsIoStrmRelease(RTVFSIOSTREAM hVfsIos) 196 { 197 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 198 AssertPtrReturn(pThis, UINT32_MAX); 199 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, UINT32_MAX); 200 201 uint32_t cRefs = rtVfsRelease(&pThis->cRefs); 202 if (!cRefs) 203 { 204 /* 205 * That was the last reference, close the stream. 206 * 207 * This is a little bit more complicated than when releasing a file or 208 * directory handle because the I/O stream can be a sub-object and we 209 * need to get to the real one before handing it to RTMemFree. 210 */ 211 ASMAtomicWriteU32(&pThis->uMagic, RTVFSIOSTREAM_MAGIC_DEAD); 212 pThis->pOps->Obj.pfnClose(pThis->pvThis); 213 214 switch (pThis->pOps->Obj.enmType) 215 { 216 case RTVFSOBJTYPE_IOSTREAM: 217 RTMemFree(pThis); 218 break; 219 220 case RTVFSOBJTYPE_FILE: 221 { 222 RTVFSFILEINTERNAL *pThisFile = RT_FROM_MEMBER(pThis, RTVFSFILEINTERNAL, Stream); 223 ASMAtomicWriteU32(&pThisFile->uMagic, RTVFSIOSTREAM_MAGIC_DEAD); 224 RTMemFree(pThisFile); 225 break; 226 } 227 228 /* Add new I/O stream compatible handle types here. */ 229 230 default: 231 AssertMsgFailed(("%d\n", pThis->pOps->Obj.enmType)); 232 break; 233 } 234 } 235 236 return cRefs; 237 238 } 239 240 241 RTDECL(RTVFSFILE) RTVfsIoStrmToFile(RTVFSIOSTREAM hVfsIos) 242 { 243 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 244 AssertPtrReturn(pThis, NIL_RTVFSFILE); 245 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, NIL_RTVFSFILE); 246 247 if (pThis->pOps->Obj.enmType == RTVFSOBJTYPE_FILE) 248 { 249 rtVfsRetainVoid(&pThis->cRefs); 250 return RT_FROM_MEMBER(pThis, RTVFSFILEINTERNAL, Stream); 251 } 252 253 /* this is no crime, so don't assert. */ 254 return NIL_RTVFSFILE; 255 } 256 257 258 RTDECL(int) RTVfsIoStrmQueryInfo(RTVFSIOSTREAM hVfsIos, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr) 259 { 260 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 261 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 262 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 263 264 return pThis->pOps->Obj.pfnQueryInfo(pThis->pvThis, pObjInfo, enmAddAttr); 265 } 266 267 268 RTDECL(int) RTVfsIoStrmRead(RTVFSIOSTREAM hVfsIos, void *pvBuf, size_t cbToRead, size_t *pcbRead) 269 { 270 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 271 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 272 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 273 274 RTSGSEG Seg = { pvBuf, cbToRead }; 275 RTSGBUF SgBuf; 276 RTSgBufInit(&SgBuf, &Seg, 1); 277 return pThis->pOps->pfnRead(pThis->pvThis, -1 /*off*/, &SgBuf, pcbRead == NULL /*fBlocking*/, pcbRead); 278 } 279 280 281 RTDECL(int) RTVfsIoStrmWrite(RTVFSIOSTREAM hVfsIos, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten) 282 { 283 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 284 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 285 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 286 287 RTSGSEG Seg = { (void *)pvBuf, cbToWrite }; 288 RTSGBUF SgBuf; 289 RTSgBufInit(&SgBuf, &Seg, 1); 290 return pThis->pOps->pfnWrite(pThis->pvThis, -1 /*off*/, &SgBuf, pcbWritten == NULL /*fBlocking*/, pcbWritten); 291 } 292 293 294 RTDECL(int) RTVfsIoStrmSgRead(RTVFSIOSTREAM hVfsIos, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead) 295 { 296 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 297 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 298 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 299 AssertPtr(pSgBuf); 300 AssertReturn(fBlocking || VALID_PTR(pcbRead), VERR_INVALID_PARAMETER); 301 302 return pThis->pOps->pfnRead(pThis->pvThis, -1 /*off*/, pSgBuf, fBlocking, pcbRead); 303 } 304 305 306 RTDECL(int) RTVfsIoStrmSgWrite(RTVFSIOSTREAM hVfsIos, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbWritten) 307 { 308 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 309 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 310 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 311 AssertPtr(pSgBuf); 312 AssertReturn(fBlocking || VALID_PTR(pcbWritten), VERR_INVALID_PARAMETER); 313 314 return pThis->pOps->pfnWrite(pThis->pvThis, -1 /*off*/, pSgBuf, fBlocking, pcbWritten); 315 } 316 317 318 RTDECL(int) RTVfsIoStrmFlush(RTVFSIOSTREAM hVfsIos) 319 { 320 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 321 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 322 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 323 324 return pThis->pOps->pfnFlush(pThis->pvThis); 325 } 326 327 328 RTDECL(RTFOFF) RTVfsIoStrmPoll(RTVFSIOSTREAM hVfsIos, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr, 329 uint32_t *pfRetEvents) 330 { 331 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 332 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 333 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, VERR_INVALID_HANDLE); 334 335 return pThis->pOps->pfnPollOne(pThis->pvThis, fEvents, cMillies, fIntr, pfRetEvents); 336 } 337 338 339 RTDECL(RTFOFF) RTVfsIoStrmTell(RTVFSIOSTREAM hVfsIos) 340 { 341 RTVFSIOSTREAMINTERNAL *pThis = hVfsIos; 342 AssertPtrReturn(pThis, -1); 343 AssertReturn(pThis->uMagic == RTVFSIOSTREAM_MAGIC, -1); 344 345 RTFOFF off; 346 int rc = pThis->pOps->pfnTell(pThis->pvThis, &off); 347 if (RT_FAILURE(rc)) 348 off = rc; 349 return off; 350 } 351 352 353 186 354 RTDECL(int) RTVfsNewFile(PCRTVFSFILEOPS pFileOps, size_t cbInstance, uint32_t fOpen, RTVFS hVfs, 187 355 PRTVFSFILE phVfsFile, void **ppvInstance)
Note:
See TracChangeset
for help on using the changeset viewer.