From patchwork Fri Nov 2 13:14:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 196555 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 524762C0093 for ; Sat, 3 Nov 2012 00:14:40 +1100 (EST) Received: from localhost ([::1]:53759 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TUH54-0003Qv-BM for incoming@patchwork.ozlabs.org; Fri, 02 Nov 2012 09:14:38 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49751) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TUH4j-0003HQ-AY for qemu-devel@nongnu.org; Fri, 02 Nov 2012 09:14:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TUH4h-0007ob-O8 for qemu-devel@nongnu.org; Fri, 02 Nov 2012 09:14:17 -0400 Received: from mail-ee0-f45.google.com ([74.125.83.45]:52990) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TUH4h-0007oQ-7X for qemu-devel@nongnu.org; Fri, 02 Nov 2012 09:14:15 -0400 Received: by mail-ee0-f45.google.com with SMTP id b47so1887248eek.4 for ; Fri, 02 Nov 2012 06:14:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=dieTBuaOO9/Tt9OLUqR8BqJ+tw77VMYyr/lMv9XmpVU=; b=GzKW9YhMhljUGoGpgpPVKJQYLjI6+WK0OzKRaGDpk+M520dh8DgwNwNDmycH2yNRHe PwcYtQGTASGH14HQTTis+2Q0Pn5LXSHzavMo4RgRTrkwydEs9Lj2fB0cwEBStfCCiylh oOQO6/NDqgZ1KmrVYiVgfF4Xy71EJGyydbCI3JVt6IOlhpWnNAXmL/Z5f7PluzAOWsSw ijMNIzP380454SD2Uz42XOcGL/ssCJwLxXb0dY2uV/XR+tD6J0PKdniVVLgEjRV/HPiF muFoiODycx3rz8riWbmD9nvslHtTLpi/HpFxN4v2glF7p4jDZ/ZK5um554WOLIaMc8V7 DoCA== Received: by 10.14.203.65 with SMTP id e41mr6500176eeo.34.1351862054539; Fri, 02 Nov 2012 06:14:14 -0700 (PDT) Received: from yakj.lan (93-34-169-1.ip50.fastwebnet.it. [93.34.169.1]) by mx.google.com with ESMTPS id o47sm22953076eem.11.2012.11.02.06.14.12 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 02 Nov 2012 06:14:13 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 2 Nov 2012 14:14:03 +0100 Message-Id: <1351862047-23172-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.12.1 In-Reply-To: <1351862047-23172-1-git-send-email-pbonzini@redhat.com> References: <1351862047-23172-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 74.125.83.45 Cc: blauwirbel@gmail.com, jan.kiszka@siemens.com, peter.maydell@linaro.org Subject: [Qemu-devel] [PATCH 1/5] compiler: support Darwin weak references X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Weakrefs only tell you if the symbol was defined elsewhere, so you need a further check at runtime to pick the default definition when needed. This could be automated by the compiler, but it does not do it. Signed-off-by: Paolo Bonzini --- compiler.h | 9 ++++++++- osdep.c | 56 ++++++++++++++++++++++++++++++++------------------------ oslib-win32.c | 12 +++++++----- qemu-sockets.c | 40 ++++++++++++++++++++++------------------ qmp.c | 2 ++ 5 file modificati, 71 inserzioni(+), 48 rimozioni(-) diff --git a/compiler.h b/compiler.h index 58865d6..4d411be 100644 --- a/compiler.h +++ b/compiler.h @@ -50,8 +50,15 @@ # define __printf__ __gnu_printf__ # endif # endif -# define QEMU_WEAK_ALIAS(newname, oldname) \ +# if defined(__APPLE__) +# define QEMU_WEAK_ALIAS(newname, oldname) \ + static typeof(oldname) weak_##newname __attribute__((weakref(#oldname))) +# define QEMU_WEAK_REF(newname, oldname) (weak_##newname ? weak_##newname : oldname) +# else +# define QEMU_WEAK_ALIAS(newname, oldname) \ typeof(oldname) newname __attribute__((weak, alias (#oldname))) +# define QEMU_WEAK_REF(newname, oldname) newname +# endif #else #define GCC_ATTR /**/ #define GCC_FMT_ATTR(n, m) diff --git a/osdep.c b/osdep.c index a87d4a4..2f7a491 100644 --- a/osdep.c +++ b/osdep.c @@ -54,6 +54,38 @@ static bool fips_enabled = false; static const char *qemu_version = QEMU_VERSION; +static int default_fdset_get_fd(int64_t fdset_id, int flags) +{ + return -1; +} +QEMU_WEAK_ALIAS(monitor_fdset_get_fd, default_fdset_get_fd); +#define monitor_fdset_get_fd \ + QEMU_WEAK_REF(monitor_fdset_get_fd, default_fdset_get_fd) + +static int default_fdset_dup_fd_add(int64_t fdset_id, int dup_fd) +{ + return -1; +} +QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_add, default_fdset_dup_fd_add); +#define monitor_fdset_dup_fd_add \ + QEMU_WEAK_REF(monitor_fdset_dup_fd_add, default_fdset_dup_fd_add) + +static int default_fdset_dup_fd_remove(int dup_fd) +{ + return -1; +} +QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_remove); +#define monitor_fdset_dup_fd_remove \ + QEMU_WEAK_REF(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_remove) + +static int default_fdset_dup_fd_find(int dup_fd) +{ + return -1; +} +QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_find, default_fdset_dup_fd_find); +#define monitor_fdset_dup_fd_find \ + QEMU_WEAK_REF(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_find) + int socket_set_cork(int fd, int v) { #if defined(SOL_TCP) && defined(TCP_CORK) @@ -400,27 +432,3 @@ bool fips_get_state(void) return fips_enabled; } - -static int default_fdset_get_fd(int64_t fdset_id, int flags) -{ - return -1; -} -QEMU_WEAK_ALIAS(monitor_fdset_get_fd, default_fdset_get_fd); - -static int default_fdset_dup_fd_add(int64_t fdset_id, int dup_fd) -{ - return -1; -} -QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_add, default_fdset_dup_fd_add); - -static int default_fdset_dup_fd_remove(int dup_fd) -{ - return -1; -} -QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_remove); - -static int default_fdset_dup_fd_find(int dup_fd) -{ - return -1; -} -QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_find, default_fdset_dup_fd_find); diff --git a/oslib-win32.c b/oslib-win32.c index 9ca83df..326a2bd 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -32,6 +32,13 @@ #include "trace.h" #include "qemu_socket.h" +static void default_qemu_fd_register(int fd) +{ +} +QEMU_WEAK_ALIAS(qemu_fd_register, default_qemu_fd_register); +#define qemu_fd_register \ + QEMU_WEAK_REF(qemu_fd_register, default_qemu_fd_register) + void *qemu_oom_check(void *ptr) { if (ptr == NULL) { @@ -150,8 +157,3 @@ int qemu_get_thread_id(void) { return GetCurrentThreadId(); } - -static void default_qemu_fd_register(int fd) -{ -} -QEMU_WEAK_ALIAS(qemu_fd_register, default_qemu_fd_register); diff --git a/qemu-sockets.c b/qemu-sockets.c index f2a6371..abcd791 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -61,6 +61,28 @@ static QemuOptsList dummy_opts = { }, }; +static int default_monitor_get_fd(Monitor *mon, const char *name, Error **errp) +{ + error_setg(errp, "only QEMU supports file descriptor passing"); + return -1; +} +QEMU_WEAK_ALIAS(monitor_get_fd, default_monitor_get_fd); +#define monitor_get_fd \ + QEMU_WEAK_REF(monitor_get_fd, default_monitor_get_fd) + +static int default_qemu_set_fd_handler2(int fd, + IOCanReadHandler *fd_read_poll, + IOHandler *fd_read, + IOHandler *fd_write, + void *opaque) + +{ + abort(); +} +QEMU_WEAK_ALIAS(qemu_set_fd_handler2, default_qemu_set_fd_handler2); +#define qemu_set_fd_handler2 \ + QEMU_WEAK_REF(qemu_set_fd_handler2, default_qemu_set_fd_handler2) + static int inet_getport(struct addrinfo *e) { struct sockaddr_in *i4; @@ -967,21 +989,3 @@ int socket_init(void) #endif return 0; } - -static int default_monitor_get_fd(Monitor *mon, const char *name, Error **errp) -{ - error_setg(errp, "only QEMU supports file descriptor passing"); - return -1; -} -QEMU_WEAK_ALIAS(monitor_get_fd, default_monitor_get_fd); - -static int default_qemu_set_fd_handler2(int fd, - IOCanReadHandler *fd_read_poll, - IOHandler *fd_read, - IOHandler *fd_write, - void *opaque) - -{ - abort(); -} -QEMU_WEAK_ALIAS(qemu_set_fd_handler2, default_qemu_set_fd_handler2); diff --git a/qmp.c b/qmp.c index 638888a..13e83a5 100644 --- a/qmp.c +++ b/qmp.c @@ -477,6 +477,8 @@ static CpuDefinitionInfoList *default_arch_query_cpu_definitions(Error **errp) return NULL; } QEMU_WEAK_ALIAS(arch_query_cpu_definitions, default_arch_query_cpu_definitions); +#define arch_query_cpu_definitions \ + QEMU_WEAK_REF(arch_query_cpu_definitions, default_arch_query_cpu_definitions) CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp) {