Alexandre Julliard : user32: Move freeing of a 16-bit module' s classes to wnd16.c.

Alexandre Julliard julliard at winehq.org
Tue Dec 22 09:58:56 CST 2009


Module: wine
Branch: master
Commit: 0fbe20a254bd947813480b348230a6f3d6bc97a2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0fbe20a254bd947813480b348230a6f3d6bc97a2

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Dec 22 12:33:26 2009 +0100

user32: Move freeing of a 16-bit module's classes to wnd16.c.

---

 dlls/user32/class.c    |   32 --------------------------
 dlls/user32/controls.h |    2 +-
 dlls/user32/user16.c   |    5 ++-
 dlls/user32/wnd16.c    |   59 ++++++++++++++++++++++++++++++++++++++++++++---
 4 files changed, 59 insertions(+), 39 deletions(-)

diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index f7e0f25..36315b0 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -255,38 +255,6 @@ static void CLASS_FreeClass( CLASS *classPtr )
 
 
 /***********************************************************************
- *           CLASS_FreeModuleClasses
- */
-void CLASS_FreeModuleClasses( HMODULE16 hModule )
-{
-    struct list *ptr, *next;
-
-    TRACE("0x%08x\n", hModule);
-
-    USER_Lock();
-    for (ptr = list_head( &class_list ); ptr; ptr = next)
-    {
-        CLASS *class = LIST_ENTRY( ptr, CLASS, entry );
-        next = list_next( &class_list, ptr );
-        if (class->hInstance == HINSTANCE_32(hModule))
-        {
-            BOOL ret;
-
-            SERVER_START_REQ( destroy_class )
-            {
-                req->atom = class->atomName;
-                req->instance = wine_server_client_ptr( class->hInstance );
-                ret = !wine_server_call_err( req );
-            }
-            SERVER_END_REQ;
-            if (ret) CLASS_FreeClass( class );
-        }
-    }
-    USER_Unlock();
-}
-
-
-/***********************************************************************
  *           CLASS_FindClass
  *
  * Return a pointer to the class.
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 956c32e..c3fd4ec 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -126,6 +126,7 @@ extern LRESULT StaticWndProc_common(HWND,UINT,WPARAM,LPARAM,BOOL) DECLSPEC_HIDDE
 
 /* 16-bit support */
 extern HWND create_window16(CREATESTRUCTW*,LPCWSTR,HINSTANCE,UINT) DECLSPEC_HIDDEN;
+extern void free_module_classes(HINSTANCE16) DECLSPEC_HIDDEN;
 extern void register_wow_handlers(void) DECLSPEC_HIDDEN;
 extern void WINAPI UserRegisterWowHandlers( const struct wow_handlers16 *new,
                                             struct wow_handlers32 *orig );
@@ -138,7 +139,6 @@ extern void CLASS_RegisterBuiltinClasses(void) DECLSPEC_HIDDEN;
 extern WNDPROC get_class_winproc( struct tagCLASS *class ) DECLSPEC_HIDDEN;
 extern struct dce *get_class_dce( struct tagCLASS *class ) DECLSPEC_HIDDEN;
 extern struct dce *set_class_dce( struct tagCLASS *class, struct dce *dce ) DECLSPEC_HIDDEN;
