VirtualBox

Changeset 28772 in vbox


Ignore:
Timestamp:
Apr 26, 2010 5:13:39 PM (15 years ago)
Author:
vboxsync
Message:

Guest Control/Main: Added local process list, added early implementation of IGuest::GetProcessStatus().

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/GuestControlSvc.h

    r28557 r28772  
    124124};
    125125
     126enum eVBoxGuestCtrlCallbackType
     127{
     128    VBOXGUESTCTRLCALLBACKTYPE_UNKNOWN = 0,
     129    VBOXGUESTCTRLCALLBACKTYPE_EXEC_START = 1,
     130    VBOXGUESTCTRLCALLBACKTYPE_EXEC_OUTPUT = 2
     131};
     132
    126133/**
    127134 * The service functions which are callable by host.
  • trunk/src/VBox/Main/GuestImpl.cpp

    r28728 r28772  
    117117    for (it = mCallbackList.begin(); it != mCallbackList.end(); it++)
    118118        removeCtrlCallbackContext(it);
     119
     120    /* Clear process list. */
     121    mGuestProcessList.clear();
    119122#endif
    120123
     
    518521        }
    519522
     523        /* Handle process list. */
     524        /** @todo What happens on/deal with PID reuse? */
     525        /** @todo How to deal with multiple updates at once? */
     526        GuestProcessIter it_proc = getProcessByPID(pCBData->u32PID);
     527        if (it_proc == mGuestProcessList.end())
     528        {
     529            /* Not found, add to list. */
     530            GuestProcess p;
     531            p.mPID = pCBData->u32PID;
     532            p.mStatus = pCBData->u32Status;
     533            //p.mReason = pCBData->u32Reason;
     534            p.mExitCode = pCBData->u32Flags; /* Contains exit code. */
     535           
     536            mGuestProcessList.push_back(p);
     537        }
     538        else /* Update list. */
     539        {
     540            it_proc->mStatus = pCBData->u32Status;
     541            //it_proc->mReason = pCBData->u32Reason;
     542            it_proc->mExitCode = pCBData->u32Flags; /* Contains exit code. */
     543        }
     544
    520545        if (   !it->pProgress.isNull()
    521546            && errMsg.length())
     
    591616}
    592617
    593 Guest::CallbackListIter Guest::getCtrlCallbackContextByPID(uint32_t u32PID)
     618Guest::GuestProcessIter Guest::getProcessByPID(uint32_t u32PID)
    594619{
    595620    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
    596621
    597622    /** @todo Maybe use a map instead of list for fast context lookup. */
    598     CallbackListIter it;
    599     for (it = mCallbackList.begin(); it != mCallbackList.end(); it++)
    600     {
    601         PHOSTEXECCALLBACKDATA pCBData = (HOSTEXECCALLBACKDATA*)it->pvData;
    602         if (pCBData && pCBData->u32PID == u32PID)
     623    GuestProcessIter it;
     624    for (it = mGuestProcessList.begin(); it != mGuestProcessList.end(); it++)
     625    {
     626        if (it->mPID == u32PID)
    603627            return (it);
    604628    }
     
    630654 * to the callback list. A callback is identified by a unique context ID which is used
    631655 * to identify a callback from the guest side. */
    632 uint32_t Guest::addCtrlCallbackContext(void *pvData, uint32_t cbData, Progress *pProgress)
     656uint32_t Guest::addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress *pProgress)
    633657{
    634658    LogFlowFuncEnter();
     
    640664    CallbackContext context;
    641665    context.mContextID = uNewContext;
     666    context.mType = enmType;
    642667    context.bCalled = false;
    643668    context.pvData = pvData;
     
    755780                    PHOSTEXECCALLBACKDATA pData = (HOSTEXECCALLBACKDATA*)RTMemAlloc(sizeof(HOSTEXECCALLBACKDATA));
    756781                    AssertPtr(pData);
    757                     uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECCALLBACKDATA), progress);
     782                    uContextID = addCtrlCallbackContext(VBOXGUESTCTRLCALLBACKTYPE_EXEC_START,
     783                                                        pData, sizeof(HOSTEXECCALLBACKDATA), progress);
    758784                    Assert(uContextID > 0);
    759785
     
    952978    /* Search for existing PID. */
    953979    PHOSTEXECOUTCALLBACKDATA pData = (HOSTEXECOUTCALLBACKDATA*)RTMemAlloc(sizeof(HOSTEXECOUTCALLBACKDATA));
    954     uint32_t uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECOUTCALLBACKDATA), NULL /* pProgress */);
     980    uint32_t uContextID = addCtrlCallbackContext(VBOXGUESTCTRLCALLBACKTYPE_EXEC_OUTPUT,
     981                                                 pData, sizeof(HOSTEXECOUTCALLBACKDATA), NULL /* pProgress */);
    955982    Assert(uContextID > 0);
    956983
     
    10411068}
    10421069
     1070STDMETHODIMP Guest::GetProcessStatus(ULONG aPID, ULONG *aReason, ULONG *aExitCode, ULONG *aStatus)
     1071{
     1072#ifndef VBOX_WITH_GUEST_CONTROL
     1073    ReturnComNotImplemented();
     1074#else  /* VBOX_WITH_GUEST_CONTROL */
     1075    using namespace guestControl;
     1076
     1077    HRESULT rc = S_OK;
     1078
     1079    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     1080
     1081    GuestProcessIterConst it;
     1082    for (it = mGuestProcessList.begin(); it != mGuestProcessList.end(); it++)
     1083    {
     1084        if (it->mPID == aPID)
     1085            break;
     1086    }
     1087
     1088    if (it != mGuestProcessList.end())
     1089    {
     1090        *aReason = it->mReason;
     1091        *aExitCode = it->mExitCode;
     1092        *aStatus = it->mStatus;
     1093    }
     1094    else
     1095        rc = setError(VBOX_E_IPRT_ERROR,
     1096                      tr("Process (PID %u) not found!"), aPID);
     1097    return rc;
     1098#endif
     1099}
     1100
    10431101// public methods only for internal purposes
    10441102/////////////////////////////////////////////////////////////////////////////
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r28764 r28772  
    83798379  <interface
    83808380     name="IGuest" extends="$unknown"
    8381      uuid="4b8f90ce-e8ef-4f07-af1b-b0b85bc07e37"
     8381     uuid="a772d41d-8f60-4247-9a0e-fea7ebec2151"
    83828382     wsmap="managed"
    83838383     >
     
    86348634        </desc>
    86358635      </param>
     8636    </method>
     8637
     8638    <method name="getProcessStatus">
     8639      <desc>
     8640        Retrieves status, exit code and the exit reason of a formerly started process.
     8641
     8642        <result name="VBOX_E_IPRT_ERROR">
     8643          Process with specified PID was not found.
     8644        </result>
     8645
     8646      </desc>
     8647      <param name="pid" type="unsigned long" dir="in">
     8648        <desc>
     8649          Process id returned by earlier executeProcess() call.
     8650        </desc>
     8651      </param>
     8652      <param name="reason" type="unsigned long" dir="out">
     8653        <desc>
     8654          The reason of exit.
     8655        </desc>
     8656      </param>
     8657      <param name="exitcode" type="unsigned long" dir="out">
     8658        <desc>
     8659          The actual exit code.
     8660        </desc>
     8661      </param>
     8662      <param name="status" type="unsigned long" dir="return">
     8663        <desc>
     8664          The current process status.
     8665        </desc>
     8666      </param>     
    86368667    </method>
    86378668
  • trunk/src/VBox/Main/include/GuestImpl.h

    r28641 r28772  
    9696                              IN_BSTR aStdIn, IN_BSTR aStdOut, IN_BSTR aStdErr,
    9797                              IN_BSTR aUserName, IN_BSTR aPassword,
    98                               ULONG aTimeoutMS, ULONG* aPID, IProgress **aProgress);
     98                              ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress);
    9999    STDMETHOD(GetProcessOutput)(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, ULONG64 aSize, ComSafeArrayOut(BYTE, aData));
     100    STDMETHOD(GetProcessStatus)(ULONG aPID, ULONG *aReason, ULONG *aExitCode, ULONG *aStatus);
    100101    STDMETHOD(InternalGetStatistics)(ULONG *aCpuUser, ULONG *aCpuKernel, ULONG *aCpuIdle,
    101102                                     ULONG *aMemTotal, ULONG *aMemFree, ULONG *aMemBalloon, ULONG *aMemCache,
     
    124125    struct CallbackContext
    125126    {
    126         uint32_t            mContextID;
    127         void               *pvData;
    128         uint32_t            cbData;
     127        uint32_t                    mContextID;
     128        eVBoxGuestCtrlCallbackType  mType;
     129        void                       *pvData;
     130        uint32_t                    cbData;
    129131        /** Atomic flag whether callback was called. */
    130         volatile bool       bCalled;
     132        volatile bool               bCalled;
    131133        /** Pointer to user-supplied IProgress. */
    132         ComObjPtr<Progress> pProgress;
     134        ComObjPtr<Progress>         pProgress;
    133135    };
    134136    typedef std::list< CallbackContext > CallbackList;
    135137    typedef std::list< CallbackContext >::iterator CallbackListIter;
    136138    typedef std::list< CallbackContext >::const_iterator CallbackListIterConst;
     139
     140    struct GuestProcess
     141    {
     142        uint32_t                 mPID;
     143        uint32_t                 mStatus;
     144        uint32_t                 mReason;
     145        uint32_t                 mExitCode;
     146    };
     147    typedef std::list< GuestProcess > GuestProcessList;
     148    typedef std::list< GuestProcess >::iterator GuestProcessIter;
     149    typedef std::list< GuestProcess >::const_iterator GuestProcessIterConst;
    137150
    138151    int prepareExecuteEnv(const char *pszEnv, void **ppvList, uint32_t *pcbList, uint32_t *pcEnv);
     
    141154    int notifyCtrlExecOut(uint32_t u32Function, PHOSTEXECOUTCALLBACKDATA pData);
    142155    CallbackListIter getCtrlCallbackContextByID(uint32_t u32ContextID);
    143     CallbackListIter getCtrlCallbackContextByPID(uint32_t u32PID);
     156    GuestProcessIter getProcessByPID(uint32_t u32PID);
    144157    void removeCtrlCallbackContext(CallbackListIter it);
    145     uint32_t addCtrlCallbackContext(void *pvData, uint32_t cbData, Progress* pProgress);
     158    uint32_t addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress* pProgress);
    146159# endif
    147160
     
    171184    volatile uint32_t mNextContextID;
    172185    CallbackList mCallbackList;
     186    GuestProcessList mGuestProcessList;
    173187# endif
    174188};
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