diff --git a/dlls/winecrt0/Makefile.in b/dlls/winecrt0/Makefile.in index 6b7c3e8b064..79ba92faeb7 100644 --- a/dlls/winecrt0/Makefile.in +++ b/dlls/winecrt0/Makefile.in @@ -1,6 +1,7 @@ MODULE = libwinecrt0.a C_SRCS = \ + debug.c \ delay_load.c \ dll_entry.c \ dll_main.c \ diff --git a/dlls/winecrt0/debug.c b/dlls/winecrt0/debug.c new file mode 100644 index 00000000000..1eb5a46d64f --- /dev/null +++ b/dlls/winecrt0/debug.c @@ -0,0 +1,62 @@ +/* + * Fallbacks for debugging functions when running on Windows + * + * Copyright 2019 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifdef _WIN32 + +#include "config.h" +#include "wine/port.h" + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" + +static const char * (__cdecl *p__wine_dbg_strdup)( const char *str ); + +static void load_func( void **func, const char *name, void *def ) +{ + if (!*func) + { + HMODULE module = GetModuleHandleA( "ntdll.dll" ); + void *proc = GetProcAddress( module, name ); + interlocked_xchg_ptr( func, proc ? proc : def ); + } +} +#define LOAD_FUNC(name) load_func( (void **)&p ## name, #name, fallback ## name ) + +/* FIXME: this is not 100% thread-safe */ +static const char * __cdecl fallback__wine_dbg_strdup( const char *str ) +{ + static char *list[32]; + static int pos; + char *ret = _strdup( str ); + int idx; + + idx = interlocked_xchg_add( &pos, 1 ) % ARRAY_SIZE(list); + free( interlocked_xchg_ptr( (void **)&list[idx], ret )); + return ret; +} + +const char * __cdecl __wine_dbg_strdup( const char *str ) +{ + LOAD_FUNC( __wine_dbg_strdup ); + return p__wine_dbg_strdup( str ); +} + +#endif /* _WIN32 */