Use a per-thread buffer and write(2) for debug traces. Removed debug_dumpstr.
diff --git a/if1632/relay.c b/if1632/relay.c index c161d4f..ede3cd8 100644 --- a/if1632/relay.c +++ b/if1632/relay.c
@@ -15,11 +15,10 @@ #include "builtin16.h" #include "task.h" #include "syslevel.h" -#include "debugstr.h" #include "debugtools.h" #include "main.h" -DEFAULT_DEBUG_CHANNEL(relay) +DEFAULT_DEBUG_CHANNEL(relay); /*********************************************************************** * RELAY_Init @@ -143,20 +142,14 @@ DPRINTF( "0x%08x", *(int *)args16 ); args16 += 4; break; - case 't': - DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 ); - if (HIWORD(*(SEGPTR *)args16)) - debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )); - args16 += 4; - break; case 'p': DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 ); args16 += 4; break; + case 't': case 'T': - DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 ); - if (HIWORD( *(SEGPTR *)args16 )) - debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )); + DPRINTF( "%04x:%04x %s", *(WORD *)(args16+2), *(WORD *)args16, + debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )) ); args16 += 4; break; } @@ -199,9 +192,8 @@ break; case 't': args16 -= 4; - DPRINTF( "0x%08x", *(int *)args16 ); - if (HIWORD(*(SEGPTR *)args16)) - debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )); + DPRINTF( "0x%08x %s", *(int *)args16, + debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ))); break; case 'p': args16 -= 4; @@ -209,9 +201,8 @@ break; case 'T': args16 -= 4; - DPRINTF( "%04x:%04x", *(WORD *)(args16+2), *(WORD *)args16 ); - if (HIWORD( *(SEGPTR *)args16 )) - debug_dumpstr( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 )); + DPRINTF( "%04x:%04x %s", *(WORD *)(args16+2), *(WORD *)args16, + debugres_a( (LPSTR)PTR_SEG_TO_LIN(*(SEGPTR *)args16 ))); break; } args++;
diff --git a/include/debugtools.h b/include/debugtools.h index 2abc0f7..3071ec2 100644 --- a/include/debugtools.h +++ b/include/debugtools.h
@@ -4,12 +4,15 @@ #ifdef __WINE__ /* Debugging interface is internal to Wine */ +#include <stdarg.h> #include <stdio.h> #include "config.h" -#include "debugstr.h" +#include "windef.h" #define DEBUG_RUNTIME +struct _GUID; + /* Internal definitions (do not use these directly) */ enum __DEBUG_CLASS { __DBCL_FIXME, __DBCL_ERR, __DBCL_WARN, __DBCL_TRACE, __DBCL_COUNT }; @@ -36,6 +39,25 @@ /* Exported definitions and macros */ +/* These function return a printable version of a string, including + quotes. The string will be valid for some time, but not indefinitely + as strings are re-used. */ +extern LPSTR debugstr_an (LPCSTR s, int n); +extern LPSTR debugstr_a (LPCSTR s); +extern LPSTR debugstr_wn (LPCWSTR s, int n); +extern LPSTR debugstr_w (LPCWSTR s); +extern LPSTR debugres_a (LPCSTR res); +extern LPSTR debugres_w (LPCWSTR res); +extern LPSTR debugstr_guid( const struct _GUID *id ); +extern LPSTR debugstr_hex_dump (const void *ptr, int len); +extern int dbg_vprintf( const char *format, va_list args ); + +#ifdef __GNUC__ +extern int dbg_printf(const char *format, ...) __attribute__((format (printf,1,2))); +#else +extern int dbg_printf(const char *format, ...); +#endif + /* use configure to allow user to compile out debugging messages */ #ifndef NO_TRACE_MSGS #define TRACE __DPRINTF(__DBCL_TRACE,*DBCH_DEFAULT)
diff --git a/include/thread.h b/include/thread.h index a08dc18..e1813b4 100644 --- a/include/thread.h +++ b/include/thread.h
@@ -94,10 +94,11 @@ int socket; /* --3 204 Socket for server communication */ void *buffer; /* --3 208 Buffer shared with server */ int buffer_size; /* --3 20c Size of server buffer */ + void *debug_info; /* --3 210 Info for debugstr functions */ /* here is plenty space for wine specific fields (don't forget to change pad6!!) */ /* the following are nt specific fields */ - DWORD pad6[634]; /* --n 210 */ + DWORD pad6[633]; /* --n 214 */ UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */ USHORT StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */ DWORD pad7; /* --n e0c */
diff --git a/misc/debugstr.c b/misc/debugstr.c index c505e6c..9c5fd30 100644 --- a/misc/debugstr.c +++ b/misc/debugstr.c
@@ -1,30 +1,46 @@ -#include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <ctype.h> -#include "debugstr.h" #include "debugtools.h" #include "wtypes.h" -#include "xmalloc.h" +#include "thread.h" /* ---------------------------------------------------------------------- */ -#define SAVE_STRING_COUNT 50 -static void *strings[SAVE_STRING_COUNT]; -static int nextstring; +struct debug_info +{ + char *str_pos; /* current position in strings buffer */ + char *out_pos; /* current position in output buffer */ + char strings[500]; /* buffer for temporary strings */ + char output[500]; /* current output line */ +}; + +static inline struct debug_info *get_info(void) +{ + struct debug_info *info = NtCurrentTeb()->debug_info; + if (!info) + { + NtCurrentTeb()->debug_info = info = HeapAlloc( GetProcessHeap(), 0, sizeof(*info) ); + info->str_pos = info->strings; + info->out_pos = info->output; + } + return info; +} /* ---------------------------------------------------------------------- */ static void * gimme1 (int n) { - void *res; - if (strings[nextstring]) free (strings[nextstring]); - res = strings[nextstring] = xmalloc (n); - if (++nextstring == SAVE_STRING_COUNT) nextstring = 0; - return res; + struct debug_info *info = get_info(); + char *res = info->str_pos; + + if (res + n >= &info->strings[sizeof(info->strings)]) res = info->strings; + info->str_pos = res + n; + return res; } /* ---------------------------------------------------------------------- */ @@ -176,39 +192,23 @@ /* ---------------------------------------------------------------------- */ -void debug_dumpstr (LPCSTR s) +int dbg_vprintf( const char *format, va_list args ) { - fputc ('"', stderr); - while (*s) + struct debug_info *info = get_info(); + + int ret = vsprintf( info->out_pos, format, args ); + char *p = strrchr( info->out_pos, '\n' ); + if (!p) info->out_pos += ret; + else { - switch (*s) - { - case '\\': - case '"': - fputc ('\\', stderr); - fputc (*s, stderr); - break; - case '\n': - fputc ('\\', stderr); - fputc ('n', stderr); - break; - case '\r': - fputc ('\\', stderr); - fputc ('r', stderr); - break; - case '\t': - fputc ('\\', stderr); - fputc ('t', stderr); - break; - default: - if (*s<' ') - fprintf (stderr, "\\0x%02x", *s); - else - fputc (*s, stderr); - } - s++; + char *pos = info->output; + p++; + write( 2, pos, p - pos ); + /* move beginning of next line to start of buffer */ + while ((*pos = *p++)) pos++; + info->out_pos = pos; } - fputc ('"', stderr); + return ret; } /* ---------------------------------------------------------------------- */ @@ -219,7 +219,7 @@ va_list valist; va_start(valist, format); - ret = vfprintf(stderr, format, valist); + ret = dbg_vprintf( format, valist); va_end(valist); return ret; }
diff --git a/scheduler/thread.c b/scheduler/thread.c index 247d4b5..f36ccc1 100644 --- a/scheduler/thread.c +++ b/scheduler/thread.c
@@ -165,6 +165,7 @@ SELECTOR_FreeBlock( teb->teb_sel, 1 ); close( teb->socket ); if (teb->buffer) munmap( teb->buffer, teb->buffer_size ); + if (teb->debug_info) HeapFree( GetProcessHeap(), 0, teb->debug_info ); VirtualFree( teb->stack_base, 0, MEM_RELEASE ); VirtualFree( teb, 0, MEM_FREE ); }