1/* 2 * Abstraction layer for defining and using TLS variables 3 * 4 * Copyright (c) 2011 Red Hat, Inc 5 * Copyright (c) 2011 Linaro Limited 6 * 7 * Authors: 8 * Paolo Bonzini <pbonzini@redhat.com> 9 * Peter Maydell <peter.maydell@linaro.org> 10 * 11 * This program is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU General Public License as 13 * published by the Free Software Foundation; either version 2 of 14 * the License, or (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License along 22 * with this program; if not, see <http://www.gnu.org/licenses/>. 23 */ 24 25#ifndef QEMU_TLS_H 26#define QEMU_TLS_H 27 28/* Per-thread variables. Note that we only have implementations 29 * which are really thread-local on Linux; the dummy implementations 30 * define plain global variables. 31 * 32 * This means that for the moment use should be restricted to 33 * per-VCPU variables, which are OK because: 34 * - the only -user mode supporting multiple VCPU threads is linux-user 35 * - TCG system mode is single-threaded regarding VCPUs 36 * - KVM system mode is multi-threaded but limited to Linux 37 * 38 * TODO: proper implementations via Win32 .tls sections and 39 * POSIX pthread_getspecific. 40 */ 41#ifdef __linux__ 42#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x) 43#define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x 44#define get_tls(x) tls__##x 45#else 46/* Dummy implementations which define plain global variables */ 47#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x) 48#define DEFINE_TLS(type, x) __typeof__(type) tls__##x 49#define get_tls(x) tls__##x 50#endif 51 52#endif 53