- Repair GDI handle debugging functionality.
authorFilip Navara <filip.navara@gmail.com>
Tue, 7 Jun 2005 20:02:22 +0000 (20:02 +0000)
committerFilip Navara <filip.navara@gmail.com>
Tue, 7 Jun 2005 20:02:22 +0000 (20:02 +0000)
- Fix locking in NtGdiGetTextFace.

svn path=/trunk/; revision=15834

reactos/subsys/win32k/objects/gdiobj.c
reactos/subsys/win32k/objects/text.c

index 54e037d..deea3b0 100644 (file)
@@ -559,6 +559,9 @@ LockHandle:
          * The object is currently locked, so freeing is forbidden!
          */
         DPRINT1("GdiHdr->Locks: %d\n", GdiHdr->Locks);
+#ifdef GDI_DEBUG
+        DPRINT1("Locked from: %s:%d\n", GdiHdr->lockfile, GdiHdr->lockline);
+#endif
         ASSERT(FALSE);
       }
     }
@@ -781,6 +784,10 @@ GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType)
             {
                GdiHdr->LockingThread = Thread;
                GdiHdr->Locks = 1;
+#ifdef GDI_DEBUG
+               GdiHdr->lockfile = file;
+               GdiHdr->lockline = line;
+#endif
                Object = HandleEntry->KernelData;
             }
             else
@@ -925,7 +932,15 @@ GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType)
          {
             PGDIOBJHDR GdiHdr = GDIBdyToHdr(HandleEntry->KernelData);
 
+#ifdef GDI_DEBUG
+            if (InterlockedIncrement(&GdiHdr->Locks) == 1)
+            {
+               GdiHdr->lockfile = file;
+               GdiHdr->lockline = line;
+            }
+#else
             InterlockedIncrement(&GdiHdr->Locks);
+#endif
             Object = HandleEntry->KernelData;
          }
          else
index 4d8d2ee..703e2da 100644 (file)
@@ -2564,6 +2564,7 @@ INT STDCALL
 NtGdiGetTextFace(HDC hDC, INT Count, LPWSTR FaceName)
 {
    PDC Dc;
+   HFONT hFont;
    PTEXTOBJ TextObj;
    NTSTATUS Status;
 
@@ -2573,11 +2574,14 @@ NtGdiGetTextFace(HDC hDC, INT Count, LPWSTR FaceName)
       SetLastWin32Error(ERROR_INVALID_HANDLE);
       return FALSE;
    }
-   TextObj = TEXTOBJ_LockText(Dc->w.hFont);
+   hFont = Dc->w.hFont;
    DC_UnlockDc(Dc);
 
+   TextObj = TEXTOBJ_LockText(Dc->w.hFont);
+   ASSERT(TextObj != NULL);
    Count = min(Count, wcslen(TextObj->logfont.lfFaceName));
    Status = MmCopyToCaller(FaceName, TextObj->logfont.lfFaceName, Count * sizeof(WCHAR));
+   TEXTOBJ_UnlockText(TextObj);
    if (!NT_SUCCESS(Status))
    {
       SetLastNtError(Status);