mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[WIN32SS:ENG/NTUSER] Use shared locks for display list lookups (#9090)
- Use shared locks for the display device and PDEV lookup paths. These functions only walk existing lists and take references, while list updates and mode-switch paths still use exclusive locking. This avoids serializing read-only display queries unnecessarily. - Use shared locks for other read-only NtUser calls.
This commit is contained in:
@@ -803,7 +803,7 @@ EngpFindGraphicsDevice(
|
|||||||
pustrDevice, iDevNum);
|
pustrDevice, iDevNum);
|
||||||
|
|
||||||
/* Lock list */
|
/* Lock list */
|
||||||
EngAcquireSemaphore(ghsemGraphicsDeviceList);
|
EngAcquireSemaphoreShared(ghsemGraphicsDeviceList);
|
||||||
|
|
||||||
if (pustrDevice && pustrDevice->Buffer)
|
if (pustrDevice && pustrDevice->Buffer)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -805,7 +805,7 @@ EngpGetPDEV(
|
|||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
/* Acquire PDEV lock */
|
/* Acquire PDEV lock */
|
||||||
EngAcquireSemaphore(ghsemPDEV);
|
EngAcquireSemaphoreShared(ghsemPDEV);
|
||||||
|
|
||||||
/* Did the caller pass a device name? */
|
/* Did the caller pass a device name? */
|
||||||
if (pustrDeviceName)
|
if (pustrDeviceName)
|
||||||
|
|||||||
@@ -6315,7 +6315,7 @@ NtUserMenuItemFromPoint(
|
|||||||
int Ret = -1;
|
int Ret = -1;
|
||||||
|
|
||||||
TRACE("Enter NtUserMenuItemFromPoint\n");
|
TRACE("Enter NtUserMenuItemFromPoint\n");
|
||||||
UserEnterExclusive();
|
UserEnterShared();
|
||||||
|
|
||||||
if (!(Menu = UserGetMenuObject(hMenu)))
|
if (!(Menu = UserGetMenuObject(hMenu)))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,7 +61,19 @@ NtUserCallNoParam(DWORD Routine)
|
|||||||
DWORD_PTR Result = 0;
|
DWORD_PTR Result = 0;
|
||||||
|
|
||||||
TRACE("Enter NtUserCallNoParam\n");
|
TRACE("Enter NtUserCallNoParam\n");
|
||||||
UserEnterExclusive();
|
|
||||||
|
/* Read-only routines only need a shared lock; the rest stay exclusive */
|
||||||
|
switch (Routine)
|
||||||
|
{
|
||||||
|
case NOPARAM_ROUTINE_GETMSESSAGEPOS:
|
||||||
|
case NOPARAM_ROUTINE_GETIMESHOWSTATUS:
|
||||||
|
case NOPARAM_ROUTINE_ISCONSOLEMODE:
|
||||||
|
UserEnterShared();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UserEnterExclusive();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (Routine)
|
switch (Routine)
|
||||||
{
|
{
|
||||||
@@ -158,7 +170,22 @@ NtUserCallOneParam(
|
|||||||
|
|
||||||
TRACE("Enter NtUserCallOneParam\n");
|
TRACE("Enter NtUserCallOneParam\n");
|
||||||
|
|
||||||
UserEnterExclusive();
|
/* Read-only routines only need a shared lock; the rest stay exclusive */
|
||||||
|
switch (Routine)
|
||||||
|
{
|
||||||
|
case ONEPARAM_ROUTINE_GETDESKTOPMAPPING:
|
||||||
|
case ONEPARAM_ROUTINE_WINDOWFROMDC:
|
||||||
|
case ONEPARAM_ROUTINE_GETKEYBOARDTYPE:
|
||||||
|
case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT:
|
||||||
|
case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
|
||||||
|
case ONEPARAM_ROUTINE_GETCURSORPOS:
|
||||||
|
case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT:
|
||||||
|
UserEnterShared();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UserEnterExclusive();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (Routine)
|
switch (Routine)
|
||||||
{
|
{
|
||||||
@@ -319,7 +346,6 @@ NtUserCallOneParam(
|
|||||||
}
|
}
|
||||||
|
|
||||||
case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
|
case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
|
||||||
/* FIXME: Should use UserEnterShared */
|
|
||||||
Result = UserEnumClipboardFormats(Param);
|
Result = UserEnumClipboardFormats(Param);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -1527,7 +1527,7 @@ NtUserBuildHwndList(
|
|||||||
if (pcHwndNeeded == NULL)
|
if (pcHwndNeeded == NULL)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
UserEnterExclusive();
|
UserEnterShared();
|
||||||
|
|
||||||
if (hwndParent || !dwThreadId)
|
if (hwndParent || !dwThreadId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3283,7 +3283,7 @@ NtUserChildWindowFromPointEx(HWND hwndParent,
|
|||||||
{
|
{
|
||||||
PWND pwndParent;
|
PWND pwndParent;
|
||||||
TRACE("Enter NtUserChildWindowFromPointEx\n");
|
TRACE("Enter NtUserChildWindowFromPointEx\n");
|
||||||
UserEnterExclusive();
|
UserEnterShared();
|
||||||
if ((pwndParent = UserGetWindowObject(hwndParent)))
|
if ((pwndParent = UserGetWindowObject(hwndParent)))
|
||||||
{
|
{
|
||||||
pwndParent = IntChildWindowFromPointEx(pwndParent, x, y, uiFlags);
|
pwndParent = IntChildWindowFromPointEx(pwndParent, x, y, uiFlags);
|
||||||
|
|||||||
Reference in New Issue
Block a user