Changeset 9251 for trunk/src


Ignore:
Timestamp:
Sep 16, 2002, 3:58:25 PM (23 years ago)
Author:
sandervl
Message:

Statistics fixes & print leaked gdi handles when unloaded; don't recycle gdi handles too soon

Location:
trunk/src/gdi32
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gdi32/gdistats.cpp

    r7640 r9251  
    44#ifdef DEBUG
    55
    6 static DWORD nrdcscreated     = 0;
    7 static DWORD nrfontscreated   = 0;
    8 static DWORD nrpenscreated    = 0;
    9 static DWORD nrbrushescreated = 0;
    10 static DWORD nrregionscreated = 0;
    11 static DWORD nrbitmapscreated = 0;
    12 
     6#define STATS_MAX_OBJECTS        1024
     7
     8static DWORD createddc[STATS_MAX_OBJECTS]     = {0};
     9static DWORD createdfont[STATS_MAX_OBJECTS]   = {0};
     10static DWORD createdpen[STATS_MAX_OBJECTS]    = {0};
     11static DWORD createdbrush[STATS_MAX_OBJECTS]  = {0};
     12static DWORD createdregion[STATS_MAX_OBJECTS] = {0};
     13static DWORD createdbitmap[STATS_MAX_OBJECTS] = {0};
     14
     15static DWORD nrdcscreated        = 0;
     16static DWORD nrfontscreated      = 0;
     17static DWORD nrpenscreated       = 0;
     18static DWORD nrbrushescreated    = 0;
     19static DWORD nrregionscreated    = 0;
     20static DWORD nrbitmapscreated    = 0;
     21
     22
     23//******************************************************************************
     24//******************************************************************************
     25static void STAT_InsertObject(HANDLE hObject, DWORD *pdwObjects)
     26{
     27    for(int i=0;i<STATS_MAX_OBJECTS;i++) {
     28        if(pdwObjects[i] == 0) {
     29            pdwObjects[i] = hObject;
     30            break;
     31        }
     32    }
     33    if(i == STATS_MAX_OBJECTS) {
     34        dprintf(("!WARNING! STAT_InsertObject: no room left!!"));
     35    }
     36}
     37//******************************************************************************
     38//******************************************************************************
     39static void STAT_DeleteObject(HANDLE hObject, DWORD *pdwObjects)
     40{
     41    for(int i=0;i<STATS_MAX_OBJECTS;i++) {
     42        if(pdwObjects[i] == hObject) {
     43            pdwObjects[i] = 0;
     44            break;
     45        }
     46    }
     47    if(i == STATS_MAX_OBJECTS) {
     48        dprintf(("!WARNING! STAT_DeleteObject: %x not found!!", hObject));
     49    }
     50}
     51//******************************************************************************
     52//******************************************************************************
     53static void STAT_PrintLeakedObjects(char *szMessage, DWORD *pdwObjects)
     54{
     55    for(int i=0;i<STATS_MAX_OBJECTS;i++) {
     56        if(pdwObjects[i] != 0) {
     57            dprintf(("%s %x", szMessage, pdwObjects[i]));
     58        }
     59    }
     60}
    1361//******************************************************************************
    1462//******************************************************************************
     
    1664{
    1765    nrfontscreated++;
     66    STAT_InsertObject(hFont, createdfont);
    1867}
    1968//******************************************************************************
     
    2271{
    2372    nrdcscreated++;
     73    STAT_InsertObject(newHdc, createddc);
    2474}
    2575//******************************************************************************
     
    2878{
    2979    nrdcscreated--;
     80    STAT_DeleteObject(hdc, createddc);
    3081}
    3182//******************************************************************************
     
    3485{
    3586    nrbrushescreated++;
     87    STAT_InsertObject(hBrush, createdbrush);
    3688}
    3789//******************************************************************************
     
    4092{
    4193    nrbrushescreated++;
     94    STAT_InsertObject(hBrush, createdbrush);
    4295}
    4396//******************************************************************************
     
    4699{
    47100    nrpenscreated++;
     101    STAT_InsertObject(hPen, createdpen);
    48102}
    49103//******************************************************************************
     
    52106{
    53107    nrpenscreated++;
     108    STAT_InsertObject(hPen, createdpen);
    54109}
    55110//******************************************************************************
     
    59114{
    60115    nrpenscreated++;
     116    STAT_InsertObject(hPen, createdpen);
    61117}
    62118//******************************************************************************
     
    65121{
    66122    nrbrushescreated++;
     123    STAT_InsertObject(hBrush, createdbrush);
    67124}
    68125//******************************************************************************
     
    71128{
    72129    nrbrushescreated++;
     130    STAT_InsertObject(hBrush, createdbrush);
    73131}
    74132//******************************************************************************
     
    77135{
    78136    nrbrushescreated++;
     137    STAT_InsertObject(hBrush, createdbrush);
    79138}
    80139//******************************************************************************
     
    84143{
    85144    nrdcscreated++;
     145    STAT_InsertObject(hdc, createddc);
    86146}
    87147//******************************************************************************
     
    91151{
    92152    nrdcscreated++;
     153    STAT_InsertObject(hdc, createddc);
    93154}
    94155//******************************************************************************
     
    97158{
    98159    nrregionscreated++;
     160    STAT_InsertObject(hRgn, createdregion);
    99161}
    100162//******************************************************************************
     
    103165{
    104166    nrregionscreated++;
     167    STAT_InsertObject(hRgn, createdregion);
    105168}
    106169//******************************************************************************
     
    109172{
    110173    nrregionscreated++;
     174    STAT_InsertObject(hRgn, createdregion);
    111175}
    112176//******************************************************************************
     
    115179{
    116180    nrregionscreated++;
     181    STAT_InsertObject(hRgn, createdregion);
    117182}
    118183//******************************************************************************
     
    121186{
    122187    nrregionscreated++;
     188    STAT_InsertObject(hRgn, createdregion);
    123189}
    124190//******************************************************************************
     
    127193{
    128194    nrregionscreated++;
     195    STAT_InsertObject(hRgn, createdregion);
    129196}
    130197//******************************************************************************
     
    135202{
    136203    nrbitmapscreated++;
     204    STAT_InsertObject(hBitmap, createdbitmap);
    137205}
    138206//******************************************************************************
     
    141209{
    142210    nrbitmapscreated++;
     211    STAT_InsertObject(hBitmap, createdbitmap);
    143212}
    144213//******************************************************************************
     
    148217{
    149218    nrbitmapscreated++;
     219    STAT_InsertObject(hBitmap, createdbitmap);
    150220}
    151221//******************************************************************************
     
    155225{
    156226    nrbitmapscreated++;
     227    STAT_InsertObject(hBitmap, createdbitmap);
    157228}
    158229//******************************************************************************
     
    161232{
    162233    nrbitmapscreated++;
     234    STAT_InsertObject(hBitmap, createdbitmap);
    163235}
    164236//******************************************************************************
     
    170242    case OBJ_EXTPEN:
    171243        nrpenscreated--;
     244        STAT_DeleteObject(hObj, createdpen);
    172245        break;
    173246    case OBJ_BRUSH:
    174247        nrbrushescreated--;
     248        STAT_DeleteObject(hObj, createdbrush);
    175249        break;
    176250    case OBJ_FONT:
    177251        nrfontscreated--;
     252        STAT_DeleteObject(hObj, createdfont);
    178253        break;
    179254    case OBJ_REGION:
    180255        nrregionscreated--;
     256        STAT_DeleteObject(hObj, createdregion);
    181257        break;
    182258    case OBJ_BITMAP:
    183259        nrbitmapscreated--;
     260        STAT_DeleteObject(hObj, createdbitmap);
     261        break;
     262
     263    case OBJ_MEMDC:
     264    case OBJ_DC:
     265        nrdcscreated--;
     266        STAT_DeleteObject(hObj, createddc);
    184267        break;
    185268
    186269    case OBJ_PAL:
    187270    case OBJ_METAFILE:
    188     case OBJ_MEMDC:
    189271    case OBJ_ENHMETADC:
    190272    case OBJ_ENHMETAFILE:
    191     case OBJ_DC:
    192273    case OBJ_METADC:
    193          break;
     274        break;
     275    default:
     276        dprintf(("!ERROR! Unknown object %x of type %d", hObj, objtype));
     277        break;
    194278    }
    195279}
     
    200284    dprintf(("*************  GDI32 STATISTICS BEGIN *****************"));
    201285    dprintf(("Leaked dcs            %d", nrdcscreated));
     286    STAT_PrintLeakedObjects("Leaked DC", createddc);
     287    dprintf(("*************  ********************** *****************"));
    202288    dprintf(("Leaked font objects   %d", nrfontscreated));
     289    STAT_PrintLeakedObjects("Leaked Font", createdfont);
     290    dprintf(("*************  ********************** *****************"));
    203291    dprintf(("Leaked pen objects    %d", nrpenscreated));
     292    STAT_PrintLeakedObjects("Leaked Pen", createdpen);
     293    dprintf(("*************  ********************** *****************"));
    204294    dprintf(("Leaked brush objects  %d", nrbrushescreated));
     295    STAT_PrintLeakedObjects("Leaked Brush", createdbrush);
     296    dprintf(("*************  ********************** *****************"));
    205297    dprintf(("Leaked region objects %d", nrregionscreated));
     298    STAT_PrintLeakedObjects("Leaked Region", createdregion);
     299    dprintf(("*************  ********************** *****************"));
    206300    dprintf(("Leaked bitmap objects %d", nrbitmapscreated));
     301    STAT_PrintLeakedObjects("Leaked Bitmap", createdbitmap);
    207302    dprintf(("*************  GDI32 STATISTICS END   *****************"));
    208303}
  • trunk/src/gdi32/objhandle.cpp

    r8995 r9251  
    1 /* $Id: objhandle.cpp,v 1.27 2002-08-13 14:45:37 sandervl Exp $ */
     1/* $Id: objhandle.cpp,v 1.28 2002-09-16 13:58:25 sandervl Exp $ */
    22/*
    33 * Win32 Handle Management Code for OS/2
     
    5252BOOL WIN32API ObjAllocateHandle(HANDLE *hObject, DWORD dwUserData, DWORD dwType)
    5353{
     54    DWORD oldlowestidx;
     55
    5456    objTableMutex.enter();
    5557    if(objHandleTable == NULL) {
     
    7981    objHandleTable[lowestFreeIndex].dwGDI32Data = 0;
    8082    objHandleTable[lowestFreeIndex].dwFlags     = 0;
     83
     84    oldlowestidx = lowestFreeIndex+1;
     85
    8186    lowestFreeIndex = -1;
    8287
    8388    //find next free handle
    84     for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
     89findhandle:
     90    for(int i=oldlowestidx;i<MAX_OBJECT_HANDLES;i++) {
    8591        if(objHandleTable[i].dwUserData == 0) {
    8692            lowestFreeIndex = i;
     
    8894        }
    8995    }
     96    if(lowestFreeIndex == -1) {
     97        oldlowestidx = 0; //search from the start
     98        goto findhandle;
     99    }
    90100    objTableMutex.leave();
    91101    return TRUE;
     
    102112            objHandleTable[hObject].dwUserData = 0;
    103113            objHandleTable[hObject].dwType     = HNDL_NONE;
    104             if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
     114////            if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
     115            if(lowestFreeIndex == -1)
    105116                lowestFreeIndex = hObject;
    106117        }
     
    489500        return TRUE;
    490501    }   
    491     STATS_DeleteObject(hObj, objtype);
     502    STATS_DeleteObject(hObj, GetObjectType(hObj));
    492503
    493504    if(ObjQueryHandleType(hObj) == HNDL_REGION)
Note: See TracChangeset for help on using the changeset viewer.