VirtualBox

Changeset 41642 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Jun 11, 2012 10:30:54 AM (13 years ago)
Author:
vboxsync
Message:

VBoxGuest: Use the EventSpinlock when setting the mouse callback and made the ISR take down the callback info while owning that spinlock. Cleanups.

Location:
trunk/src/VBox/Additions/common/VBoxGuest
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp

    r40198 r41642  
    843843    switch (uCmd)
    844844    {
    845         case VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK:
     845        case VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK:
    846846        {
    847847            PVOID pvBuf = pStack->Parameters.Others.Argument1;
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

    r41640 r41642  
    727727        pDevExt->acMouseFeatureUsage[i] = 0;
    728728    pDevExt->fMouseStatus = 0;
    729     pDevExt->MouseSetNotifyCallback.pfnNotify = NULL;
    730     pDevExt->MouseSetNotifyCallback.pvNotify = NULL;
     729    pDevExt->MouseNotifyCallback.pfnNotify = NULL;
     730    pDevExt->MouseNotifyCallback.pvUser = NULL;
    731731    pDevExt->cISR = 0;
    732732
     
    12481248{
    12491249    Log(("VBoxGuestCommonIOCtl: SET_MOUSE_NOTIFY_CALLBACK\n"));
    1250     RTSpinlockAcquire(pDevExt->SessionSpinlock);
    1251     ASMAtomicWriteNullPtr(&pDevExt->MouseSetNotifyCallback.pfnNotify);
    1252     pDevExt->MouseSetNotifyCallback.pvNotify = pNotify->pvNotify;
    1253     ASMAtomicWritePtr(&pDevExt->MouseSetNotifyCallback.pfnNotify,
    1254                       pNotify->pfnNotify);
    1255     RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
    1256     /* Make sure no one is referencing the old data - hacky but should be
     1250
     1251    RTSpinlockAcquire(pDevExt->EventSpinlock);
     1252    pDevExt->MouseNotifyCallback = *pNotify;
     1253    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
     1254
     1255    /* Make sure an active ISR is referencing the old data - hacky but should be
    12571256     * effective. */
    1258     while (pDevExt->cISR > 0);
     1257    while (pDevExt->cISR > 0)
     1258        ASMNopPause();
     1259
    12591260    return VINF_SUCCESS;
    12601261}
     
    25402541
    25412542#ifndef RT_OS_WINDOWS  /* Windows has its own implementation of this. */
    2542             case VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK:
     2543            case VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK:
    25432544                CHECKRET_RING0("SET_MOUSE_NOTIFY_CALLBACK");
    2544                 CHECKRET_SIZE("SET_MOUSE_NOTIFY_CALLBACK",
    2545                            sizeof(VBoxGuestMouseSetNotifyCallback));
     2545                CHECKRET_SIZE("SET_MOUSE_NOTIFY_CALLBACK", sizeof(VBoxGuestMouseSetNotifyCallback));
    25462546                rc = VBoxGuestCommonIOCtl_SetMouseNotifyCallback(pDevExt, (VBoxGuestMouseSetNotifyCallback *)pvData);
    25472547                break;
     
    26392639bool VBoxGuestCommonISR(PVBOXGUESTDEVEXT pDevExt)
    26402640{
    2641     bool                    fMousePositionChanged = false;
    2642     VMMDevEvents volatile  *pReq                  = pDevExt->pIrqAckEvents;
    2643     int                     rc                    = 0;
    2644     bool                    fOurIrq;
     2641#ifndef RT_OS_WINDOWS
     2642    VBoxGuestMouseSetNotifyCallback MouseNotifyCallback   = { NULL, NULL };
     2643#endif
     2644    bool                            fMousePositionChanged = false;
     2645    VMMDevEvents volatile          *pReq                  = pDevExt->pIrqAckEvents;
     2646    int                             rc                    = 0;
     2647    bool                            fOurIrq;
    26452648
    26462649    /*
     
    26812684            if (fEvents & VMMDEV_EVENT_MOUSE_POSITION_CHANGED)
    26822685            {
     2686                MouseNotifyCallback = pDevExt->MouseNotifyCallback;
    26832687                fMousePositionChanged = true;
    26842688                fEvents &= ~VMMDEV_EVENT_MOUSE_POSITION_CHANGED;
     
    27602764        VBoxGuestNativeISRMousePollEvent(pDevExt);
    27612765#ifndef RT_OS_WINDOWS
    2762         if (pDevExt->MouseSetNotifyCallback.pfnNotify)
    2763             pDevExt->MouseSetNotifyCallback.pfnNotify(pDevExt->MouseSetNotifyCallback.pvNotify);
     2766        if (MouseNotifyCallback.pfnNotify)
     2767            MouseNotifyCallback.pfnNotify(MouseNotifyCallback.pvUser);
    27642768#endif
    27652769    }
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h

    r41640 r41642  
    167167     * together inside the session spinlock. */
    168168    uint32_t volatile           fMouseStatus;
    169     /** Callback and user data for a kernel mouse handler. */
    170     VBoxGuestMouseSetNotifyCallback volatile MouseSetNotifyCallback;
    171169    /** Counter of number of active ISRs.  Currently used for safely removing
    172170     * the mouse handler callback. */
    173171    uint32_t volatile           cISR;
     172    /** Callback and user data for a kernel mouse handler. */
     173    VBoxGuestMouseSetNotifyCallback MouseNotifyCallback;
    174174
    175175    /** Windows part. */
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