VirtualBox

Changeset 28297 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Apr 14, 2010 12:17:11 PM (15 years ago)
Author:
vboxsync
Message:

Guest Control: Update (update on contexts for callbacks).

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/GuestImpl.cpp

    r28288 r28297  
    109109{
    110110    LogFlowThisFunc(("\n"));
     111
     112#ifdef VBOX_WITH_GUEST_CONTROL
     113    /* Clean up callback data. */
     114    CallbackListIter it;
     115    for (it = mCallbackList.begin(); it != mCallbackList.end(); it++)
     116        removeCtrlCallbackContext(it);
     117#endif
    111118
    112119    /* Enclose the state transition Ready->InUninit->NotReady */
     
    487494    int rc = VINF_SUCCESS;
    488495
    489   /*  bool bFound = false;
    490     for (int i=0; i<mList.size(); i++)
    491     {
    492     }
    493     if(pData->hdr.u32ContextID == it->hdr.u32ContextID)
    494     {
    495     }*/
    496     /*pExt->pid = pCBData->pid;
    497     pExt->status = pCBData->status;
    498     pExt->flags = pCBData->flags;*/
    499     /** @todo Copy void* buffer! */
    500 
     496    AssertPtr(pData);
     497    CallbackListIter it = getCtrlCallbackContext(pData->hdr.u32ContextID);
     498    if (it != mCallbackList.end())
     499    {
     500        PHOSTEXECCALLBACKDATA pCBData = (HOSTEXECCALLBACKDATA*)it->pvData;
     501        AssertPtr(pCBData);
     502
     503        pCBData->u32PID = pData->u32PID;
     504        pCBData->u32Status = pData->u32Status;
     505        pCBData->u32Flags = pData->u32Flags;
     506        /* @todo Copy void* buffer contents! */
     507
     508        ASMAtomicWriteBool(&it->bCalled, true);
     509    }
    501510    return rc;
    502511}
    503512
    504 void Guest::freeCtrlCallbackContextData(CallbackContext *pContext)
    505 {
    506     AssertPtr(pContext);
    507     if (pContext->cbData)
    508     {
    509         RTMemFree(pContext->pvData);
    510         pContext->cbData = 0;
    511         pContext->pvData = NULL;
    512     }
     513Guest::CallbackListIter Guest::getCtrlCallbackContext(uint32_t u32ContextID)
     514{
     515    CallbackListIter it;
     516    for (it = mCallbackList.begin(); it != mCallbackList.end(); it++)
     517    {
     518        if (it->mContextID == u32ContextID)
     519            return (it);
     520    }
     521    return it;
     522}
     523
     524void Guest::removeCtrlCallbackContext(Guest::CallbackListIter it)
     525{
     526    if (it->cbData)
     527    {
     528        RTMemFree(it->pvData);
     529        it->cbData = 0;
     530        it->pvData = NULL;
     531    }
     532    mCallbackList.erase(it);
    513533}
    514534
     
    520540    CallbackContext context;
    521541    context.mContextID = uNewContext;
     542    context.bCalled = false;
    522543    context.pvData = pvData;
    523544    context.cbData = cbData;
    524545
    525546    mCallbackList.push_back(context);
    526     if (mCallbackList.size() > 256)
    527     {
    528         freeCtrlCallbackContextData(&mCallbackList.front());
    529         mCallbackList.pop_front();
    530     }
     547    if (mCallbackList.size() > 256) /* Don't let the container size get too big! */
     548        removeCtrlCallbackContext(mCallbackList.begin());
     549
    531550    return uNewContext;
    532551}
     
    592611        if (RT_SUCCESS(vrc))
    593612        {
     613            uint32_t uContextID = 0;
     614
    594615            char *pszArgs = NULL;
    595616            if (uNumArgs > 0)
     
    623644                    PHOSTEXECCALLBACKDATA pData = (HOSTEXECCALLBACKDATA*)RTMemAlloc(sizeof(HOSTEXECCALLBACKDATA));
    624645                    AssertPtr(pData);
    625                     uint32_t uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECCALLBACKDATA));
     646                    uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECCALLBACKDATA));
     647                    Assert(uContextID > 0);
    626648
    627649                    VBOXHGCMSVCPARM paParms[15];
     
    664686                 * get the PID.
    665687                 */
    666 #if 0
     688                CallbackListIter it = getCtrlCallbackContext(uContextID);
    667689                uint64_t u64Started = RTTimeMilliTS();
    668690                do
     
    679701                    }
    680702                    RTThreadSleep(100);
    681                 } while (!callbackData.called);
     703                } while (it != mCallbackList.end() && !it->bCalled);
    682704
    683705                /* Did we get some status? */
    684                 if (callbackData.called)
     706                PHOSTEXECCALLBACKDATA pData = (HOSTEXECCALLBACKDATA*)it->pvData;
     707                Assert(it->cbData, sizeof(HOSTEXECCALLBACKDATA));
     708                AssertPtr(pData);
     709                if (it->bCalled)
    685710                {
    686                     switch (callbackData.status)
     711                    switch (pData->u32Status)
    687712                    {
    688713                        case PROC_STS_STARTED:
    689                             *aPID = callbackData.pid;
     714                            *aPID = pData->u32PID;
    690715                            break;
    691716
    692717                        case PROC_STS_ERROR:
    693                             vrc = callbackData.flags; /* flags member contains IPRT error code. */
     718                            vrc = pData->u32Flags; /* u32Flags member contains IPRT error code. */
    694719                            break;
    695720
     
    699724                    }
    700725                }
     726                removeCtrlCallbackContext(it);
    701727
    702728                if (RT_FAILURE(vrc))
     
    713739                    }
    714740                }
    715 #endif
    716741#if 0
    717742                progress.queryInterfaceTo(aProgress);
  • trunk/src/VBox/Main/include/GuestImpl.h

    r28286 r28297  
    118118
    119119# ifdef VBOX_WITH_GUEST_CONTROL
    120 
    121120    struct CallbackContext
    122121    {
    123         uint32_t  mContextID;
    124         void     *pvData;
    125         uint32_t  cbData;
     122        uint32_t        mContextID;
     123        void           *pvData;
     124        uint32_t        cbData;
     125        /** Atomic flag whether callback was called. */
     126        volatile bool   bCalled;
    126127    };
     128    typedef std::list< CallbackContext > CallbackList;
     129    typedef std::list< CallbackContext >::iterator CallbackListIter;
     130    typedef std::list< CallbackContext >::const_iterator CallbackListIterConst;
    127131
    128132    int prepareExecuteArgs(const char *pszArgs, void **ppvList, uint32_t *pcbList, uint32_t *pcArgs);
     
    130134    /** Handler for guest execution control notifications. */
    131135    int notifyCtrlExec(uint32_t u32Function, PHOSTEXECCALLBACKDATA pData);
    132     void freeCtrlCallbackContextData(CallbackContext *pContext);
     136    CallbackListIter getCtrlCallbackContext(uint32_t u32ContextID);
     137    void removeCtrlCallbackContext(CallbackListIter it);
    133138    uint32_t addCtrlCallbackContext(void *pvData, uint32_t cbData);
    134139# endif
     
    158163       
    159164    volatile uint32_t mNextContextID;
    160     typedef std::list< CallbackContext > CallbackList;
    161165    CallbackList mCallbackList;
    162166# endif
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