[rrd-developers] [PATCH] No need to keep track of connection threads.

Tobias Oetiker tobi at oetiker.ch
Thu Apr 9 17:07:58 CEST 2009


Hi Kevin,

Tuesday kevin brintnall wrote:

> The bookkeeping of all threads is not necessary, since we cannot
> pthread_join() them anyway.
>
> We only need to know when the last one has exited.

if you say so ... and no one seems to  oppose, its added

cheers
tobi


> ---
>  src/rrd_daemon.c |   61 +++++------------------------------------------------
>  1 files changed, 6 insertions(+), 55 deletions(-)
>
> diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c
> index 7a72b07..1e53175 100644
> --- a/src/rrd_daemon.c
> +++ b/src/rrd_daemon.c
> @@ -199,8 +199,8 @@ static int config_queue_threads = 4;
>  static pthread_t flush_thread;
>  static pthread_cond_t flush_cond = PTHREAD_COND_INITIALIZER;
>
> -static pthread_t *connection_threads = NULL;
>  static pthread_mutex_t connection_threads_lock = PTHREAD_MUTEX_INITIALIZER;
> +static pthread_cond_t  connection_threads_done = PTHREAD_COND_INITIALIZER;
>  static int connection_threads_num = 0;
>
>  /* Cache stuff */
> @@ -1946,7 +1946,6 @@ static void close_connection(listen_socket_t *sock) /* {{{ */
>  static void *connection_thread_main (void *args) /* {{{ */
>  {
>    listen_socket_t *sock;
> -  int i;
>    int fd;
>
>    sock = (listen_socket_t *) args;
> @@ -1963,22 +1962,7 @@ static void *connection_thread_main (void *args) /* {{{ */
>    }
>
>    pthread_mutex_lock (&connection_threads_lock);
> -  {
> -    pthread_t *temp;
> -
> -    temp = (pthread_t *) rrd_realloc (connection_threads,
> -        sizeof (pthread_t) * (connection_threads_num + 1));
> -    if (temp == NULL)
> -    {
> -      RRDD_LOG (LOG_ERR, "connection_thread_main: realloc(++) failed.");
> -    }
> -    else
> -    {
> -      connection_threads = temp;
> -      connection_threads[connection_threads_num] = pthread_self ();
> -      connection_threads_num++;
> -    }
> -  }
> +  connection_threads_num++;
>    pthread_mutex_unlock (&connection_threads_lock);
>
>    while (do_shutdown == 0)
> @@ -2048,34 +2032,9 @@ out_close:
>
>    /* Remove this thread from the connection threads list */
>    pthread_mutex_lock (&connection_threads_lock);
> -  {
> -    pthread_t self;
> -    pthread_t *temp;
> -
> -    /* Find out own index in the array */
> -    self = pthread_self ();
> -    for (i = 0; i < connection_threads_num; i++)
> -      if (pthread_equal (connection_threads[i], self) != 0)
> -        break;
> -    assert (i < connection_threads_num);
> -
> -    /* Move the trailing threads forward. */
> -    if (i < (connection_threads_num - 1))
> -    {
> -      memmove (connection_threads + i,
> -               connection_threads + i + 1,
> -               sizeof (pthread_t) * (connection_threads_num - i - 1));
> -    }
> -
> -    connection_threads_num--;
> -
> -    temp = rrd_realloc(connection_threads,
> -                   sizeof(*connection_threads) * connection_threads_num);
> -    if (connection_threads_num > 0 && temp == NULL)
> -      RRDD_LOG(LOG_ERR, "connection_thread_main: realloc(--) failed.");
> -    else
> -      connection_threads = temp;
> -  }
> +  connection_threads_num--;
> +  if (connection_threads_num <= 0)
> +    pthread_cond_broadcast(&connection_threads_done);
>    pthread_mutex_unlock (&connection_threads_lock);
>
>    return (NULL);
> @@ -2407,15 +2366,7 @@ static void *listen_thread_main (void *args __attribute__((unused))) /* {{{ */
>
>    pthread_mutex_lock (&connection_threads_lock);
>    while (connection_threads_num > 0)
> -  {
> -    pthread_t wait_for;
> -
> -    wait_for = connection_threads[0];
> -
> -    pthread_mutex_unlock (&connection_threads_lock);
> -    pthread_join (wait_for, /* retval = */ NULL);
> -    pthread_mutex_lock (&connection_threads_lock);
> -  }
> +    pthread_cond_wait(&connection_threads_done, &connection_threads_lock);
>    pthread_mutex_unlock (&connection_threads_lock);
>
>    free(pollfds);
>

-- 
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland
http://it.oetiker.ch tobi at oetiker.ch ++41 62 775 9902 / sb: -9900



More information about the rrd-developers mailing list