From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60891) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZanr-00072c-6r for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UZanq-00006A-9H for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:07 -0400 Received: from mail-yh0-x229.google.com ([2607:f8b0:4002:c01::229]:53007) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZanq-000066-4Y for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:06 -0400 Received: by mail-yh0-f41.google.com with SMTP id i72so54444yha.14 for ; Mon, 06 May 2013 22:51:05 -0700 (PDT) From: Liu Ping Fan Date: Tue, 7 May 2013 13:47:02 +0800 Message-Id: <1367905622-21038-15-git-send-email-qemulist@gmail.com> In-Reply-To: <1367905622-21038-1-git-send-email-qemulist@gmail.com> References: <1367905622-21038-1-git-send-email-qemulist@gmail.com> Subject: [Qemu-devel] [PATCH v1 14/14] 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 , Jan Kiszka , Stefan Hajnoczi , Anthony Liguori , Paolo Bonzini From: Liu Ping Fan slirps will run on dedicated thread, and dynamically join or disjoin this list, so need lock 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 8f5cbe0..3008c7b 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); } @@ -1167,3 +1175,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