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
This commit is contained in:
Timo Kreuzer 2013-01-01 11:57:58 +00:00
parent febbf7f603
commit 46da747829

View file

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