From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49805) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UVYkC-0006DX-Lw for qemu-devel@nongnu.org; Thu, 25 Apr 2013 22:50:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UVYkB-0000HF-KD for qemu-devel@nongnu.org; Thu, 25 Apr 2013 22:50:40 -0400 Received: from mail-ob0-x22b.google.com ([2607:f8b0:4003:c01::22b]:34539) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UVYkB-0000H4-Ez for qemu-devel@nongnu.org; Thu, 25 Apr 2013 22:50:39 -0400 Received: by mail-ob0-f171.google.com with SMTP id er7so3142342obc.30 for ; Thu, 25 Apr 2013 19:50:38 -0700 (PDT) From: Liu Ping Fan Date: Fri, 26 Apr 2013 10:47:35 +0800 Message-Id: <1366944455-14239-15-git-send-email-qemulist@gmail.com> In-Reply-To: <1366944455-14239-1-git-send-email-qemulist@gmail.com> References: <1366944455-14239-1-git-send-email-qemulist@gmail.com> Subject: [Qemu-devel] [RFC PATCH v5 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