VirtualBox

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


Ignore:
Timestamp:
Jun 8, 2019 3:05:03 AM (6 years ago)
Author:
vboxsync
Message:

Main/GuestImpl: Added OnGuestAdditionsStatusChanged event so the validation kit can more efficiently wait on GAs to come online. bugref:9151

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r79047 r79050  
    2365723657      </desc>
    2365823658    </const>
    23659     <const name="OnGuestMonitorInfoChanged" value="101">
     23659    <const name="OnGuestAdditionsStatusChanged" value="101">
     23660      <desc>
     23661        See <link to="IGuestAdditionsStatusChangedEvent">IGuestAdditionsStatusChangedEvent</link>.
     23662      </desc>
     23663    </const>
     23664    <const name="OnGuestMonitorInfoChanged" value="102">
    2366023665      <desc>
    2366123666        See <link to="IGuestMonitorInfoChangedEvent">IGuestMonitorInfoChangedEvent</link>.
    2366223667      </desc>
    2366323668    </const>
    23664     <!-- Last event marker -->
    23665     <const name="Last" value="102">
     23669    <!-- End event marker -->
     23670    <!-- @todo rename to 'End' as it is exclusive (we use 'last' to be inclusive). -->
     23671    <const name="Last" value="103">
    2366623672      <desc>
    2366723673        Must be last event, used for iterations and structures relying on numerical event values.
     
    2576025766
    2576125767  <interface
     25768    name="IGuestAdditionsStatusChangedEvent" extends="IEvent"
     25769    uuid="fd1a34ad-0b74-4e2b-ed0f-46222de8a883"
     25770    wsmap="managed" autogen="VBoxEvent" id="OnGuestAdditionsStatusChanged">
     25771    <desc>The guest addition status changed.</desc>
     25772
     25773    <attribute name="facility" type="AdditionsFacilityType" dir="in">
     25774      <desc>Facility this event relates to.</desc>
     25775    </attribute>
     25776    <attribute name="status" type="AdditionsFacilityStatus" readonly="yes">
     25777      <desc>The new facility status.</desc>
     25778    </attribute>
     25779    <attribute name="runLevel" type="AdditionsRunLevelType" readonly="yes">
     25780      <desc>The new run level.</desc>
     25781    </attribute>
     25782    <attribute name="timestamp" type="long long" readonly="yes">
     25783      <desc>The millisecond timestamp associated with the event.</desc>
     25784    </attribute>
     25785  </interface>
     25786
     25787  <interface
    2576225788    name="IGuestMonitorInfoChangedEvent" extends="IEvent"
    2576325789    uuid="0b3cdeb2-808e-11e9-b773-133d9330f849"
     
    2576925795    </attribute>
    2577025796  </interface>
    25771 
    2577225797
    2577325798  <!--
  • trunk/src/VBox/Main/include/AdditionsFacilityImpl.h

    r76562 r79050  
    6565    AdditionsFacilityStatus_T i_getStatus() const;
    6666    AdditionsFacilityType_T i_getType() const;
    67     void i_update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
     67    bool i_update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
    6868
    6969private:
  • trunk/src/VBox/Main/include/GuestImpl.h

    r76562 r79050  
    9090    void i_setAdditionsInfo2(uint32_t a_uFullVersion, const char *a_pszName, uint32_t a_uRevision, uint32_t a_fFeatures);
    9191    bool i_facilityIsActive(VBoxGuestFacilityType enmFacility);
    92     void i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
     92    bool i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
    9393                          uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
    9494    ComObjPtr<Console> i_getConsole(void) { return mParent; }
  • trunk/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp

    r76553 r79050  
    205205/**
    206206 * Method used by IGuest::facilityUpdate to make updates.
    207  */
    208 void AdditionsFacility::i_update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS)
    209 {
     207 *
     208 * @returns change indicator.
     209 */
     210bool AdditionsFacility::i_update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS)
     211{
     212    bool const fChanged = mData.mStates.size() == 0
     213                       || mData.mStates.back().mStatus != a_enmStatus;
     214
    210215    FacilityState state;
    211216    state.mStatus    = a_enmStatus;
     
    216221    if (mData.mStates.size() > 10) /* Only keep the last 10 states. */
    217222        mData.mStates.erase(mData.mStates.begin());
    218 }
    219 
     223
     224    return fChanged;
     225}
     226
  • trunk/src/VBox/Main/src-client/GuestImpl.cpp

    r78234 r79050  
    864864    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    865865
    866 
    867866    /*
    868867     * Note: The Guest Additions API (interface) version is deprecated
     
    899898             * interface version.
    900899             */
    901             i_facilityUpdate(VBoxGuestFacilityType_Graphics, VBoxGuestFacilityStatus_Active,  0 /*fFlags*/, &TimeSpecTS);
     900            i_facilityUpdate(VBoxGuestFacilityType_Graphics, VBoxGuestFacilityStatus_Active, 0 /*fFlags*/, &TimeSpecTS);
    902901        }
    903902    }
     
    931930    mData.mOSType = aOsType;
    932931    mData.mOSTypeId = Global::OSTypeId(aOsType);
     932
     933    /*
     934     * Always fire an event here.
     935     */
     936    AdditionsRunLevelType_T const enmRunLevel = mData.mAdditionsRunLevel;
     937    alock.release();
     938    fireGuestAdditionsStatusChangedEvent(mEventSource, AdditionsFacilityType_None, AdditionsFacilityStatus_Active,
     939                                         enmRunLevel, RTTimeSpecGetMilli(&TimeSpecTS));
    933940}
    934941
     
    989996}
    990997
    991 void Guest::i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
     998bool Guest::i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
    992999                             uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS)
    9931000{
    994     AssertReturnVoid(   a_enmFacility < VBoxGuestFacilityType_All
    995                      && a_enmFacility > VBoxGuestFacilityType_Unknown);
    996 
     1001    AssertReturn(   a_enmFacility < VBoxGuestFacilityType_All
     1002                 && a_enmFacility > VBoxGuestFacilityType_Unknown, false);
     1003
     1004    bool fChanged;
    9971005    FacilityMapIter it = mData.mFacilityMap.find((AdditionsFacilityType_T)a_enmFacility);
    9981006    if (it != mData.mFacilityMap.end())
    9991007    {
    10001008        AdditionsFacility *pFac = it->second;
    1001         pFac->i_update((AdditionsFacilityStatus_T)a_enmStatus, a_fFlags, a_pTimeSpecTS);
     1009        fChanged = pFac->i_update((AdditionsFacilityStatus_T)a_enmStatus, a_fFlags, a_pTimeSpecTS);
    10021010    }
    10031011    else
     
    10071015            /* The easy way out for now. We could automatically destroy
    10081016               inactive facilities like VMMDev does if we like... */
    1009             AssertFailedReturnVoid();
     1017            AssertFailedReturn(false);
    10101018        }
    10111019
    10121020        ComObjPtr<AdditionsFacility> ptrFac;
    10131021        ptrFac.createObject();
    1014         AssertReturnVoid(!ptrFac.isNull());
     1022        AssertReturn(!ptrFac.isNull(), false);
    10151023
    10161024        HRESULT hrc = ptrFac->init(this, (AdditionsFacilityType_T)a_enmFacility, (AdditionsFacilityStatus_T)a_enmStatus,
    10171025                                   a_fFlags, a_pTimeSpecTS);
    1018         if (SUCCEEDED(hrc))
    1019             mData.mFacilityMap.insert(std::make_pair((AdditionsFacilityType_T)a_enmFacility, ptrFac));
    1020     }
     1026        AssertComRCReturn(hrc, false);
     1027        mData.mFacilityMap.insert(std::make_pair((AdditionsFacilityType_T)a_enmFacility, ptrFac));
     1028        fChanged = true;
     1029    }
     1030    return fChanged;
    10211031}
    10221032
     
    10741084     * Set a specific facility status.
    10751085     */
     1086    bool fFireEvent = false;
    10761087    if (a_enmFacility == VBoxGuestFacilityType_All)
    10771088        for (FacilityMapIter it = mData.mFacilityMap.begin(); it != mData.mFacilityMap.end(); ++it)
    1078             i_facilityUpdate((VBoxGuestFacilityType)it->first, a_enmStatus, a_fFlags, a_pTimeSpecTS);
     1089            fFireEvent |= i_facilityUpdate((VBoxGuestFacilityType)it->first, a_enmStatus, a_fFlags, a_pTimeSpecTS);
    10791090    else /* Update one facility only. */
    1080         i_facilityUpdate(a_enmFacility, a_enmStatus, a_fFlags, a_pTimeSpecTS);
     1091        fFireEvent = i_facilityUpdate(a_enmFacility, a_enmStatus, a_fFlags, a_pTimeSpecTS);
    10811092
    10821093    /*
    10831094     * Recalc the runlevel.
    10841095     */
     1096    AdditionsRunLevelType_T const enmOldRunLevel = mData.mAdditionsRunLevel;
    10851097    if (i_facilityIsActive(VBoxGuestFacilityType_VBoxTrayClient))
    10861098        mData.mAdditionsRunLevel = AdditionsRunLevelType_Desktop;
     
    10911103    else
    10921104        mData.mAdditionsRunLevel = AdditionsRunLevelType_None;
     1105
     1106    /*
     1107     * Fire event if something actually changed.
     1108     */
     1109    AdditionsRunLevelType_T const enmNewRunLevel = mData.mAdditionsRunLevel;
     1110    if (fFireEvent || enmNewRunLevel != enmOldRunLevel)
     1111    {
     1112        alock.release();
     1113        fireGuestAdditionsStatusChangedEvent(mEventSource, (AdditionsFacilityType_T)a_enmFacility,
     1114                                             (AdditionsFacilityStatus_T)a_enmStatus, enmNewRunLevel,
     1115                                             RTTimeSpecGetMilli(a_pTimeSpecTS));
     1116    }
    10931117}
    10941118
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