Make VIRTUAL_SetFaultHandler an internal function
Rob Shearman
rob at codeweavers.com
Sun Apr 17 08:44:57 CDT 2005
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
More information about the wine-devel
mailing list