VirtualBox

Ignore:
Timestamp:
Apr 26, 2013 3:19:33 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85347
Message:

Main/GuestCtrl: Use active listeners instead of passive ones because of performance reasons (untested).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h

    r45568 r45780  
    375375};
    376376
     377class GuestWaitEvent
     378{
     379public:
     380
     381    GuestWaitEvent(uint32_t mCID, const std::list<VBoxEventType_T> &lstEvents);
     382    virtual ~GuestWaitEvent(void);
     383
     384public:
     385
     386    uint32_t                         ContextID(void) { return mCID; };
     387    const ComPtr<IEvent>             Event(void) { return mEvent; };
     388    const std::list<VBoxEventType_T> Types(void) { return mEventTypes; };
     389    int                              Signal(IEvent *pEvent);
     390    int                              Wait(RTMSINTERVAL uTimeoutMS);
     391
     392protected:
     393
     394    uint32_t                   mCID;
     395    std::list<VBoxEventType_T> mEventTypes;
     396    /** The event semaphore for triggering
     397     *  the actual event. */
     398    RTSEMEVENT                 mEventSem;
     399    /** Pointer to the actual event. */
     400    ComPtr<IEvent>             mEvent;
     401};
     402typedef std::list < GuestWaitEvent* > GuestWaitEvents;
     403typedef std::map < VBoxEventType_T, GuestWaitEvents > GuestWaitEventTypes;
     404
    377405class GuestBase
    378406{
     
    385413public:
    386414
     415    /** For external event listeners. */
     416    int signalWaitEvents(VBoxEventType_T aType, IEvent *aEvent);
     417
     418public:
     419
    387420    int generateContextID(uint32_t uSessionID, uint32_t uObjectID, uint32_t *puContextID);
     421    int registerEvent(uint32_t uSessionID, uint32_t uObjectID, const std::list<VBoxEventType_T> &lstEvents, GuestWaitEvent **ppEvent);
     422    void unregisterEvent(GuestWaitEvent *pEvent);
     423    void unregisterEventListener(void);
     424    int waitForEvent(GuestWaitEvent *pEvent, uint32_t uTimeoutMS, VBoxEventType_T *pType, IEvent **ppEvent);
    388425
    389426protected:
     
    394431    /** The next upcoming context ID for this object. */
    395432    uint32_t                 mNextContextID;
     433    /** Local listener for handling the waiting events. */
     434    ComPtr<IEventListener>   mListener;
     435    /** Critical section for wait events access. */
     436    RTCRITSECT               mWaitEventCritSect;
     437    /** Map of internal events to wait for. */
     438    GuestWaitEventTypes      mWaitEvents;
    396439};
    397440
     
    420463
    421464    int bindToSession(Console *pConsole, GuestSession *pSession, uint32_t uObjectID);
     465    int registerEvent(const std::list<VBoxEventType_T> &lstEvents, GuestWaitEvent **ppEvent);
    422466    int sendCommand(uint32_t uFunction, uint32_t uParms, PVBOXHGCMSVCPARM paParms);
    423467
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