[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 1 Jan 2013 11:57:58 +0000 (11:57 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Tue, 1 Jan 2013 11:57:58 +0000 (11:57 +0000)
Exchange fields individually in PDEVOBJ_vSwitchPdev() instead of duplicating a full PDEV structure on the stack. This saves a lot of stack space.

svn path=/trunk/; revision=58081

reactos/win32ss/gdi/eng/pdevobj.c

index 5214e0b..5402a84 100644 (file)
@@ -341,52 +341,68 @@ EngpCreatePDEV(
     return ppdev;
 }
 
+VOID
+FORCEINLINE
+SwitchPointer(
+    _Inout_ PVOID pvPointer1,
+    _Inout_ PVOID pvPointer2)
+{
+    PVOID *ppvPointer1 = pvPointer1;
+    PVOID *ppvPointer2 = pvPointer2;
+    PVOID pvTemp;
+
+    pvTemp = *ppvPointer1;
+    *ppvPointer1 = *ppvPointer2;
+    *ppvPointer2 = pvTemp;
+}
+
 VOID
 NTAPI
 PDEVOBJ_vSwitchPdev(
     PPDEVOBJ ppdev,
     PPDEVOBJ ppdev2)
 {
-    PDEVOBJ pdevTmp;
-    DWORD tmpStateFlags;
-
-    /* Exchange data */
-    pdevTmp = *ppdev;
+    union
+    {
+        DRIVER_FUNCTIONS pfn;
+        GDIINFO gdiinfo;
+        DEVINFO devinfo;
+        DWORD StateFlags;
+    } temp;
 
     /* Exchange driver functions */
+    temp.pfn = ppdev->pfn;
     ppdev->pfn = ppdev2->pfn;
-    ppdev2->pfn = pdevTmp.pfn;
+    ppdev2->pfn = temp.pfn;
 
     /* Exchange LDEVs */
-    ppdev->pldev = ppdev2->pldev;
-    ppdev2->pldev = pdevTmp.pldev;
+    SwitchPointer(&ppdev->pldev, &ppdev2->pldev);
 
     /* Exchange DHPDEV */
-    ppdev->dhpdev = ppdev2->dhpdev;
-    ppdev2->dhpdev = pdevTmp.dhpdev;
+    SwitchPointer(&ppdev->dhpdev, &ppdev2->dhpdev);
 
     /* Exchange surfaces and associate them with their new PDEV */
-    ppdev->pSurface = ppdev2->pSurface;
-    ppdev2->pSurface = pdevTmp.pSurface;
+    SwitchPointer(&ppdev->pSurface, &ppdev2->pSurface);
     ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev;
     ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2;
 
     /* Exchange devinfo */
+    temp.devinfo = ppdev->devinfo;
     ppdev->devinfo = ppdev2->devinfo;
-    ppdev2->devinfo = pdevTmp.devinfo;
+    ppdev2->devinfo = temp.devinfo;
 
     /* Exchange gdiinfo */
+    temp.gdiinfo = ppdev->gdiinfo;
     ppdev->gdiinfo = ppdev2->gdiinfo;
-    ppdev2->gdiinfo = pdevTmp.gdiinfo;
+    ppdev2->gdiinfo = temp.gdiinfo;
 
     /* Exchange DEVMODE */
-    ppdev->pdmwDev = ppdev2->pdmwDev;
-    ppdev2->pdmwDev = pdevTmp.pdmwDev;
+    SwitchPointer(&ppdev->pdmwDev, &ppdev2->pdmwDev);
 
     /* Exchange state flags */
-    tmpStateFlags = ppdev->pGraphicsDevice->StateFlags;
+    temp.StateFlags = ppdev->pGraphicsDevice->StateFlags;
     ppdev->pGraphicsDevice->StateFlags = ppdev2->pGraphicsDevice->StateFlags;
-    ppdev2->pGraphicsDevice->StateFlags = tmpStateFlags;
+    ppdev2->pGraphicsDevice->StateFlags = temp.StateFlags;
 
     /* Notify each driver instance of its new HDEV association */
     ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
@@ -407,6 +423,7 @@ PDEVOBJ_bSwitchMode(
 
     /* Lock the PDEV */
     EngAcquireSemaphore(ppdev->hsemDevLock);
+
     /* And everything else */
     EngAcquireSemaphore(ghsemPDEV);
 
@@ -613,9 +630,10 @@ PDEVOBJ_vGetDeviceCaps(
 
 /** Exported functions ********************************************************/
 
+_Must_inspect_result_ _Ret_z_
 LPWSTR
 APIENTRY
-EngGetDriverName(IN HDEV hdev)
+EngGetDriverName(_In_ HDEV hdev)
 {
     PPDEVOBJ ppdev = (PPDEVOBJ)hdev;