PDMAsyncCompletionFileFailsafe.cpp revision 1d650736ebf4152a341805561a3a86d79769171b
/* $Id$ */
/** @file
* PDM Async I/O - Transport data asynchronous in R3 using EMT.
* Failsafe File I/O manager.
*/
/*
* 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.
*/
#include "PDMAsyncCompletionFileInternal.h"
{
int rc = VINF_SUCCESS;
while (pTasks)
{
switch (pTaskFile->enmTransferType)
{
{
break;
}
{
do
{
{
NULL);
}
else
{
NULL);
}
/* Free the segment. */
AssertMsg(offCurr == (pTaskFile->u.DataTransfer.off + (RTFOFF)pTaskFile->u.DataTransfer.cbTransfer),
("Incomplete transfer %llu bytes requested offCurr=%llu rc=%Rrc\n",
break;
}
default:
}
/* Notify task owner */
}
return rc;
}
/**
* A fallback method in case something goes wrong with the normal
* I/O manager.
*/
{
int rc = VINF_SUCCESS;
{
{
}
/* Process endpoint events first. */
while (pEndpoint)
{
}
/* Now check for an external blocking event. */
if (pAioMgr->fBlockingEventPending)
{
switch (pAioMgr->enmBlockingEvent)
{
{
if (pAioMgr->pEndpointsHead)
break;
}
{
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointRemove = pAioMgr->BlockingEventData.RemoveEndpoint.pEndpoint;
if (pPrev)
else
if (pNext)
break;
}
{
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointClose = pAioMgr->BlockingEventData.CloseEndpoint.pEndpoint;
/* Make sure all tasks finished. */
}
break;
break;
default:
}
/* Release the waiting thread. */
}
}
return rc;
}