Dimitrie O. Paun wrote:

On Thu, Apr 14, 2005 at 03:05:36PM +0200, Alexandre Julliard wrote:


Actually it should be possible to handle the fault using a vectored
handler, without requiring internal functions at all.



Completely untested (what do people use to test DIB handling?), but it compiles. Is something like this what you had it mind?




+/***********************************************************************
+ * mem_area_add
+ *
+ * Adds a memory area to the list.
+ *
+ * PARAMS
+ * base [I] Beginning address of the area
+ * size [I] Size of the area
+ * data [I] Data associated with the area
+ *
+ */
+static struct mem_area *mem_area_add( const void *base, UINT size, void *data )
+{
+ struct mem_area *area;
+
+ EnterCriticalSection( &csMemAreas );
+
+ area = HeapAlloc(GetProcessHeap(), 0, sizeof(*area));



You can put the HeapAlloc outside of the critical section.

+ if (area)
+ {
+ area->base = base;
+ area->size = size;
+ area->data = data;
+ list_add_head( &mem_areas_list, &area->entry );
+ }
+
+ LeaveCriticalSection( &csMemAreas );
+
+ return area;
+}
+
+
+/***********************************************************************
+ * mem_area_del
+ *
+ * Removes a memory area from the list.
+ *
+ * PARAMS
+ * addr [I] Address
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+static BOOL mem_area_del( const void *addr )
+{
+ struct mem_area *area;
+
+ EnterCriticalSection( &csMemAreas );
+ area = mem_area_find( addr );
+ if (area) list_remove( &area->entry );
+ LeaveCriticalSection( &csMemAreas );



Why don't you free area here?

+
+ return area != NULL;
+}
+
+
/* Some of the following helper functions are duplicated in
dlls/gdi/dib.c



Rob



Reply via email to