From 49a14c1606cf8dd3312d7f1a9c14182bfe196c74 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 17 Apr 2010 16:39:46 +0300 Subject: [PATCH] Avoid calling dlsym at every code First I ever need to use the auto keyword... --- bin/override.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/bin/override.c b/bin/override.c index 02402d50ec..5996e43c49 100644 --- a/bin/override.c +++ b/bin/override.c @@ -26,7 +26,7 @@ void vlc_enable_override (void); -#if defined (__GNUC__) /* typeof and statement-expression */ \ +#if defined (__GNUC__) \ && (defined (__ELF__) && !defined (__sun__)) /* Solaris crashes on printf("%s", NULL); which is legal, but annoying. */ @@ -97,8 +97,23 @@ static void *getsym (const char *name) } #define LOG(level, ...) logbug(level, __func__, __VA_ARGS__) +/* Evil non-standard GNU C macro ;) + * typeof keyword, + * statement-expression, + * nested function... + */ #define CALL(func, ...) \ - ({ typeof (func) *sym = getsym ( # func); sym (__VA_ARGS__); }) +({ \ + static typeof (func) *sym = NULL; \ + static pthread_once_t once = PTHREAD_ONCE_INIT; \ + auto void getsym_once (void); \ + void getsym_once (void) \ + { \ + sym = getsym ( # func); \ + } \ + pthread_once (&once, getsym_once); \ + sym (__VA_ARGS__); \ +}) /*** Environment *** -- 2.39.2