-extern void CLASS_FreeModuleClasses( HMODULE16 hModule ) DECLSPEC_HIDDEN;
 
 /* defwnd proc */
 extern HBRUSH DEFWND_ControlColor( HDC hDC, UINT ctlType ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/user16.c b/dlls/user32/user16.c
index c6fd3d7..4daaafd 100644
--- a/dlls/user32/user16.c
+++ b/dlls/user32/user16.c
@@ -1527,9 +1527,10 @@ void WINAPI SignalProc16( HANDLE16 hModule, UINT16 code,
 {
     if (code == USIG16_DLL_UNLOAD)
     {
+        hModule = GetExePtr(hModule);
         /* HOOK_FreeModuleHooks( hModule ); */
-        CLASS_FreeModuleClasses( hModule );
-        free_module_icons( GetExePtr(hModule) );
+        free_module_classes( hModule );
+        free_module_icons( hModule );
     }
 }
 
diff --git a/dlls/user32/wnd16.c b/dlls/user32/wnd16.c
index ad99e6d..6968683 100644
--- a/dlls/user32/wnd16.c
+++ b/dlls/user32/wnd16.c
@@ -23,6 +23,7 @@
 #include "win.h"
 #include "controls.h"
 #include "user_private.h"
+#include "wine/list.h"
 #include "wine/server.h"
 
 /* size of buffer needed to store an atom string */
@@ -34,6 +35,15 @@
 
 static HWND16 hwndSysModal;
 
+struct class_entry
+{
+    struct list entry;
+    ATOM        atom;
+    HINSTANCE16 inst;
+};
+
+static struct list class_list = LIST_INIT( class_list );
+
 struct wnd_enum_info
 {
     WNDENUMPROC16 proc;
@@ -62,6 +72,19 @@ static inline HWND full_insert_after_hwnd( HWND16 hwnd )
     return ret;
 }
 
+void free_module_classes( HINSTANCE16 inst )
+{
+    struct class_entry *class, *next;
+
+    LIST_FOR_EACH_ENTRY_SAFE( class, next, &class_list, struct class_entry, entry )
+    {
+        if (class->inst != inst) continue;
+        list_remove( &class->entry );
+        UnregisterClassA( (LPCSTR)MAKEINTATOM(class->atom), HINSTANCE_32(class->inst) );
+        HeapFree( GetProcessHeap(), 0, class );
+    }
+}
+
 /**************************************************************************
  *              MessageBox   (USER.1)
  */
@@ -1532,22 +1555,34 @@ BOOL16 WINAPI SetWindowPlacement16( HWND16 hwnd, const WINDOWPLACEMENT16 *wp16 )
  */
 ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
 {
+    struct class_entry *class;
     WNDCLASSEXA wc32;
+    HINSTANCE16 inst;
+    ATOM atom;
+
+    inst = GetExePtr( wc->hInstance );
+    if (!inst) inst = GetModuleHandle16( NULL );
 
     wc32.cbSize        = sizeof(wc32);
     wc32.style         = wc->style;
     wc32.lpfnWndProc   = WINPROC_AllocProc16( wc->lpfnWndProc );
     wc32.cbClsExtra    = wc->cbClsExtra;
     wc32.cbWndExtra    = wc->cbWndExtra;
-    wc32.hInstance     = HINSTANCE_32(GetExePtr(wc->hInstance));
-    if (!wc32.hInstance) wc32.hInstance = HINSTANCE_32(GetModuleHandle16(NULL));
+    wc32.hInstance     = HINSTANCE_32(inst);
     wc32.hIcon         = HICON_32(wc->hIcon);
     wc32.hCursor       = HCURSOR_32(wc->hCursor);
     wc32.hbrBackground = HBRUSH_32(wc->hbrBackground);
     wc32.lpszMenuName  = MapSL(wc->lpszMenuName);
     wc32.lpszClassName = MapSL(wc->lpszClassName);
     wc32.hIconSm       = HICON_32(wc->hIconSm);
-    return RegisterClassExA( &wc32 );
+    atom = RegisterClassExA( &wc32 );
+    if ((class = HeapAlloc( GetProcessHeap(), 0, sizeof(*class) )))
+    {
+        class->atom = atom;
+        class->inst = inst;
+        list_add_tail( &class_list, &class->entry );
+    }
+    return atom;
 }
 
 
@@ -1617,8 +1652,24 @@ INT16 WINAPI GetPriorityClipboardFormat16( UINT16 *list, INT16 count )
  */
 BOOL16 WINAPI UnregisterClass16( LPCSTR className, HINSTANCE16 hInstance )
 {
+    ATOM atom;
+
     if (hInstance == GetModuleHandle16("user")) hInstance = 0;
-    return UnregisterClassA( className, HINSTANCE_32(GetExePtr( hInstance )) );
+    else hInstance = GetExePtr( hInstance );
+
+    if ((atom = GlobalFindAtomA( className )))
+    {
+        struct class_entry *class;
+        LIST_FOR_EACH_ENTRY( class, &class_list, struct class_entry, entry )
+        {
+            if (class->inst != hInstance) continue;
+            if (class->atom != atom) continue;
+            list_remove( &class->entry );
+            HeapFree( GetProcessHeap(), 0, class );
+            break;
+        }
+    }
+    return UnregisterClassA( className, HINSTANCE_32(hInstance) );
 }
 
 




More information about the wine-cvs mailing list