Alexandre Julliard : gdi32: Convert the driver list to a standard Wine list .
Alexandre Julliard
julliard at winehq.org
Tue Apr 20 11:32:22 CDT 2010
Module: wine
Branch: master
Commit: 3858ad7bd39aa0ecd82c37b322e726efb994d622
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3858ad7bd39aa0ecd82c37b322e726efb994d622
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 20 13:20:49 2010 +0200
gdi32: Convert the driver list to a standard Wine list.
---
dlls/gdi32/driver.c | 44 +++++++++++++++++---------------------------
1 files changed, 17 insertions(+), 27 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 639e4a8..05c2513 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -33,20 +33,20 @@
#include "gdi_private.h"
#include "wine/unicode.h"
+#include "wine/list.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(driver);
struct graphics_driver
{
- struct graphics_driver *next;
- struct graphics_driver *prev;
+ struct list entry;
HMODULE module; /* module handle */
unsigned int count; /* reference count */
DC_FUNCTIONS funcs;
};
-static struct graphics_driver *first_driver;
+static struct list drivers = LIST_INIT( drivers );
static struct graphics_driver *display_driver;
static CRITICAL_SECTION driver_section;
@@ -68,8 +68,6 @@ static struct graphics_driver *create_driver( HMODULE module )
struct graphics_driver *driver;
if (!(driver = HeapAlloc( GetProcessHeap(), 0, sizeof(*driver)))) return NULL;
- driver->next = NULL;
- driver->prev = NULL;
driver->module = module;
driver->count = 1;
@@ -213,10 +211,7 @@ static struct graphics_driver *create_driver( HMODULE module )
}
else memset( &driver->funcs, 0, sizeof(driver->funcs) );
- /* add it to the list */
- driver->prev = NULL;
- if ((driver->next = first_driver)) driver->next->prev = driver;
- first_driver = driver;
+ list_add_head( &drivers, &driver->entry );
return driver;
}
@@ -293,7 +288,7 @@ const DC_FUNCTIONS *DRIVER_load_driver( LPCWSTR name )
if ((module = GetModuleHandleW( name )))
{
- for (driver = first_driver; driver; driver = driver->next)
+ LIST_FOR_EACH_ENTRY( driver, &drivers, struct graphics_driver, entry )
{
if (driver->module == module)
{
@@ -333,9 +328,9 @@ const DC_FUNCTIONS *DRIVER_get_driver( const DC_FUNCTIONS *funcs )
struct graphics_driver *driver;
EnterCriticalSection( &driver_section );
- for (driver = first_driver; driver; driver = driver->next)
+ LIST_FOR_EACH_ENTRY( driver, &drivers, struct graphics_driver, entry )
if (&driver->funcs == funcs) break;
- if (!driver) ERR( "driver not found, trouble ahead\n" );
+ if (&driver->entry == &drivers) ERR( "driver not found, trouble ahead\n" );
driver->count++;
LeaveCriticalSection( &driver_section );
return funcs;
@@ -353,21 +348,16 @@ void DRIVER_release_driver( const DC_FUNCTIONS *funcs )
EnterCriticalSection( &driver_section );
- for (driver = first_driver; driver; driver = driver->next)
- if (&driver->funcs == funcs) break;
-
- if (!driver) goto done;
- if (--driver->count) goto done;
-
- /* removed last reference, free it */
- if (driver->next) driver->next->prev = driver->prev;
- if (driver->prev) driver->prev->next = driver->next;
- else first_driver = driver->next;
- if (driver == display_driver) display_driver = NULL;
-
- FreeLibrary( driver->module );
- HeapFree( GetProcessHeap(), 0, driver );
- done:
+ LIST_FOR_EACH_ENTRY( driver, &drivers, struct graphics_driver, entry )
+ {
+ if (&driver->funcs != funcs) continue;
+ if (--driver->count) break;
+ list_remove( &driver->entry );
+ if (driver == display_driver) display_driver = NULL;
+ FreeLibrary( driver->module );
+ HeapFree( GetProcessHeap(), 0, driver );
+ break;
+ }
LeaveCriticalSection( &driver_section );
}
More information about the wine-cvs
mailing list