VirtualBox

Changeset 23340 in vbox for trunk


Ignore:
Timestamp:
Sep 25, 2009 3:43:24 PM (15 years ago)
Author:
vboxsync
Message:

AIO/Posix: Fix assertion on Darwin. AIO_LISTIO_MAX is defined with 16 there and if cReqs in RTFileAioCtxSubmit is greater than this it will hit this assertion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/posix/fileaio-posix.cpp

    r20961 r23340  
    421421    AssertPtrReturn(phAioCtx, VERR_INVALID_POINTER);
    422422
     423    if (cAioReqsMax == RTFILEAIO_UNLIMITED_REQS)
     424        return VERR_OUT_OF_RANGE;
     425
    423426    pCtxInt = (PRTFILEAIOCTXINTERNAL)RTMemAllocZ(  sizeof(RTFILEAIOCTXINTERNAL)
    424427                                                 + cAioReqsMax * sizeof(PRTFILEAIOREQINTERNAL));
     
    591594        }
    592595
    593         /* Check if we have a flush request now. */
     596        /*
     597         * Check if we have a flush request now.
     598         * If not we hit the AIO_LISTIO_MAX limit
     599         * and will continue submitting requests
     600         * above.
     601         */
    594602        if (cReqs)
    595603        {
     
    597605            RTFILEAIOREQ_VALID_RETURN(pReqInt);
    598606
    599             Assert(pReqInt->fFlush);
    600 
    601             /*
    602              * lio_listio does not work with flush requests so
    603              * we have to use aio_fsync directly.
    604              */
    605             rcPosix = aio_fsync(O_SYNC, &pReqInt->AioCB);
    606             if (RT_UNLIKELY(rcPosix < 0))
     607
     608            if (pReqInt->fFlush)
    607609            {
    608                 rc = RTErrConvertFromErrno(errno);
    609                 RTFILEAIOREQ_SET_STATE(pReqInt, COMPLETED);
    610                 pReqInt->Rc = rc;
    611                 pReqInt->cbTransfered = 0;
    612 
    613                 /* Unlink from the list. */
    614                 PRTFILEAIOREQINTERNAL pNext, pPrev;
    615                 pNext = pReqInt->pNext;
    616                 pPrev = pReqInt->pPrev;
    617                 if (pNext)
    618                     pNext->pPrev = pPrev;
    619                 if (pPrev)
    620                     pPrev->pNext = pNext;
    621                 else
    622                     pHead = pNext;
    623                 break;
     610                /*
     611                 * lio_listio does not work with flush requests so
     612                 * we have to use aio_fsync directly.
     613                 */
     614                rcPosix = aio_fsync(O_SYNC, &pReqInt->AioCB);
     615                if (RT_UNLIKELY(rcPosix < 0))
     616                {
     617                    rc = RTErrConvertFromErrno(errno);
     618                    RTFILEAIOREQ_SET_STATE(pReqInt, COMPLETED);
     619                    pReqInt->Rc = rc;
     620                    pReqInt->cbTransfered = 0;
     621
     622                    /* Unlink from the list. */
     623                    PRTFILEAIOREQINTERNAL pNext, pPrev;
     624                    pNext = pReqInt->pNext;
     625                    pPrev = pReqInt->pPrev;
     626                    if (pNext)
     627                        pNext->pPrev = pPrev;
     628                    if (pPrev)
     629                        pPrev->pNext = pNext;
     630                    else
     631                        pHead = pNext;
     632                    break;
     633                }
     634
     635                ASMAtomicIncS32(&pCtxInt->cRequests);
     636                cReqs--;
     637                pahReqs++;
    624638            }
    625 
    626             ASMAtomicIncS32(&pCtxInt->cRequests);
    627             cReqs--;
    628             pahReqs++;
    629639        }
    630640    } while (cReqs);
Note: See TracChangeset for help on using the changeset viewer.

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