[PATCH 1/5] [DbgHelp]: factorize a bit the ELF enumeration callbacks

Eric Pouech eric.pouech at orange.fr
Mon Dec 27 08:03:12 CST 2010




A+
---

 dlls/dbghelp/elf_module.c |  128 +++++++++++++++++++++------------------------
 1 files changed, 61 insertions(+), 67 deletions(-)


diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index b3502ca..b8ddfcb 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1279,65 +1279,6 @@ static BOOL elf_enum_modules_internal(const struct process* pcs,
     return TRUE;
 }
 
-struct elf_sync
-{
-    struct process*     pcs;
-    struct elf_info     elf_info;
-};
-
-static BOOL elf_enum_sync_cb(const WCHAR* name, unsigned long load_addr,
-                             unsigned long dyn_addr, void* user)
-{
-    struct elf_sync*    es = user;
-
-    elf_search_and_load_file(es->pcs, name, load_addr, dyn_addr, &es->elf_info);
-    return TRUE;
-}
-
-/******************************************************************
- *		elf_synchronize_module_list
- *
- * this functions rescans the debuggee module's list and synchronizes it with
- * the one from 'pcs', ie:
- * - if a module is in debuggee and not in pcs, it's loaded into pcs
- * - if a module is in pcs and not in debuggee, it's unloaded from pcs
- */
-BOOL	elf_synchronize_module_list(struct process* pcs)
-{
-    struct module*      module;
-    struct elf_sync     es;
-
-    for (module = pcs->lmodules; module; module = module->next)
-    {
-        if (module->type == DMT_ELF && !module->is_virtual)
-            module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0;
-    }
-
-    es.pcs = pcs;
-    es.elf_info.flags = ELF_INFO_MODULE;
-    if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
-        return FALSE;
-
-    module = pcs->lmodules;
-    while (module)
-    {
-        if (module->type == DMT_ELF && !module->is_virtual)
-        {
-            struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
-
-            if (!elf_info->elf_mark && !elf_info->elf_loader)
-            {
-                module_remove(pcs, module);
-                /* restart all over */
-                module = pcs->lmodules;
-                continue;
-            }
-        }
-        module = module->next;
-    }
-    return TRUE;
-}
-
 /******************************************************************
  *		elf_search_loader
  *
@@ -1440,19 +1381,25 @@ static BOOL elf_load_cb(const WCHAR* name, unsigned long load_addr,
                         unsigned long dyn_addr, void* user)
 {
     struct elf_load*    el = user;
+    BOOL                ret = TRUE;
     const WCHAR*        p;
 
-    /* memcmp is needed for matches when bufstr contains also version information
-     * el->name: libc.so, name: libc.so.6.0
-     */
-    p = strrchrW(name, '/');
-    if (!p++) p = name;
-    if (!memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
+    if (el->name)
+    {
+        /* memcmp is needed for matches when bufstr contains also version information
+         * el->name: libc.so, name: libc.so.6.0
+         */
+        p = strrchrW(name, '/');
+        if (!p++) p = name;
+    }
+
+    if (!el->name || !memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
     {
         el->ret = elf_search_and_load_file(el->pcs, name, load_addr, dyn_addr, &el->elf_info);
-        return FALSE;
+        if (el->name) ret = FALSE;
     }
-    return TRUE;
+
+    return ret;
 }
 
 /******************************************************************
@@ -1494,6 +1441,53 @@ struct module*  elf_load_module(struct process* pcs, const WCHAR* name, unsigned
     return el.elf_info.module;
 }
 
+/******************************************************************
+ *		elf_synchronize_module_list
+ *
+ * this functions rescans the debuggee module's list and synchronizes it with
+ * the one from 'pcs', ie:
+ * - if a module is in debuggee and not in pcs, it's loaded into pcs
+ * - if a module is in pcs and not in debuggee, it's unloaded from pcs
+ */
+BOOL	elf_synchronize_module_list(struct process* pcs)
+{
+    struct module*      module;
+    struct elf_load     el;
+
+    for (module = pcs->lmodules; module; module = module->next)
+    {
+        if (module->type == DMT_ELF && !module->is_virtual)
+            module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0;
+    }
+
+    el.pcs = pcs;
+    el.elf_info.flags = ELF_INFO_MODULE;
+    el.ret = FALSE;
+    el.name = NULL; /* fetch all modules */
+
+    if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
+        return FALSE;
+
+    module = pcs->lmodules;
+    while (module)
+    {
+        if (module->type == DMT_ELF && !module->is_virtual)
+        {
+            struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
+
+            if (!elf_info->elf_mark && !elf_info->elf_loader)
+            {
+                module_remove(pcs, module);
+                /* restart all over */
+                module = pcs->lmodules;
+                continue;
+            }
+        }
+        module = module->next;
+    }
+    return TRUE;
+}
+
 #else	/* !__ELF__ */
 
 BOOL         elf_find_section(struct image_file_map* fmap, const char* name,




More information about the wine-patches mailing list