clean-up work on my GDIOBJ lock/unlock tracing/debugging

svn path=/trunk/; revision=5400
This commit is contained in:
Royce Mitchell III 2003-08-04 00:24:07 +00:00
parent 1ddb9c245b
commit bd3999379b

View file

@ -19,7 +19,7 @@
/* /*
* GDIOBJ.C - GDI object manipulation routines * GDIOBJ.C - GDI object manipulation routines
* *
* $Id: gdiobj.c,v 1.31 2003/08/01 20:54:03 royce Exp $ * $Id: gdiobj.c,v 1.32 2003/08/04 00:24:07 royce Exp $
* *
*/ */
@ -267,7 +267,7 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic, DWORD Flag)
return FALSE; return FALSE;
} }
objectHeader = (PGDIOBJHDR) handleEntry->pObject; objectHeader = handleEntry->pObject;
ASSERT(objectHeader); ASSERT(objectHeader);
DPRINT("FreeObj: locks: %x\n", objectHeader->dwCount ); DPRINT("FreeObj: locks: %x\n", objectHeader->dwCount );
if( !(Flag & GDIOBJFLAG_IGNORELOCK) ){ if( !(Flag & GDIOBJFLAG_IGNORELOCK) ){
@ -314,10 +314,8 @@ GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic, DWORD Flag)
bRet = IconCursor_InternalDelete( (PICONCURSOROBJ) Obj ); bRet = IconCursor_InternalDelete( (PICONCURSOROBJ) Obj );
break; break;
} }
handleEntry->hProcessId = 0;
ExFreePool (handleEntry->pObject); ExFreePool (handleEntry->pObject);
handleEntry->pObject = 0; memset ( handleEntry, 0, sizeof(GDI_HANDLE_ENTRY) );
handleEntry->wMagic = 0;
return TRUE; return TRUE;
} }
@ -555,8 +553,8 @@ VOID STDCALL
W32kDumpGdiObjects( INT Process ) W32kDumpGdiObjects( INT Process )
{ {
DWORD i; DWORD i;
PGDI_HANDLE_ENTRY handleEntry; PGDI_HANDLE_ENTRY handleEntry;
PGDIOBJHDR objectHeader; PGDIOBJHDR objectHeader;
for( i=1; i < GDI_HANDLE_NUMBER; i++ ){ for( i=1; i < GDI_HANDLE_NUMBER; i++ ){
handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) i & 0xffff); handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) i & 0xffff);
@ -575,23 +573,34 @@ W32kDumpGdiObjects( INT Process )
PGDIOBJ FASTCALL PGDIOBJ FASTCALL
GDIOBJ_LockObjDbg ( const char* file, int line, HGDIOBJ hObj, WORD Magic ) GDIOBJ_LockObjDbg ( const char* file, int line, HGDIOBJ hObj, WORD Magic )
{ {
PGDIOBJ rc; PGDIOBJ rc;
PGDI_HANDLE_ENTRY handleEntry PGDI_HANDLE_ENTRY handleEntry
= GDIOBJ_iGetHandleEntryForIndex ( GDI_HANDLE2INDEX(hObj) ); = GDIOBJ_iGetHandleEntryForIndex ( GDI_HANDLE2INDEX(hObj) );
if ( handleEntry->lockfile ) if ( handleEntry == 0
{ || (handleEntry->wMagic != Magic && Magic != GO_MAGIC_DONTCARE )
DbgPrint("Caution! GDIOBJ_LockObj trying to lock object (0x%x) second time\n", hObj ); || (handleEntry->hProcessId != (HANDLE)0xFFFFFFFF
DbgPrint("\tcalled from: %s:%i\n", file, line ); && handleEntry->hProcessId != PsGetCurrentProcessId ()
DbgPrint("\tpreviously locked from: %s:%i\n", handleEntry->lockfile, handleEntry->lockline ); )
} )
//DbgPrint("(%s:%i) GDIOBJ_LockObj(0x%x,0x%x)\n", file, line, hObj, Magic ); {
rc = GDIOBJ_LockObj(hObj,Magic); DPRINT1("GDIBOJ_LockObj failed for %d, magic: %d, reqMagic\n",(WORD) hObj & 0xffff, handleEntry->wMagic, Magic);
if ( rc && !handleEntry->lockfile ) DPRINT1("\tcalled from: %s:%i\n", file, line );
{ return NULL;
handleEntry->lockfile = file; }
handleEntry->lockline = line; if ( handleEntry->lockfile )
} {
return rc; DPRINT1("Caution! GDIOBJ_LockObj trying to lock object (0x%x) second time\n", hObj );
DPRINT1("\tcalled from: %s:%i\n", file, line );
DPRINT1("\tpreviously locked from: %s:%i\n", handleEntry->lockfile, handleEntry->lockline );
}
//DbgPrint("(%s:%i) GDIOBJ_LockObj(0x%x,0x%x)\n", file, line, hObj, Magic );
rc = GDIOBJ_LockObj(hObj,Magic);
if ( rc && !handleEntry->lockfile )
{
handleEntry->lockfile = file;
handleEntry->lockline = line;
}
return rc;
} }
#endif//GDIOBJ_LockObj #endif//GDIOBJ_LockObj
@ -600,12 +609,23 @@ GDIOBJ_LockObjDbg ( const char* file, int line, HGDIOBJ hObj, WORD Magic )
BOOL FASTCALL BOOL FASTCALL
GDIOBJ_UnlockObjDbg ( const char* file, int line, HGDIOBJ hObj, WORD Magic ) GDIOBJ_UnlockObjDbg ( const char* file, int line, HGDIOBJ hObj, WORD Magic )
{ {
PGDI_HANDLE_ENTRY handleEntry PGDI_HANDLE_ENTRY handleEntry
= GDIOBJ_iGetHandleEntryForIndex ( GDI_HANDLE2INDEX(hObj) ); = GDIOBJ_iGetHandleEntryForIndex ( GDI_HANDLE2INDEX(hObj) );
//DbgPrint("(%s:%i) GDIOBJ_UnlockObj(0x%x,0x%x)\n", file, line, hObj, Magic ); if ( handleEntry == 0
handleEntry->lockfile = NULL; || (handleEntry->wMagic != Magic && Magic != GO_MAGIC_DONTCARE )
handleEntry->lockline = 0; || (handleEntry->hProcessId != (HANDLE)0xFFFFFFFF
return GDIOBJ_UnlockObj(hObj,Magic); && handleEntry->hProcessId != PsGetCurrentProcessId ()
)
)
{
DPRINT1("GDIBOJ_UnlockObj failed for %d, magic: %d, reqMagic\n",(WORD) hObj & 0xffff, handleEntry->wMagic, Magic );
DPRINT1("\tcalled from: %s:%i\n", file, line );
return NULL;
}
//DbgPrint("(%s:%i) GDIOBJ_UnlockObj(0x%x,0x%x)\n", file, line, hObj, Magic );
handleEntry->lockfile = NULL;
handleEntry->lockline = 0;
return GDIOBJ_UnlockObj(hObj,Magic);
} }
#endif//GDIOBJ_LockObj #endif//GDIOBJ_LockObj
@ -635,7 +655,7 @@ GDIOBJ_LockObj( HGDIOBJ hObj, WORD Magic )
) )
) )
{ {
DPRINT("GDIBOJ_LockObj failed for %d, magic: %d, reqMagic\n",(WORD) hObj & 0xffff, handleEntry->wMagic, Magic); DPRINT1("GDIBOJ_LockObj failed for %d, magic: %d, reqMagic\n",(WORD) hObj & 0xffff, handleEntry->wMagic, Magic);
return NULL; return NULL;
} }
@ -681,7 +701,7 @@ GDIOBJ_UnlockObj( HGDIOBJ hObj, WORD Magic )
) )
) )
{ {
DPRINT( "GDIOBJ_UnLockObj: failed\n"); DPRINT1( "GDIOBJ_UnLockObj: failed\n");
return FALSE; return FALSE;
} }