Ignore:
Timestamp:
Jan 11, 2004, 12:43:22 PM (22 years ago)
Author:
sandervl
Message:

Update

File:
1 edited

Legend:

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

    r9429 r10374  
    1 /* $Id: objhandle.cpp,v 1.31 2002-11-26 10:53:10 sandervl Exp $ */
     1/* $Id: objhandle.cpp,v 1.32 2004-01-11 11:42:18 sandervl Exp $ */
    22/*
    33 * Win32 Handle Management Code for OS/2
     
    55 *
    66 * Copyright 2000-2002 Sander van Leeuwen (sandervl@xs4all.nl)
     7 * Copyright 2003 Innotek Systemberatung GmbH (sandervl@innotek.de)
    78 *
    89 * TODO: The table should be dynamically increased when necessary
     
    3738//******************************************************************************
    3839
    39 typedef struct {
    40   DWORD      dwUserData;
    41   DWORD      dwGDI32Data;
    42   DWORD      dwFlags;
    43   DWORD      dwType;
     40typedef struct _GdiObject
     41{
     42  DWORD              dwUserData;
     43  DWORD              dwGDI32Data;
     44  DWORD              dwFlags;
     45  DWORD              dwType;
     46#ifdef DEBUG
     47  DWORD              dwTime;
     48  struct _GdiObject *prev;
     49#endif
     50  struct _GdiObject *next;
    4451} GdiObject;
    4552
    46 static GdiObject *objHandleTable  = NULL;
    47 static ULONG      lowestFreeIndex = 1;
    48 static VMutex     objTableMutex;
     53typedef struct
     54{
     55  GdiObject *headfree;
     56  GdiObject *tailfree;
     57  GdiObject *objects;
     58  int        iAllocated;
     59#ifdef DEBUG
     60  DWORD      dwMaxAllocated;
     61#endif
     62} GdiObjectTable;
     63
     64static GdiObjectTable  objHandleTable = { 0 };
     65static VMutex          objTableMutex;
    4966
    5067//******************************************************************************
     
    5370{
    5471    DWORD oldlowestidx;
    55 
    56     objTableMutex.enter();
    57     if(objHandleTable == NULL) {
    58         objHandleTable = (GdiObject *)malloc(MAX_OBJECT_HANDLES*sizeof(GdiObject));
    59         if(objHandleTable == NULL) {
     72    BOOL  retry = FALSE;
     73
     74    objTableMutex.enter();
     75    if(objHandleTable.objects == NULL)
     76    {
     77        objHandleTable.objects = (GdiObject *)malloc(MAX_OBJECT_HANDLES*sizeof(GdiObject));
     78        if(objHandleTable.objects == NULL) {
    6079            DebugInt3();
    61         }
    62         memset(objHandleTable, 0, MAX_OBJECT_HANDLES*sizeof(GdiObject));
    63     }
    64 
    65     if(lowestFreeIndex == -1) {
     80            return FALSE;
     81        }
     82        memset(objHandleTable.objects, 0, MAX_OBJECT_HANDLES*sizeof(GdiObject));
     83        if(objHandleTable.objects[0].dwType == HNDL_NONE) {
     84            //first handle can never be used
     85            objHandleTable.objects[0].dwType     = HNDL_INVALID;
     86            objHandleTable.objects[0].dwUserData = -1;
     87            objHandleTable.objects[0].dwFlags    = OBJHANDLE_FLAG_NODELETE;
     88        }
     89        objHandleTable.tailfree = &objHandleTable.objects[MAX_OBJECT_HANDLES-1];
     90        for(int i=MAX_OBJECT_HANDLES-1;i>0;i--)
     91        {
     92            GdiObject *obj = &objHandleTable.objects[i];
     93
     94#ifdef DEBUG
     95            if(objHandleTable.headfree) {
     96                objHandleTable.headfree->prev = obj;
     97            }
     98            obj->prev = NULL;
     99#endif
     100            obj->next = objHandleTable.headfree;
     101            objHandleTable.headfree = obj;
     102        }
     103        objHandleTable.iAllocated = 1; //one invalid object
     104    }
     105
     106    GdiObject *newobj = objHandleTable.headfree;
     107    if(newobj == NULL) {
    66108        //oops, out of handles
    67109        objTableMutex.leave();
     
    70112        return FALSE;
    71113    }
    72     if(objHandleTable[0].dwType == HNDL_NONE) {
    73         //first handle can never be used
    74         objHandleTable[0].dwType     = HNDL_INVALID;
    75         objHandleTable[0].dwUserData = -1;
    76     }
    77     *hObject = lowestFreeIndex;
    78     *hObject = MAKE_HANDLE(*hObject);
    79     objHandleTable[lowestFreeIndex].dwUserData  = dwUserData;
    80     objHandleTable[lowestFreeIndex].dwType      = dwType;
    81     objHandleTable[lowestFreeIndex].dwGDI32Data = 0;
    82     objHandleTable[lowestFreeIndex].dwFlags     = 0;
    83 
    84     oldlowestidx = lowestFreeIndex+1;
    85 
    86     lowestFreeIndex = -1;
    87 
    88     //find next free handle
    89 findhandle:
    90     for(int i=oldlowestidx;i<MAX_OBJECT_HANDLES;i++) {
    91         if(objHandleTable[i].dwUserData == 0) {
    92             lowestFreeIndex = i;
    93             break;
    94         }
    95     }
    96     if(lowestFreeIndex == -1) {
    97         oldlowestidx = 0; //search from the start
    98         goto findhandle;
    99     }
    100     objTableMutex.leave();
     114    objHandleTable.headfree = newobj->next;
     115    //if there's nothing left, then there's nothing left
     116    if(objHandleTable.headfree == NULL) {
     117         dprintf(("WARNING: Just allocated our last GDI handle..."));
     118         objHandleTable.tailfree = NULL;
     119    }
     120#ifdef DEBUG
     121    else objHandleTable.headfree->prev = NULL;
     122    newobj->prev = NULL;
     123    newobj->dwTime = GetCurrentTime();
     124#endif
     125
     126    newobj->next = NULL;
     127
     128    *hObject = MAKE_HANDLE(((char *)newobj - (char *)objHandleTable.objects)/sizeof(*newobj));
     129    newobj->dwUserData  = dwUserData;
     130    newobj->dwType      = dwType;
     131    newobj->dwGDI32Data = 0;
     132    newobj->dwFlags     = 0;
     133
     134    objHandleTable.iAllocated++;
     135#ifdef DEBUG
     136    if(objHandleTable.iAllocated > objHandleTable.dwMaxAllocated) {
     137        objHandleTable.dwMaxAllocated = objHandleTable.iAllocated;
     138    }
     139#endif
     140    objTableMutex.leave();
     141    dprintf2(("ObjAllocateHandle %x type %d", *hObject, dwType));
    101142    return TRUE;
    102143}
     
    106147{
    107148    hObject &= OBJHANDLE_MAGIC_MASK;
    108     if(hObject < MAX_OBJECT_HANDLES) {
     149    if(hObject < MAX_OBJECT_HANDLES)
     150    {
    109151        objTableMutex.enter();
    110         if(!(objHandleTable[hObject].dwFlags & OBJHANDLE_FLAG_NODELETE))
    111         {
    112             objHandleTable[hObject].dwUserData = 0;
    113             objHandleTable[hObject].dwType     = HNDL_NONE;
    114 ////            if(lowestFreeIndex == -1 || hObject < lowestFreeIndex)
    115             if(lowestFreeIndex == -1)
    116                 lowestFreeIndex = hObject;
     152        GdiObject *obj = &objHandleTable.objects[hObject];
     153        if(!(obj->dwFlags & OBJHANDLE_FLAG_NODELETE))
     154        {
     155            dprintf2(("ObjDeleteHandle %x type %d", MAKE_HANDLE(hObject), obj->dwType));
     156
     157            obj->dwUserData = 0;
     158            obj->dwType     = HNDL_NONE;
     159            obj->next       = NULL;
     160
     161            //add to the tail of the free object list
     162            if(objHandleTable.tailfree)
     163                objHandleTable.tailfree->next = obj;
     164
     165#ifdef DEBUG
     166            obj->prev       = objHandleTable.tailfree;
     167#endif
     168            objHandleTable.tailfree = obj;
     169            if(objHandleTable.headfree == NULL)
     170                objHandleTable.headfree = obj;
     171
     172            objHandleTable.iAllocated--;
     173            if(objHandleTable.iAllocated < 0) DebugInt3();
    117174        }
    118175        else {
     
    133190    hObject &= OBJHANDLE_MAGIC_MASK;
    134191    if(hObject < MAX_OBJECT_HANDLES &&
    135        ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) ||
    136        dwType == objHandleTable[hObject].dwType))
    137     {
    138         dwUserData = objHandleTable[hObject].dwUserData;
     192       ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
     193       dwType == objHandleTable.objects[hObject].dwType))
     194    {
     195        dwUserData = objHandleTable.objects[hObject].dwUserData;
    139196    }
    140197    objTableMutex.leave();
     
    150207    hObject &= OBJHANDLE_MAGIC_MASK;
    151208    if(hObject < MAX_OBJECT_HANDLES &&
    152        ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) ||
    153        dwType == objHandleTable[hObject].dwType))
    154     {
    155         objHandleTable[hObject].dwUserData = dwUserData;
     209       ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
     210       dwType == objHandleTable.objects[hObject].dwType))
     211    {
     212        objHandleTable.objects[hObject].dwUserData = dwUserData;
    156213        fSuccess = TRUE;
    157214    }
     
    168225    hObject &= OBJHANDLE_MAGIC_MASK;
    169226    if(hObject < MAX_OBJECT_HANDLES &&
    170        ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) ||
    171        dwType == objHandleTable[hObject].dwType))
    172     {
    173         dwGDI32Data = objHandleTable[hObject].dwGDI32Data;
     227       ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
     228       dwType == objHandleTable.objects[hObject].dwType))
     229    {
     230        dwGDI32Data = objHandleTable.objects[hObject].dwGDI32Data;
    174231    }
    175232    objTableMutex.leave();
     
    185242    hObject &= OBJHANDLE_MAGIC_MASK;
    186243    if(hObject < MAX_OBJECT_HANDLES &&
    187        ((dwType == HNDL_ANY && objHandleTable[hObject].dwType != HNDL_NONE) ||
    188        dwType == objHandleTable[hObject].dwType))
    189     {
    190         objHandleTable[hObject].dwGDI32Data = dwGDI32Data;
     244       ((dwType == HNDL_ANY && objHandleTable.objects[hObject].dwType != HNDL_NONE) ||
     245       dwType == objHandleTable.objects[hObject].dwType))
     246    {
     247        objHandleTable.objects[hObject].dwGDI32Data = dwGDI32Data;
    191248        fSuccess = TRUE;
    192249    }
     
    202259    objTableMutex.enter();
    203260    hObject &= OBJHANDLE_MAGIC_MASK;
    204     if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE)
    205     {
    206         dwFlags = objHandleTable[hObject].dwFlags;
     261    if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE)
     262    {
     263        dwFlags = objHandleTable.objects[hObject].dwFlags;
    207264    }
    208265    objTableMutex.leave();
     
    217274    objTableMutex.enter();
    218275    hObject &= OBJHANDLE_MAGIC_MASK;
    219     if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE) {
     276    if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE) {
    220277        if(fSet) {
    221              objHandleTable[hObject].dwFlags |= dwFlag;
    222         }
    223         else objHandleTable[hObject].dwFlags &= ~dwFlag;
     278             objHandleTable.objects[hObject].dwFlags |= dwFlag;
     279        }
     280        else objHandleTable.objects[hObject].dwFlags &= ~dwFlag;
    224281
    225282        dprintf(("ObjSetHandleFlag %x -> %x", MAKE_HANDLE(hObject), dwFlag));
     
    238295    objTableMutex.enter();
    239296    hObject &= OBJHANDLE_MAGIC_MASK;
    240     if(hObject < MAX_OBJECT_HANDLES && objHandleTable[hObject].dwType != HNDL_NONE) {
    241         objtype = objHandleTable[hObject].dwType;
     297    if(hObject < MAX_OBJECT_HANDLES && objHandleTable.objects[hObject].dwType != HNDL_NONE) {
     298        objtype = objHandleTable.objects[hObject].dwType;
    242299    }
    243300    objTableMutex.leave();
    244301    return objtype;
    245302}
     303//******************************************************************************
     304//******************************************************************************
     305#ifdef DEBUG
     306void dumpObjectType(char *szType, DWORD dwType)
     307{
     308    for(int i=0;i<MAX_OBJECT_HANDLES;i++) {
     309        if(objHandleTable.objects[i].dwUserData != 0 && objHandleTable.objects[i].dwType == dwType) {
     310            dprintf(("%s object %x %x %x %x time %x", szType, MAKE_HANDLE(i), objHandleTable.objects[i].dwUserData, objHandleTable.objects[i].dwGDI32Data, objHandleTable.objects[i].dwFlags, objHandleTable.objects[i].dwTime));
     311        }
     312    }
     313}
     314//******************************************************************************
     315//******************************************************************************
     316void WIN32API ObjDumpObjects()
     317{
     318    dprintf(("Open object handles (%d, max %d): (time %x)", objHandleTable.iAllocated, objHandleTable.dwMaxAllocated, GetCurrentTime()));
     319
     320    dumpObjectType("HNDL_PEN", HNDL_PEN);
     321    dumpObjectType("HNDL_BRUSH", HNDL_BRUSH);
     322    dumpObjectType("HNDL_DC", HNDL_DC);
     323    dumpObjectType("HNDL_METADC", HNDL_METADC);
     324    dumpObjectType("HNDL_PALETTE", HNDL_PALETTE);
     325    dumpObjectType("HNDL_FONT", HNDL_FONT);
     326    dumpObjectType("HNDL_BITMAP", HNDL_BITMAP);
     327    dumpObjectType("HNDL_DIBSECTION", HNDL_DIBSECTION);
     328    dumpObjectType("HNDL_REGION", HNDL_REGION);
     329    dumpObjectType("HNDL_METAFILE", HNDL_METAFILE);
     330    dumpObjectType("HNDL_ENHMETAFILE", HNDL_ENHMETAFILE);
     331    dumpObjectType("HNDL_MEMDC", HNDL_MEMDC);
     332    dumpObjectType("HNDL_EXTPEN", HNDL_EXTPEN);
     333    dumpObjectType("HNDL_ENHMETADC", HNDL_ENHMETADC);
     334    dumpObjectType("HNDL_MENU", HNDL_MENU);
     335    dumpObjectType("HNDL_ACCEL", HNDL_ACCEL);
     336    dumpObjectType("HNDL_CURSORICON", HNDL_CURSORICON);
     337    dumpObjectType("HNDL_DDELP", HNDL_DDELP);
     338}
     339#endif
    246340//******************************************************************************
    247341//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.