Alexandre Julliard : winecrt0: Add a fallback implementation of __wine_dbg_header().
Alexandre Julliard
julliard at winehq.org
Wed Apr 3 15:26:18 CDT 2019
Module: wine
Branch: master
Commit: 93a9d85488a66e0d40e311d7027ec076c8b2bd20
URL: https://source.winehq.org/git/wine.git/?a=commit;h=93a9d85488a66e0d40e311d7027ec076c8b2bd20
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 3 19:27:24 2019 +0200
winecrt0: Add a fallback implementation of __wine_dbg_header().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winecrt0/debug.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/dlls/winecrt0/debug.c b/dlls/winecrt0/debug.c
index 8003e03..d7c170c 100644
--- a/dlls/winecrt0/debug.c
+++ b/dlls/winecrt0/debug.c
@@ -29,9 +29,15 @@
#include "wine/debug.h"
#include "wine/heap.h"
+WINE_DECLARE_DEBUG_CHANNEL(pid);
+WINE_DECLARE_DEBUG_CHANNEL(timestamp);
+
static const char * (__cdecl *p__wine_dbg_strdup)( const char *str );
static int (__cdecl *p__wine_dbg_output)( const char *str );
static unsigned char (__cdecl *p__wine_dbg_get_channel_flags)( struct __wine_debug_channel *channel );
+static int (__cdecl *p__wine_dbg_header)( enum __wine_debug_class cls,
+ struct __wine_debug_channel *channel,
+ const char *function );
static const char * const debug_classes[] = { "fixme", "err", "warn", "trace" };
@@ -39,6 +45,7 @@ static unsigned char default_flags = (1 << __WINE_DBCL_ERR) | (1 << __WINE_DBCL_
static int nb_debug_options = -1;
static int options_size;
static struct __wine_debug_channel *debug_options;
+static DWORD partial_line_tid; /* id of the last thread to output a partial line */
static void load_func( void **func, const char *name, void *def )
{
@@ -163,7 +170,36 @@ static const char * __cdecl fallback__wine_dbg_strdup( const char *str )
static int __cdecl fallback__wine_dbg_output( const char *str )
{
- return fwrite( str, 1, strlen(str), stderr );
+ size_t len = strlen( str );
+
+ if (!len) return 0;
+ interlocked_xchg( (LONG *)&partial_line_tid, str[len - 1] != '\n' ? GetCurrentThreadId() : 0 );
+ return fwrite( str, 1, len, stderr );
+}
+
+static int __cdecl fallback__wine_dbg_header( enum __wine_debug_class cls,
+ struct __wine_debug_channel *channel,
+ const char *function )
+{
+ char buffer[200], *pos = buffer;
+
+ if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
+
+ /* skip header if partial line and no other thread came in between */
+ if (partial_line_tid == GetCurrentThreadId()) return 0;
+
+ if (TRACE_ON(timestamp))
+ {
+ ULONG ticks = GetTickCount();
+ pos += sprintf( pos, "%3u.%03u:", ticks / 1000, ticks % 1000 );
+ }
+ if (TRACE_ON(pid)) pos += sprintf( pos, "%04x:", GetCurrentProcessId() );
+ pos += sprintf( pos, "%04x:", GetCurrentThreadId() );
+ if (function && cls < ARRAY_SIZE( debug_classes ))
+ snprintf( pos, sizeof(buffer) - (pos - buffer), "%s:%s:%s ",
+ debug_classes[cls], channel->name, function );
+
+ return fwrite( buffer, 1, strlen(buffer), stderr );
}
static unsigned char __cdecl fallback__wine_dbg_get_channel_flags( struct __wine_debug_channel *channel )
@@ -205,4 +241,11 @@ unsigned char __cdecl __wine_dbg_get_channel_flags( struct __wine_debug_channel
return p__wine_dbg_get_channel_flags( channel );
}
+int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *function )
+{
+ LOAD_FUNC( __wine_dbg_header );
+ return p__wine_dbg_header( cls, channel, function );
+}
+
#endif /* _WIN32 */
More information about the wine-cvs
mailing list