Hi,
This is a profiler that was written by Charles Loep of Codeweavers. At the moment I've missed a bit of the merge, but I haven't got time to figure out which bit is missing, so it doesn't work :( I thought I'd put it up here and if anybody is interested in it....
Mike
ChangeLog: Charles Loep <charles@codeweavers.com> * implement a profiler for Wine
Index: Make.rules.in =================================================================== RCS file: /home/wine/wine/Make.rules.in,v retrieving revision 1.157 diff -u -r1.157 Make.rules.in --- Make.rules.in 6 May 2003 18:34:53 -0000 1.157 +++ Make.rules.in 30 May 2003 09:24:44 -0000 @@ -54,7 +54,7 @@ LINTFLAGS = @LINTFLAGS@ INCLUDES = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include $(EXTRAINCL) EXTRACFLAGS = @EXTRACFLAGS@ -ALLCFLAGS = $(INCLUDES) $(DEFS) $(EXTRACFLAGS) $(CFLAGS) +ALLCFLAGS = $(INCLUDES) $(DEFS) $(EXTRACFLAGS) $(CFLAGS) $(PROFILE_CFLAGS) ALLLINTFLAGS = $(INCLUDES) $(DEFS) $(LINTFLAGS) MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs -m 755 WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check Index: configure.ac =================================================================== RCS file: /home/wine/wine/configure.ac,v retrieving revision 1.160 diff -u -r1.160 configure.ac --- configure.ac 21 May 2003 18:50:53 -0000 1.160 +++ configure.ac 30 May 2003 09:24:53 -0000 @@ -20,6 +20,25 @@ AC_ARG_WITH(curses, AC_HELP_STRING([--without-curses],[do not use curses])) AC_ARG_WITH(nptl, AC_HELP_STRING([--with-nptl],[use glibc NPTL threading support])) AC_ARG_WITH(wine-tools,AC_HELP_STRING([--with-wine-tools=<dir>],[use Wine tools from directory <dir>])) +AC_ARG_WITH(profiler,AC_HELP_STRING([--with-profiler],[build the profiler])) + +if test "x$with_profiler" = "xyes" +then + GLIBC_THREAD_CFLAGS=`glib-config --cflags gthread` + GLIBC_THREAD_LIBS=`glib-config --libs gthread` + if test "x$GLIBC_THREAD_CFLAGS" != x + then + PROFILE_CFLAGS="-finstrument-functions -D__NO_STRING_INLINES -DWINE_NO_PROFILE=\"__attribute__((no_instrument_function))\"" + PROFILE_LIBS="-L\$(TOPOBJDIR)/libs/wprof -lwineprof -lm" + PROFILE_LIBNAME="libwineprof" + AC_DEFINE(HAVE_PROFILER,1,[Define to use glibc NPTL threading support.]) + fi +fi +AC_SUBST(PROFILE_CFLAGS) +AC_SUBST(PROFILE_LIBS) +AC_SUBST(PROFILE_LIBNAME) +AC_SUBST(GLIBC_THREAD_CFLAGS) +AC_SUBST(GLIBC_THREAD_LIBS) AC_SUBST(WIN16_FILES,"\$(WIN16_FILES)") AC_SUBST(WIN16_INSTALL,"\$(WIN16_INSTALL)") @@ -1500,6 +1519,7 @@ libs/uuid/Makefile libs/wine/Makefile libs/wpp/Makefile +libs/wprof/Makefile miscemu/Makefile programs/Makefile programs/avitools/Makefile Index: dlls/Makedll.rules.in =================================================================== RCS file: /home/wine/wine/dlls/Makedll.rules.in,v retrieving revision 1.55 diff -u -r1.55 Makedll.rules.in --- dlls/Makedll.rules.in 21 Apr 2003 23:54:06 -0000 1.55 +++ dlls/Makedll.rules.in 30 May 2003 09:24:53 -0000 @@ -9,13 +9,16 @@ # plus all variables required by the global Make.rules.in # +PROFILE_LIBS = @PROFILE_LIBS@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ + DEFS = @DLLFLAGS@ -D__WINESRC__ $(EXTRADEFS) DLLEXT = @DLLEXT@ MAINSPEC = $(MODULE:%.dll=%).spec SPEC_DEF = $(MAINSPEC).def WIN16_FILES = $(SPEC_SRCS16:.spec=.spec.o) $(C_SRCS16:.c=.o) $(EXTRA_OBJS16) ALL_OBJS = @WIN16_FILES@ $(OBJS) $(MODULE).dbg.o -ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LIBS) +ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LIBS) $(PROFILE_LIBS) IMPORTLIBS = $(DELAYIMPORTS:%=$(DLLDIR)/lib%.$(IMPLIBEXT)) $(IMPORTS:%=$(DLLDIR)/lib%.$(IMPLIBEXT)) all: $(MODULE)$(DLLEXT) $(SUBDIRS) Index: libs/Makefile.in =================================================================== RCS file: /home/wine/wine/libs/Makefile.in,v retrieving revision 1.5 diff -u -r1.5 Makefile.in --- libs/Makefile.in 1 May 2003 03:16:21 -0000 1.5 +++ libs/Makefile.in 30 May 2003 09:24:55 -0000 @@ -4,12 +4,15 @@ VPATH = @srcdir@ MODULE = none +PROFILE_LIBNAME = @PROFILE_LIBNAME@ + SUBDIRS = \ port \ unicode \ uuid \ wine \ - wpp + wpp \ + wprof INSTALLSUBDIRS = \ unicode \ @@ -21,7 +24,8 @@ libwine_port.a \ libwine_unicode.$(LIBEXT) \ libwine_uuid.a \ - libwpp.a + libwpp.a \ + $(PROFILE_LIBNAME:%=%.$(LIBEXT)) @MAKE_RULES@ @@ -51,6 +55,9 @@ libwpp.a: wpp/libwpp.a $(RM) $@ && $(LN_S) wpp/$@ $@ + +libwineprof.so libwineprof.so.1 libwineprof.a: wprof/libwineprof.$(LIBEXT) + $(RM) $@ && $(LN_S) wprof/$@ $@ # Directory dependencies Index: miscemu/Makefile.in =================================================================== RCS file: /home/wine/wine/miscemu/Makefile.in,v retrieving revision 1.21 diff -u -r1.21 Makefile.in --- miscemu/Makefile.in 22 May 2003 03:40:41 -0000 1.21 +++ miscemu/Makefile.in 30 May 2003 09:24:55 -0000 @@ -11,6 +11,9 @@ @MAKE_RULES@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PROFILE_LIBS = @PROFILE_LIBS@ + LDEXECFLAGS = @LDEXECFLAGS@ $(MODULE): $(OBJS) Makefile.in $(DLLDIR)/libntdll.dll.$(LIBEXT) Index: programs/Makeprog.rules.in =================================================================== RCS file: /home/wine/wine/programs/Makeprog.rules.in,v retrieving revision 1.28 diff -u -r1.28 Makeprog.rules.in --- programs/Makeprog.rules.in 21 Apr 2003 23:54:05 -0000 1.28 +++ programs/Makeprog.rules.in 30 May 2003 09:24:55 -0000 @@ -9,10 +9,13 @@ # plus all variables required by the global Make.rules.in # +PROFILE_LIBS = @PROFILE_LIBS@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ + DEFS = @DLLFLAGS@ $(EXTRADEFS) LDDLLFLAGS = @LDDLLFLAGS@ ALL_OBJS = $(OBJS) $(MODULE).dbg.o -ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LIBS) +ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LIBS) $(PROFILE_LIBS) BASEMODULE = $(MODULE:.exe=) TESTIMPORTS = $(DELAYIMPORTS) $(IMPORTS) RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) $(PLTESTPROGRAM:%=-p %) Index: scheduler/pthread.c =================================================================== RCS file: /home/wine/wine/scheduler/pthread.c,v retrieving revision 1.32 diff -u -r1.32 pthread.c --- scheduler/pthread.c 3 Apr 2003 02:54:54 -0000 1.32 +++ scheduler/pthread.c 30 May 2003 09:24:55 -0000 @@ -57,6 +57,10 @@ #define PSTR(str) __ASM_NAME(#str) +#ifndef WINE_NO_PROFILE +#define WINE_NO_PROFILE +#endif + /* adapt as necessary (a construct like this is used in glibc sources) */ #define strong_alias(orig, alias) \ asm(".globl " PSTR(alias) "\n" \ @@ -67,7 +71,7 @@ static pid_t (*libc_fork)(void); static int (*libc_sigaction)(int signum, const struct sigaction *act, struct sigaction *oldact); -void PTHREAD_init_done(void) +WINE_NO_PROFILE void PTHREAD_init_done(void) { init_done = 1; if (!libc_fork) libc_fork = dlsym( RTLD_NEXT, "fork" ); @@ -104,7 +108,7 @@ #define P_OUTPUT(stuff) write(2,stuff,strlen(stuff)) -void __pthread_initialize(void) +WINE_NO_PROFILE void __pthread_initialize(void) { } @@ -113,14 +117,14 @@ void* arg; }; -static DWORD CALLBACK pthread_thread_start(LPVOID data) +WINE_NO_PROFILE static DWORD CALLBACK pthread_thread_start(LPVOID data) { struct pthread_thread_init init = *(struct pthread_thread_init*)data; HeapFree(GetProcessHeap(),0,data); return (DWORD)init.start_routine(init.arg); } -int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* +WINE_NO_PROFILE int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void *), void* arg) { HANDLE hThread; @@ -143,7 +147,7 @@ return 0; } -int pthread_cancel(pthread_t thread) +WINE_NO_PROFILE int pthread_cancel(pthread_t thread) { HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, (DWORD)thread); @@ -158,7 +162,7 @@ return 0; /* return success */ } -int pthread_join(pthread_t thread, void **value_ptr) +WINE_NO_PROFILE int pthread_join(pthread_t thread, void **value_ptr) { HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, (DWORD)thread); @@ -174,7 +178,7 @@ } /*FIXME: not sure what to do with this one... */ -int pthread_detach(pthread_t thread) +WINE_NO_PROFILE int pthread_detach(pthread_t thread) { P_OUTPUT("FIXME:pthread_detach\n"); return 0; @@ -182,28 +186,28 @@ /* FIXME: we have no equivalents in win32 for the policys */ /* so just keep this as a stub */ -int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) +WINE_NO_PROFILE int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) { P_OUTPUT("FIXME:pthread_attr_setschedpolicy\n"); return 0; } /* FIXME: no win32 equivalent for scope */ -int pthread_attr_setscope(pthread_attr_t *attr, int scope) +WINE_NO_PROFILE int pthread_attr_setscope(pthread_attr_t *attr, int scope) { P_OUTPUT("FIXME:pthread_attr_setscope\n"); return 0; /* return success */ } /* FIXME: no win32 equivalent for schedule param */ -int pthread_attr_setschedparam(pthread_attr_t *attr, +WINE_NO_PROFILE int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param) { P_OUTPUT("FIXME:pthread_attr_setschedparam\n"); return 0; /* return success */ } -int __pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) +WINE_NO_PROFILE int __pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) { static pthread_once_t the_once = PTHREAD_ONCE_INIT; LONG once_now; @@ -215,7 +219,7 @@ } strong_alias(__pthread_once, pthread_once); -void __pthread_kill_other_threads_np(void) +WINE_NO_PROFILE void __pthread_kill_other_threads_np(void) { /* we don't need to do anything here */ } @@ -232,7 +236,7 @@ static atfork_handler atfork_child[MAX_ATFORK]; static int atfork_count; -int __pthread_atfork(void (*prepare)(void), +WINE_NO_PROFILE int __pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)) { @@ -247,7 +251,7 @@ } strong_alias(__pthread_atfork, pthread_atfork); -pid_t __fork(void) +WINE_NO_PROFILE pid_t __fork(void) { pid_t pid; int i; @@ -276,7 +280,7 @@ /***** MUTEXES *****/ -int __pthread_mutex_init(pthread_mutex_t *mutex, +WINE_NO_PROFILE int __pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) { /* glibc has a tendency to initialize mutexes very often, even @@ -290,7 +294,7 @@ } strong_alias(__pthread_mutex_init, pthread_mutex_init); -static void mutex_real_init( pthread_mutex_t *mutex ) +WINE_NO_PROFILE static void mutex_real_init( pthread_mutex_t *mutex ) { CRITICAL_SECTION *critsect = HeapAlloc(GetProcessHeap(), 0, sizeof(CRITICAL_SECTION)); InitializeCriticalSection(critsect); @@ -302,7 +306,7 @@ } } -int __pthread_mutex_lock(pthread_mutex_t *mutex) +WINE_NO_PROFILE int __pthread_mutex_lock(pthread_mutex_t *mutex) { if (!init_done) return 0; if (!((wine_mutex)mutex)->critsect) @@ -313,7 +317,7 @@ } strong_alias(__pthread_mutex_lock, pthread_mutex_lock); -int __pthread_mutex_trylock(pthread_mutex_t *mutex) +WINE_NO_PROFILE int __pthread_mutex_trylock(pthread_mutex_t *mutex) { if (!init_done) return 0; if (!((wine_mutex)mutex)->critsect) @@ -327,7 +331,7 @@ } strong_alias(__pthread_mutex_trylock, pthread_mutex_trylock); -int __pthread_mutex_unlock(pthread_mutex_t *mutex) +WINE_NO_PROFILE int __pthread_mutex_unlock(pthread_mutex_t *mutex) { if (!((wine_mutex)mutex)->critsect) return 0; LeaveCriticalSection(((wine_mutex)mutex)->critsect); @@ -335,7 +339,7 @@ } strong_alias(__pthread_mutex_unlock, pthread_mutex_unlock); -int __pthread_mutex_destroy(pthread_mutex_t *mutex) +WINE_NO_PROFILE int __pthread_mutex_destroy(pthread_mutex_t *mutex) { if (!((wine_mutex)mutex)->critsect) return 0; if (((wine_mutex)mutex)->critsect->RecursionCount) { @@ -356,38 +360,38 @@ /***** MUTEX ATTRIBUTES *****/ /* just dummies, since critical sections are always recursive */ -int __pthread_mutexattr_init(pthread_mutexattr_t *attr) +WINE_NO_PROFILE int __pthread_mutexattr_init(pthread_mutexattr_t *attr) { return 0; } strong_alias(__pthread_mutexattr_init, pthread_mutexattr_init); -int __pthread_mutexattr_destroy(pthread_mutexattr_t *attr) +WINE_NO_PROFILE int __pthread_mutexattr_destroy(pthread_mutexattr_t *attr) { return 0; } strong_alias(__pthread_mutexattr_destroy, pthread_mutexattr_destroy); -int __pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind) +WINE_NO_PROFILE int __pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind) { return 0; } strong_alias(__pthread_mutexattr_setkind_np, pthread_mutexattr_setkind_np); -int __pthread_mutexattr_getkind_np(pthread_mutexattr_t *attr, int *kind) +WINE_NO_PROFILE int __pthread_mutexattr_getkind_np(pthread_mutexattr_t *attr, int *kind) { *kind = PTHREAD_MUTEX_RECURSIVE; return 0; } strong_alias(__pthread_mutexattr_getkind_np, pthread_mutexattr_getkind_np); -int __pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind) +WINE_NO_PROFILE int __pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind) { return 0; } strong_alias(__pthread_mutexattr_settype, pthread_mutexattr_settype); -int __pthread_mutexattr_gettype(pthread_mutexattr_t *attr, int *kind) +WINE_NO_PROFILE int __pthread_mutexattr_gettype(pthread_mutexattr_t *attr, int *kind) { *kind = PTHREAD_MUTEX_RECURSIVE; return 0; @@ -397,7 +401,7 @@ /***** THREAD-SPECIFIC VARIABLES (KEYS) *****/ -int __pthread_key_create(pthread_key_t *key, void (*destr_function)(void *)) +WINE_NO_PROFILE int __pthread_key_create(pthread_key_t *key, void (*destr_function)(void *)) { static LONG keycnt = FIRST_KEY; *key = InterlockedExchangeAdd(&keycnt, 1); @@ -405,13 +409,13 @@ } strong_alias(__pthread_key_create, pthread_key_create); -int __pthread_key_delete(pthread_key_t key) +WINE_NO_PROFILE int __pthread_key_delete(pthread_key_t key) { return 0; } strong_alias(__pthread_key_delete, pthread_key_delete); -int __pthread_setspecific(pthread_key_t key, const void *pointer) +WINE_NO_PROFILE int __pthread_setspecific(pthread_key_t key, const void *pointer) { TEB *teb = NtCurrentTeb(); if (!teb->pthread_data) { @@ -422,7 +426,7 @@ } strong_alias(__pthread_setspecific, pthread_setspecific); -void *__pthread_getspecific(pthread_key_t key) +WINE_NO_PROFILE void *__pthread_getspecific(pthread_key_t key) { TEB *teb = NtCurrentTeb(); if (!teb) return NULL; @@ -435,23 +439,23 @@ /***** "EXCEPTION" FRAMES *****/ /* not implemented right now */ -void _pthread_cleanup_push(struct _pthread_cleanup_buffer *buffer, void (*routine)(void *), void *arg) +WINE_NO_PROFILE void _pthread_cleanup_push(struct _pthread_cleanup_buffer *buffer, void (*routine)(void *), void *arg) { ((wine_cleanup)buffer)->routine = routine; ((wine_cleanup)buffer)->arg = arg; } -void _pthread_cleanup_pop(struct _pthread_cleanup_buffer *buffer, int execute) +WINE_NO_PROFILE void _pthread_cleanup_pop(struct _pthread_cleanup_buffer *buffer, int execute) { if (execute) (*(((wine_cleanup)buffer)->routine))(((wine_cleanup)buffer)->arg); } -void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer *buffer, void (*routine)(void *), void *arg) +WINE_NO_PROFILE void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer *buffer, void (*routine)(void *), void *arg) { _pthread_cleanup_push(buffer, routine, arg); } -void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer *buffer, int execute) +WINE_NO_PROFILE void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer *buffer, int execute) { _pthread_cleanup_pop(buffer, execute); } @@ -460,37 +464,37 @@ /***** CONDITIONS *****/ /* not implemented right now */ -int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr) +WINE_NO_PROFILE int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr) { P_OUTPUT("FIXME:pthread_cond_init\n"); return 0; } -int pthread_cond_destroy(pthread_cond_t *cond) +WINE_NO_PROFILE int pthread_cond_destroy(pthread_cond_t *cond) { P_OUTPUT("FIXME:pthread_cond_destroy\n"); return 0; } -int pthread_cond_signal(pthread_cond_t *cond) +WINE_NO_PROFILE int pthread_cond_signal(pthread_cond_t *cond) { P_OUTPUT("FIXME:pthread_cond_signal\n"); return 0; } -int pthread_cond_broadcast(pthread_cond_t *cond) +WINE_NO_PROFILE int pthread_cond_broadcast(pthread_cond_t *cond) { P_OUTPUT("FIXME:pthread_cond_broadcast\n"); return 0; } -int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) +WINE_NO_PROFILE int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { P_OUTPUT("FIXME:pthread_cond_wait\n"); return 0; } -int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +WINE_NO_PROFILE int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) { P_OUTPUT("FIXME:pthread_cond_timedwait\n"); return 0; @@ -499,12 +503,12 @@ /**** CONDITION ATTRIBUTES *****/ /* not implemented right now */ -int pthread_condattr_init(pthread_condattr_t *attr) +WINE_NO_PROFILE int pthread_condattr_init(pthread_condattr_t *attr) { return 0; } -int pthread_condattr_destroy(pthread_condattr_t *attr) +WINE_NO_PROFILE int pthread_condattr_destroy(pthread_condattr_t *attr) { return 0; } @@ -512,7 +516,7 @@ #if (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) /***** READ-WRITE LOCKS *****/ -static void rwlock_real_init(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE static void rwlock_real_init(pthread_rwlock_t *rwlock) { RTL_RWLOCK *lock = HeapAlloc(GetProcessHeap(), 0, sizeof(RTL_RWLOCK)); RtlInitializeResource(lock); @@ -524,14 +528,14 @@ } } -int __pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *rwlock_attr) +WINE_NO_PROFILE int __pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *rwlock_attr) { ((wine_rwlock)rwlock)->lock = NULL; return 0; } strong_alias(__pthread_rwlock_init, pthread_rwlock_init); -int __pthread_rwlock_destroy(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_destroy(pthread_rwlock_t *rwlock) { if (!((wine_rwlock)rwlock)->lock) return 0; RtlDeleteResource(((wine_rwlock)rwlock)->lock); @@ -540,7 +544,7 @@ } strong_alias(__pthread_rwlock_destroy, pthread_rwlock_destroy); -int __pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) { if (!init_done) return 0; if (!((wine_rwlock)rwlock)->lock) @@ -552,7 +556,7 @@ } strong_alias(__pthread_rwlock_rdlock, pthread_rwlock_rdlock); -int __pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) { if (!init_done) return 0; if (!((wine_rwlock)rwlock)->lock) @@ -566,7 +570,7 @@ } strong_alias(__pthread_rwlock_tryrdlock, pthread_rwlock_tryrdlock); -int __pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) { if (!init_done) return 0; if (!((wine_rwlock)rwlock)->lock) @@ -578,7 +582,7 @@ } strong_alias(__pthread_rwlock_wrlock, pthread_rwlock_wrlock); -int __pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) { if (!init_done) return 0; if (!((wine_rwlock)rwlock)->lock) @@ -592,7 +596,7 @@ } strong_alias(__pthread_rwlock_trywrlock, pthread_rwlock_trywrlock); -int __pthread_rwlock_unlock(pthread_rwlock_t *rwlock) +WINE_NO_PROFILE int __pthread_rwlock_unlock(pthread_rwlock_t *rwlock) { if (!((wine_rwlock)rwlock)->lock) return 0; RtlReleaseResource( ((wine_rwlock)rwlock)->lock ); @@ -603,24 +607,24 @@ /**** READ-WRITE LOCK ATTRIBUTES *****/ /* not implemented right now */ -int pthread_rwlockattr_init(pthread_rwlockattr_t *attr) +WINE_NO_PROFILE int pthread_rwlockattr_init(pthread_rwlockattr_t *attr) { return 0; } -int __pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr) +WINE_NO_PROFILE int __pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr) { return 0; } strong_alias(__pthread_rwlockattr_destroy, pthread_rwlockattr_destroy); -int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t *attr, int *pref) +WINE_NO_PROFILE int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t *attr, int *pref) { *pref = 0; return 0; } -int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref) +WINE_NO_PROFILE int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref) { return 0; } @@ -628,23 +632,23 @@ /***** MISC *****/ -pthread_t pthread_self(void) +WINE_NO_PROFILE pthread_t pthread_self(void) { return (pthread_t)GetCurrentThreadId(); } -int pthread_equal(pthread_t thread1, pthread_t thread2) +WINE_NO_PROFILE int pthread_equal(pthread_t thread1, pthread_t thread2) { return (DWORD)thread1 == (DWORD)thread2; } -void pthread_exit(void *retval) +WINE_NO_PROFILE void pthread_exit(void *retval) { /* FIXME: pthread cleanup */ ExitThread((DWORD)retval); } -int pthread_setcanceltype(int type, int *oldtype) +WINE_NO_PROFILE int pthread_setcanceltype(int type, int *oldtype) { if (oldtype) *oldtype = PTHREAD_CANCEL_ASYNCHRONOUS; return 0; @@ -653,7 +657,7 @@ /***** ANTI-OVERRIDES *****/ /* pthreads tries to override these, point them back to libc */ -int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) +WINE_NO_PROFILE int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) { if (!libc_sigaction) { Index: scheduler/sysdeps.c =================================================================== RCS file: /home/wine/wine/scheduler/sysdeps.c,v retrieving revision 1.67 diff -u -r1.67 sysdeps.c --- scheduler/sysdeps.c 13 May 2003 00:49:49 -0000 1.67 +++ scheduler/sysdeps.c 30 May 2003 09:24:55 -0000 @@ -69,6 +69,10 @@ int status; }; +#ifndef WINE_NO_PROFILE +#define WINE_NO_PROFILE +#endif + /* temporary stacks used on thread exit */ #define TEMP_STACK_SIZE 1024 #define NB_TEMP_STACKS 8 @@ -362,27 +366,27 @@ #ifndef HAVE_NPTL /* default errno before threading is initialized */ -static int *default_errno_location(void) +WINE_NO_PROFILE static int *default_errno_location(void) { static int static_errno; return &static_errno; } /* default h_errno before threading is initialized */ -static int *default_h_errno_location(void) +WINE_NO_PROFILE static int *default_h_errno_location(void) { static int static_h_errno; return &static_h_errno; } /* errno once threading is working */ -static int *thread_errno_location(void) +WINE_NO_PROFILE static int *thread_errno_location(void) { return &NtCurrentTeb()->thread_errno; } /* h_errno once threading is working */ -static int *thread_h_errno_location(void) +WINE_NO_PROFILE static int *thread_h_errno_location(void) { return &NtCurrentTeb()->thread_h_errno; } @@ -395,18 +399,18 @@ * * Get the per-thread errno location. */ -int *__errno_location(void) { return errno_location_ptr(); } /* Linux */ -int *__error(void) { return errno_location_ptr(); } /* FreeBSD */ -int *__errno(void) { return errno_location_ptr(); } /* NetBSD */ -int *___errno(void) { return errno_location_ptr(); } /* Solaris */ -int *__thr_errno(void) { return errno_location_ptr(); } /* UnixWare */ +WINE_NO_PROFILE int *__errno_location(void) { return errno_location_ptr(); } /* Linux */ +WINE_NO_PROFILE int *__error(void) { return errno_location_ptr(); } /* FreeBSD */ +WINE_NO_PROFILE int *__errno(void) { return errno_location_ptr(); } /* NetBSD */ +WINE_NO_PROFILE int *___errno(void) { return errno_location_ptr(); } /* Solaris */ +WINE_NO_PROFILE int *__thr_errno(void) { return errno_location_ptr(); } /* UnixWare */ /*********************************************************************** * __h_errno_location * * Get the per-thread h_errno location. */ -int *__h_errno_location(void) +WINE_NO_PROFILE int *__h_errno_location(void) { return h_errno_location_ptr(); }
Attachment:
wprof.tar.gz
Description: Unix tar archive