[PATCH] Fix performance problem in debug tracing

Daniel Santos daniel.santos at pobox.com
Fri Aug 28 18:12:59 CDT 2015


Currently, if any classes are passed to WINEDEBUG (nb_debug_options > 0) then
the initial lazy-init call to __wine_dbg_get_channel_flags() never sets the
flags in the struct __wine_debug_channel in the object file, resulting in all
45k trace calls in wine making a function call, running bsearch on
debug_options with string compare, etc. This patch fixes the problem by
setting the flags in all cases where __wine_dbg_get_channel_flags() is called
and flags has the __WINE_DBCL_INIT bit set.

The only possibly negative consequence that I can see is that
__wine_dbg_set_channel_flags() will be ineffective if an initial call has been
made from a tracepoint in a given object file, since the struct
__wine_debug_channel will have already been initialized. This function isn't
used anywhere in the tree, so I'm guessing that it is maybe used by some via
the debugger.
---
 libs/wine/debug.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/libs/wine/debug.c b/libs/wine/debug.c
index 8b04ef9..8a82955 100644
--- a/libs/wine/debug.c
+++ b/libs/wine/debug.c
@@ -62,15 +62,19 @@ unsigned char __wine_dbg_get_channel_flags( struct __wine_debug_channel *channel
 {
     if (nb_debug_options == -1) debug_init();
 
-    if (nb_debug_options)
+    /* init if uninitialized */
+    if (channel->flags & (1 << __WINE_DBCL_INIT))
     {
-        struct __wine_debug_channel *opt = bsearch( channel->name, debug_options, nb_debug_options,
-                                                    sizeof(debug_options[0]), cmp_name );
-        if (opt) return opt->flags;
+        struct __wine_debug_channel *opt = NULL;
+
+        if (nb_debug_options)
+            opt = bsearch( channel->name, debug_options, nb_debug_options,
+                           sizeof(debug_options[0]), cmp_name );
+
+        channel->flags = opt ? opt->flags : default_flags;
     }
-    /* no option for this channel */
-    if (channel->flags & (1 << __WINE_DBCL_INIT)) channel->flags = default_flags;
-    return default_flags;
+
+    return channel->flags;
 }
 
 /* set the flags to use for a given channel; return 0 if the channel is not available to set */
-- 
2.4.6




More information about the wine-patches mailing list