Changeset 10374 for trunk/src/gdi32/objhandle.cpp
- Timestamp:
- Jan 11, 2004, 12:43:22 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gdi32/objhandle.cpp
r9429 r10374 1 /* $Id: objhandle.cpp,v 1.3 1 2002-11-26 10:53:10sandervl Exp $ */1 /* $Id: objhandle.cpp,v 1.32 2004-01-11 11:42:18 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Handle Management Code for OS/2 … … 5 5 * 6 6 * Copyright 2000-2002 Sander van Leeuwen (sandervl@xs4all.nl) 7 * Copyright 2003 Innotek Systemberatung GmbH (sandervl@innotek.de) 7 8 * 8 9 * TODO: The table should be dynamically increased when necessary … … 37 38 //****************************************************************************** 38 39 39 typedef struct { 40 DWORD dwUserData; 41 DWORD dwGDI32Data; 42 DWORD dwFlags; 43 DWORD dwType; 40 typedef 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; 44 51 } GdiObject; 45 52 46 static GdiObject *objHandleTable = NULL; 47 static ULONG lowestFreeIndex = 1; 48 static VMutex objTableMutex; 53 typedef 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 64 static GdiObjectTable objHandleTable = { 0 }; 65 static VMutex objTableMutex; 49 66 50 67 //****************************************************************************** … … 53 70 { 54 71 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) { 60 79 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) { 66 108 //oops, out of handles 67 109 objTableMutex.leave(); … … 70 112 return FALSE; 71 113 } 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)); 101 142 return TRUE; 102 143 } … … 106 147 { 107 148 hObject &= OBJHANDLE_MAGIC_MASK; 108 if(hObject < MAX_OBJECT_HANDLES) { 149 if(hObject < MAX_OBJECT_HANDLES) 150 { 109 151 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(); 117 174 } 118 175 else { … … 133 190 hObject &= OBJHANDLE_MAGIC_MASK; 134 191 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; 139 196 } 140 197 objTableMutex.leave(); … … 150 207 hObject &= OBJHANDLE_MAGIC_MASK; 151 208 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; 156 213 fSuccess = TRUE; 157 214 } … … 168 225 hObject &= OBJHANDLE_MAGIC_MASK; 169 226 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; 174 231 } 175 232 objTableMutex.leave(); … … 185 242 hObject &= OBJHANDLE_MAGIC_MASK; 186 243 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; 191 248 fSuccess = TRUE; 192 249 } … … 202 259 objTableMutex.enter(); 203 260 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; 207 264 } 208 265 objTableMutex.leave(); … … 217 274 objTableMutex.enter(); 218 275 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) { 220 277 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; 224 281 225 282 dprintf(("ObjSetHandleFlag %x -> %x", MAKE_HANDLE(hObject), dwFlag)); … … 238 295 objTableMutex.enter(); 239 296 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; 242 299 } 243 300 objTableMutex.leave(); 244 301 return objtype; 245 302 } 303 //****************************************************************************** 304 //****************************************************************************** 305 #ifdef DEBUG 306 void 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 //****************************************************************************** 316 void 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 246 340 //****************************************************************************** 247 341 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.