VirtualBox

Changeset 46246 in vbox


Ignore:
Timestamp:
May 23, 2013 7:15:44 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85975
Message:

Runtime/AioMgr: Bug fixes

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/include/iprt/aiomgr.h

    r45723 r46246  
    8181 * @param   phAioMgrFile      Where to store the newly created async I/O manager
    8282 *                            handle on success.
     83 * @param   pvUser            Opaque user data for this file handle.
    8384 *
    8485 * @note This function increases the reference count of the given async I/O manager
     
    8687 */
    8788RTDECL(int) RTAioMgrFileCreate(RTAIOMGR hAioMgr, RTFILE hFile, PFNRTAIOMGRREQCOMPLETE pfnReqComplete,
    88                                PRTAIOMGRFILE phAioMgrFile);
     89                               void *pvUser, PRTAIOMGRFILE phAioMgrFile);
    8990
    9091/**
     
    103104 */
    104105RTDECL(uint32_t) RTAioMgrFileRelease(RTAIOMGRFILE hAioMgrFile);
     106
     107/**
     108 * Return opaque user data passed on creation.
     109 *
     110 * @returns Opaque user data or NULL if the handle is invalid.
     111 * @param   hAioMgrFile       The file handle.
     112 */
     113RTDECL(void *) RTAioMgrFileGetUser(RTAIOMGRFILE hAioMgrFile);
    105114
    106115/**
  • TabularUnified trunk/src/VBox/Runtime/common/misc/aiomgr.cpp

    r46233 r46246  
    123123    /** Flags. */
    124124    uint32_t                      fFlags;
     125    /** Opaque user data passed on creation. */
     126    void                         *pvUser;
    125127    /** File handle. */
    126128    RTFILE                        hFile;
     
    476478
    477479        pReqsHead = (PRTAIOMGRREQ)pReqsHead->WorkItem.pNext;
    478         pReqsHead->WorkItem.pNext = NULL;
     480        pReqCur->WorkItem.pNext = NULL;
    479481        RTListAppend(&pFile->AioMgr.ListWaitingReqs, &pReqCur->NodeWaitingList);
    480482    }
     
    10031005    pThis->hMemCacheReqs = NIL_RTMEMCACHE;
    10041006    pThis->u32Magic      = ~RTAIOMGR_MAGIC;
     1007    RTCritSectDelete(&pThis->CritSectBlockingEvent);
     1008    RTSemEventDestroy(pThis->hEventSemBlock);
    10051009    RTMemFree(pThis);
    10061010}
     
    10251029{
    10261030    pThis->u32Magic = ~RTAIOMGRFILE_MAGIC;
     1031    rtAioMgrCloseFile(pThis->pAioMgr, pThis);
    10271032    RTAioMgrRelease(pThis->pAioMgr);
    10281033    RTMemFree(pThis);
     
    11221127        pThis->u32Magic = RTAIOMGR_MAGIC;
    11231128        pThis->cRefs    = 1;
     1129        pThis->enmBlockingEvent = RTAIOMGREVENT_NO_EVENT;
    11241130        RTListInit(&pThis->ListFiles);
    1125         rc = RTMemCacheCreate(&pThis->hMemCacheReqs, sizeof(RTAIOMGRREQ),
    1126                               0, UINT32_MAX, rtAioMgrReqCtor, rtAioMgrReqDtor, NULL, 0);
     1131        rc = RTCritSectInit(&pThis->CritSectBlockingEvent);
    11271132        if (RT_SUCCESS(rc))
    11281133        {
    1129             rc = RTFileAioCtxCreate(&pThis->hAioCtx, cReqsMax == UINT32_MAX
    1130                                                      ? RTFILEAIO_UNLIMITED_REQS
    1131                                                      : cReqsMax,
    1132                                     RTFILEAIOCTX_FLAGS_WAIT_WITHOUT_PENDING_REQUESTS);
     1134            rc = RTSemEventCreate(&pThis->hEventSemBlock);
    11331135            if (RT_SUCCESS(rc))
    11341136            {
    1135                 rc = RTThreadCreateF(&pThis->hThread, rtAioMgrWorker, pThis, 0, RTTHREADTYPE_IO,
    1136                                      RTTHREADFLAGS_WAITABLE, "AioMgr-%p", pThis);
     1137                rc = RTMemCacheCreate(&pThis->hMemCacheReqs, sizeof(RTAIOMGRREQ),
     1138                                      0, UINT32_MAX, rtAioMgrReqCtor, rtAioMgrReqDtor, NULL, 0);
     1139                if (RT_SUCCESS(rc))
     1140                {
     1141                    rc = RTFileAioCtxCreate(&pThis->hAioCtx, cReqsMax == UINT32_MAX
     1142                                                             ? RTFILEAIO_UNLIMITED_REQS
     1143                                                             : cReqsMax,
     1144                                            RTFILEAIOCTX_FLAGS_WAIT_WITHOUT_PENDING_REQUESTS);
     1145                    if (RT_SUCCESS(rc))
     1146                    {
     1147                        rc = RTThreadCreateF(&pThis->hThread, rtAioMgrWorker, pThis, 0, RTTHREADTYPE_IO,
     1148                                             RTTHREADFLAGS_WAITABLE, "AioMgr-%u", cReqsMax);
     1149                        if (RT_FAILURE(rc))
     1150                        {
     1151                            rc = RTFileAioCtxDestroy(pThis->hAioCtx);
     1152                            AssertRC(rc);
     1153                        }
     1154                    }
     1155
     1156                    if (RT_FAILURE(rc))
     1157                        RTMemCacheDestroy(pThis->hMemCacheReqs);
     1158                }
     1159
    11371160                if (RT_FAILURE(rc))
    1138                 {
    1139                     rc = RTFileAioCtxDestroy(pThis->hAioCtx);
    1140                     AssertRC(rc);
    1141                 }
     1161                    RTSemEventDestroy(pThis->hEventSemBlock);
    11421162            }
    11431163
    11441164            if (RT_FAILURE(rc))
    1145                 RTMemCacheDestroy(pThis->hMemCacheReqs);
     1165                RTCritSectDelete(&pThis->CritSectBlockingEvent);
    11461166        }
    11471167
     
    11861206
    11871207RTDECL(int) RTAioMgrFileCreate(RTAIOMGR hAioMgr, RTFILE hFile, PFNRTAIOMGRREQCOMPLETE pfnReqComplete,
    1188                                PRTAIOMGRFILE phAioMgrFile)
     1208                               void *pvUser, PRTAIOMGRFILE phAioMgrFile)
    11891209{
    11901210    int rc = VINF_SUCCESS;
     
    12031223        pThis->hFile    = hFile;
    12041224        pThis->pAioMgr  = hAioMgr;
     1225        pThis->pvUser   = pvUser;
    12051226        pThis->pfnReqCompleted = pfnReqComplete;
    12061227        RTQueueAtomicInit(&pThis->QueueReqs);
     1228        RTListInit(&pThis->AioMgr.ListWaitingReqs);
    12071229        RTAioMgrRetain(hAioMgr);
    12081230        rc = RTFileAioCtxAssociateWithFile(pThis->pAioMgr->hAioCtx, hFile);
    12091231        if (RT_FAILURE(rc))
    12101232            rtAioMgrFileDestroy(pThis);
     1233        else
     1234            rtAioMgrAddFile(pThis->pAioMgr, pThis);
    12111235    }
    12121236    else
     
    12461270}
    12471271
     1272RTDECL(void *) RTAioMgrFileGetUser(RTAIOMGRFILE hAioMgrFile)
     1273{
     1274    PRTAIOMGRFILEINT pThis = hAioMgrFile;
     1275
     1276    AssertPtrReturn(pThis, NULL);
     1277    return pThis->pvUser;
     1278}
     1279
    12481280RTDECL(int) RTAioMgrFileRead(RTAIOMGRFILE hAioMgrFile, RTFOFF off,
    12491281                             PRTSGBUF pSgBuf, size_t cbRead, void *pvUser)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette