Jan Kiszka writes: > On 2011-10-03 18:33, Dr. David Alan Gilbert wrote: >> Make cpu_single_env thread local (Linux only for now) >> * Fixes some user space threading issues (esp those triggered >> by bug 823902) >> >> Against rev d11cf8cc..., tested on ARM user mode, and ARM Vexpress >> system mode (with Blue Swirl's fix from yesterday) - only >> tested on Linux host. Lets me run ARM userspace firefox. >> >> Signed-off-by: Dr. David Alan Gilbert <david.gilb...@linaro.org> >> >> diff --git a/cpu-all.h b/cpu-all.h >> index 42a5fa0..d895ee6 100644 >> --- a/cpu-all.h >> +++ b/cpu-all.h >> @@ -334,7 +334,13 @@ void cpu_dump_statistics(CPUState *env, FILE *f, >> fprintf_function cpu_fprintf, >> void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...) >> GCC_FMT_ATTR(2, 3); >> extern CPUState *first_cpu; >> + >> +#ifdef __linux__ >> +/* DAG: Only tested thread local on Linux, feel free to add others */ >> +extern __thread CPUState *cpu_single_env; >> +#else >> extern CPUState *cpu_single_env; >> +#endif
> We need this for all platforms in order to skip qemu_global_mutex while > manipulating some CPUState. And leaving some platforms with non-TLS will > eventually break them when code is added that assumes TLS. > However, it's not unlikely that some weird platforms / ancient > toolchains still have problems with __thread - even on Linux. We may > want to play safe and use pthread_key on POSIX. Why not make this kind of annotations available in qemu-commmon.h; or even better somewhere less... "generic". #if defined(CONFIG_SUPPORTS_THREAD_KEYWORD) // use __thread #define QEMU_DECL_TLS(type, name) \ extern __thread type name; #define QEMU_DEF_TLS(type, name) \ __thread type name; #define QEMU_SET_TLS(name, value) \ do { name = value; } while (0) #define QEMU_GET_TLS(name) \ name #elif defined(CONFIG_SUPPORTS_PTHREAD_KEY) // use pthread_key_t #define QEMU_DECL_TLS(type, name) \ extern type _type_##name; \ extern pthread_key_t name; #define QEMU_DEF_TLS(type, name) \ pthread_key_t name; \ void _init_##name (void) __attribute__((constructor)); \ void _init_##name (void) { pthread_key_create(&name, NULL); } #define QEMU_SET_TLS(name, value) \ do { pthread_setspecific(name, (void*)value); } while (0) #define QEMU_GET_TLS(name) \ ((typeof(_type_##name))pthread_getspecific(name)) #else #error Go home #endif Lluis -- "And it's much the same thing with knowledge, for whenever you learn something new, the whole world becomes that much richer." -- The Princess of Pure Reason, as told by Norton Juster in The Phantom Tollbooth