From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:50925) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNwP-0002e8-AH for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:42:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1USNwN-0003oC-7u for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:42:09 -0400 Received: from mail-gg0-x22a.google.com ([2607:f8b0:4002:c02::22a]:42716) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USNwM-0003nw-Se for qemu-devel@nongnu.org; Wed, 17 Apr 2013 04:42:06 -0400 Received: by mail-gg0-f170.google.com with SMTP id k4so210100ggn.29 for ; Wed, 17 Apr 2013 01:42:06 -0700 (PDT) From: Liu Ping Fan Date: Wed, 17 Apr 2013 16:39:24 +0800 Message-Id: <1366187964-14265-16-git-send-email-qemulist@gmail.com> In-Reply-To: <1366187964-14265-1-git-send-email-qemulist@gmail.com> References: <1366187964-14265-1-git-send-email-qemulist@gmail.com> Subject: [Qemu-devel] [RFC PATCH v4 15/15] slirp: use lock to protect the slirp_instances List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mdroth , Paolo Bonzini , Stefan Hajnoczi , Anthony Liguori , Jan Kiszka From: Liu Ping Fan slirps will run on dedicated thread, so need to protect the global list. Signed-off-by: Liu Ping Fan --- include/qemu/module.h | 2 ++ slirp/slirp.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/include/qemu/module.h b/include/qemu/module.h index c4ccd57..2720943 100644 --- a/include/qemu/module.h +++ b/include/qemu/module.h @@ -22,6 +22,7 @@ static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \ typedef enum { MODULE_INIT_BLOCK, + MODULE_INIT_SLIRP, MODULE_INIT_MACHINE, MODULE_INIT_QAPI, MODULE_INIT_QOM, @@ -29,6 +30,7 @@ typedef enum { } module_init_type; #define block_init(function) module_init(function, MODULE_INIT_BLOCK) +#define slirplayer_init(function) module_init(function, MODULE_INIT_SLIRP) #define machine_init(function) module_init(function, MODULE_INIT_MACHINE) #define qapi_init(function) module_init(function, MODULE_INIT_QAPI) #define type_init(function) module_init(function, MODULE_INIT_QOM) diff --git a/slirp/slirp.c b/slirp/slirp.c index 6bfcc67..4cbf04d 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -42,6 +42,7 @@ static const uint8_t zero_ethaddr[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 }; u_int curtime; +static QemuMutex slirp_instances_lock; static QTAILQ_HEAD(slirp_instances, Slirp) slirp_instances = QTAILQ_HEAD_INITIALIZER(slirp_instances); @@ -236,14 +237,18 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, register_savevm(NULL, "slirp", 0, 3, slirp_state_save, slirp_state_load, slirp); + qemu_mutex_lock(&slirp_instances_lock); QTAILQ_INSERT_TAIL(&slirp_instances, slirp, entry); + qemu_mutex_unlock(&slirp_instances_lock); return slirp; } void slirp_cleanup(Slirp *slirp) { + qemu_mutex_lock(&slirp_instances_lock); QTAILQ_REMOVE(&slirp_instances, slirp, entry); + qemu_mutex_unlock(&slirp_instances_lock); unregister_savevm(NULL, "slirp", slirp); @@ -262,9 +267,12 @@ void slirp_cleanup(Slirp *slirp) void slirp_update_timeout(uint32_t *timeout) { + qemu_mutex_lock(&slirp_instances_lock); if (!QTAILQ_EMPTY(&slirp_instances)) { *timeout = MIN(1000, *timeout); } + qemu_mutex_unlock(&slirp_instances_lock); + curtime = qemu_get_clock_ms(rt_clock); } @@ -1140,3 +1148,15 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) return 0; } + +static void slirplayer_cleanup(void) +{ + qemu_mutex_destroy(&slirp_instances_lock); +} + +static void slirplayer_bootup(void) +{ + qemu_mutex_init(&slirp_instances_lock); + atexit(&slirplayer_cleanup); +} +slirplayer_init(slirplayer_bootup) -- 1.7.4.4