[syslog-ng] [PATCH] afmongodb: Fix a deadlock at deinit time.

Balazs Scheidler bazsi at balabit.hu
Fri Feb 3 11:36:35 CET 2012


Applied, thanks Gergely.


On Fri, 2012-02-03 at 10:52 +0100, Gergely Nagy wrote:
> There is a race condition between the writer thread and stop_threads
> (via deinit): if deinit sends the signal just at the wrong time, then
> the worker thread willl never wake up, as the main thread is already
> waiting for a join to finish.
> 
> The fix is to lock the queue_mutex before signalling, that eliminates
> the race. This patch does just that.
> 
> Signed-off-by: Gergely Nagy <algernon at balabit.hu>
> ---
>  modules/afmongodb/afmongodb.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/modules/afmongodb/afmongodb.c b/modules/afmongodb/afmongodb.c
> index 42c140e..dade669 100644
> --- a/modules/afmongodb/afmongodb.c
> +++ b/modules/afmongodb/afmongodb.c
> @@ -1,6 +1,6 @@
>  /*
> - * Copyright (c) 2002-2011 BalaBit IT Ltd, Budapest, Hungary
> - * Copyright (c) 2010-2011 Gergely Nagy <algernon at balabit.hu>
> + * Copyright (c) 2010-2012 BalaBit IT Ltd, Budapest, Hungary
> + * Copyright (c) 2010-2012 Gergely Nagy <algernon at balabit.hu>
>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License version 2 as published
> @@ -403,7 +403,9 @@ static void
>  afmongodb_dd_stop_thread (MongoDBDestDriver *self)
>  {
>    self->writer_thread_terminate = TRUE;
> +  g_mutex_lock(self->queue_mutex);
>    g_cond_signal(self->writer_thread_wakeup_cond);
> +  g_mutex_unlock(self->queue_mutex);
>    g_thread_join(self->writer_thread);
>  }
>  

-- 
Bazsi




More information about the syslog-ng mailing list