- Rewrite EngAcquire/ReleaseSemaphore.
- Add internal fastcalls for them and tag.
- Fix DxEngUn/LockShareSem.
- Tested with Qemu. Needs Dx testing.

svn path=/trunk/; revision=33309
This commit is contained in:
James Tabor 2008-05-06 03:40:38 +00:00
parent ebec4882b2
commit 19381c9fed
6 changed files with 42 additions and 29 deletions

View file

@ -11,7 +11,7 @@ STDCALL
EngCreateSemaphore ( VOID )
{
// www.osr.com/ddk/graphics/gdifncs_95lz.htm
PERESOURCE psem = ExAllocatePool ( NonPagedPool, sizeof(ERESOURCE) );
PERESOURCE psem = ExAllocatePoolWithTag( NonPagedPool, sizeof(ERESOURCE), TAG_GSEM );
if ( !psem )
return NULL;
if ( !NT_SUCCESS(ExInitializeResourceLite ( psem )) )
@ -22,6 +22,14 @@ EngCreateSemaphore ( VOID )
return (HSEMAPHORE)psem;
}
VOID
FASTCALL
IntGdiAcquireSemaphore ( HSEMAPHORE hsem )
{
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite ( (PERESOURCE)hsem, TRUE );
}
/*
* @implemented
*/
@ -30,9 +38,20 @@ STDCALL
EngAcquireSemaphore ( IN HSEMAPHORE hsem )
{
// www.osr.com/ddk/graphics/gdifncs_14br.htm
PW32THREAD W32Thread;
ASSERT(hsem);
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite ( (PERESOURCE)hsem, TRUE );
IntGdiAcquireSemaphore ( hsem );
W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread());
if (W32Thread) W32Thread->dwEngAcquireCount++;
}
VOID
FASTCALL
IntGdiReleaseSemaphore ( HSEMAPHORE hsem )
{
ExReleaseResourceLite ( (PERESOURCE)hsem );
KeLeaveCriticalRegion();
}
/*
@ -43,9 +62,11 @@ STDCALL
EngReleaseSemaphore ( IN HSEMAPHORE hsem )
{
// www.osr.com/ddk/graphics/gdifncs_5u3r.htm
PW32THREAD W32Thread;
ASSERT(hsem);
ExReleaseResourceLite ( (PERESOURCE)hsem );
KeLeaveCriticalRegion();
W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread());
if (W32Thread) --W32Thread->dwEngAcquireCount;
IntGdiReleaseSemaphore ( hsem );
}
/*

View file

@ -20,4 +20,7 @@ IntEngWindowChanged(
PWINDOW_OBJECT Window,
FLONG flChanged);
VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem );
VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem );
#endif /* _WIN32K_ENG_H */

View file

@ -81,6 +81,7 @@
#define TAG_WNDOBJ TAG('W', 'N', 'D', 'O') /* window object */
#define TAG_XLATEOBJ TAG('X', 'L', 'A', 'O') /* xlate object */
#define TAG_BITMAPOBJ TAG('B', 'M', 'P', 'O') /* bitmap object */
#define TAG_GSEM TAG('G', 's', 'e', 'm') /* Gdi Semaphore */
/* misc */
#define TAG_DRIVER TAG('G', 'D', 'R', 'V') /* video drivers */

View file

@ -13,6 +13,7 @@ typedef struct _W32THREAD
HANDLE hDesktop;
PVOID pgdiDcattr;
PVOID pgdiBrushAttr;
DWORD dwEngAcquireCount;
BOOLEAN IsExiting;
SINGLE_LIST_ENTRY ReferencesList;
ULONG Hooks;

View file

@ -9,7 +9,7 @@
#include <w32k.h>
#include <debug.h>
ERESOURCE ghsemShareDevLock;
HSEMAPHORE ghsemShareDevLock = NULL;
ULONG gcEngFuncs = DXENG_INDEX_DxEngLoadImage + 1;
DRVFN gaEngFuncs [] =
@ -171,23 +171,17 @@ DxEngUnlockDC(PDC pDC)
*
* @remarks.
* It is being used in various ntuser* functions and ntgdi*
* ReactOS specific: It is not in use yet.
* ReactOS specific: It is not in use yet?
*SystemResourcesList
*--*/
BOOLEAN
STDCALL
DxEngLockShareSem()
{
BOOLEAN retVal = FALSE;
DPRINT1("ReactX Calling : DxEngLockShareSem\n");
#if 0
if (ExIsResourceAcquiredExclusiveLite(&ghsemShareDevLock) == FALSE)
{
KeEnterCriticalRegion();
retVal = ExAcquireResourceExclusiveLite(&ghsemShareDevLock, TRUE);
}
#endif
return retVal;
if(!ghsemShareDevLock) ghsemShareDevLock = EngCreateSemaphore(); // Hax, should be in dllmain.c
IntGdiAcquireSemaphore(ghsemShareDevLock);
return TRUE;
}
/*++
@ -200,7 +194,7 @@ DxEngLockShareSem()
* This function returns TRUE no matter what.
*
* @remarks.
* ReactOS specific: It is not in use yet.
* ReactOS specific: It is not in use yet?
*
*--*/
BOOLEAN
@ -208,14 +202,7 @@ STDCALL
DxEngUnlockShareSem()
{
DPRINT1("ReactX Calling : DxEngUnlockShareSem\n");
#if 0
if (ExIsResourceAcquiredExclusiveLite(&ghsemShareDevLock) == TRUE)
{
ExReleaseResourceLite(&ghsemShareDevLock);
KeLeaveCriticalRegion();
}
#endif
IntGdiReleaseSemaphore(ghsemShareDevLock);
return TRUE;
}

View file

@ -2705,21 +2705,21 @@ VOID FASTCALL
IntGdiReferencePdev(PGDIDEVICE pPDev)
{
if(!hsemDriverMgmt) hsemDriverMgmt = EngCreateSemaphore(); // Hax, should be in dllmain.c
EngAcquireSemaphore(hsemDriverMgmt);
IntGdiAcquireSemaphore(hsemDriverMgmt);
pPDev->cPdevRefs++;
EngReleaseSemaphore(hsemDriverMgmt);
IntGdiReleaseSemaphore(hsemDriverMgmt);
}
VOID FASTCALL
IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType)
{
EngAcquireSemaphore(hsemDriverMgmt);
IntGdiAcquireSemaphore(hsemDriverMgmt);
pPDev->cPdevRefs--;
if (!pPDev->cPdevRefs)
{
// Handle the destruction of pPDev or GDIDEVICE or PDEVOBJ or PDEV etc.
}
EngReleaseSemaphore(hsemDriverMgmt);
IntGdiReleaseSemaphore(hsemDriverMgmt);
}