All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@domain.hid>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Cc: xenomai@xenomai.org
Subject: Re: [Xenomai-core] [PATCH 1/1] rtdk: various fixes.
Date: Mon, 11 Jan 2010 09:02:31 +0100	[thread overview]
Message-ID: <4B4ADB17.4070905@domain.hid> (raw)
In-Reply-To: <1262955043-5304-1-git-send-email-gilles.chanteperdrix@xenomai.org>

[-- Attachment #1: Type: text/plain, Size: 3195 bytes --]

Gilles Chanteperdrix wrote:
> When exiting a process, rtdk buffers are not flushed. Fix that by
> introducing a destructor for the library which flushes the buffers.
> 
> When forking, if the main thread has an rt_printf buffer, it is reused by
> the child, which is a good thing, however, it is not emptied, so could cause
> the same message to be printed twice. Fix that by emptying the main thread
> buffer upon fork.
> 
> When spawning the rt_print thread, it uses a stack size of
> PTHREAD_STACK_MIN, which may be too small for printf to work reliably on
> some architectures, set the stack size to the
> empirically-known-to-be-working size of... 32Kb.
> ---
>  src/rtdk/init.c     |    5 +++++
>  src/rtdk/internal.h |    1 +
>  src/rtdk/rt_print.c |   21 ++++++++++++++++++++-
>  3 files changed, 26 insertions(+), 1 deletions(-)
> 
> diff --git a/src/rtdk/init.c b/src/rtdk/init.c
> index 2084c73..b864175 100644
> --- a/src/rtdk/init.c
> +++ b/src/rtdk/init.c
> @@ -22,3 +22,8 @@ static __attribute__ ((constructor)) void __init_rtdk(void)
>  {
>  	__rt_print_init();
>  }
> +
> +static __attribute__ ((destructor)) void __exit_rtdk(void)
> +{
> +	__rt_print_exit();
> +}
> diff --git a/src/rtdk/internal.h b/src/rtdk/internal.h
> index bd15b2d..345d4fa 100644
> --- a/src/rtdk/internal.h
> +++ b/src/rtdk/internal.h
> @@ -23,6 +23,7 @@
>  #include <sys/time.h>
>  
>  void __rt_print_init(void);
> +void __rt_print_exit(void);
>  
>  void __real_free(void *ptr);
>  void *__real_malloc(size_t size);
> diff --git a/src/rtdk/rt_print.c b/src/rtdk/rt_print.c
> index c6b5c55..dae7d7b 100644
> --- a/src/rtdk/rt_print.c
> +++ b/src/rtdk/rt_print.c
> @@ -455,7 +455,7 @@ static void spawn_printer_thread(void)
>  	pthread_attr_t thattr;
>  
>  	pthread_attr_init(&thattr);
> -	pthread_attr_setstacksize(&thattr, PTHREAD_STACK_MIN);
> +	pthread_attr_setstacksize(&thattr, 32768);

Mmh... maybe rather $something +PTHREAD_STACK_MIN?

>  	pthread_create(&printer_thread, &thattr, printer_loop, NULL);
>  }
>  
> @@ -464,6 +464,15 @@ static void forked_child_init(void)
>  	struct print_buffer *my_buffer = pthread_getspecific(buffer_key);
>  	struct print_buffer **pbuffer = &first_buffer;
>  
> +	if (my_buffer) {
> +		/* Any content of my_buffer should be printed by our parent,
> +		   not us. */
> +		memset(my_buffer->ring, 0, my_buffer->size);
> +
> +		my_buffer->read_pos  = 0;
> +		my_buffer->write_pos = 0;
> +	}
> +

Ack.

>  	/* re-init to avoid finding it locked by some parent thread */
>  	pthread_mutex_init(&buffer_lock, NULL);
>  
> @@ -518,3 +527,13 @@ void __rt_print_init(void)
>  	spawn_printer_thread();
>  	pthread_atfork(NULL, NULL, forked_child_init);
>  }
> +
> +void __rt_print_exit(void)
> +{
> +	if (buffers) {
> +		/* Flush the buffers. Do not call print_buffers here
> +		 * since we do not know if our stack is big enough. */
> +		nanosleep(&print_period, NULL);
> +		nanosleep(&print_period, NULL);
> +	}
> +}

IIRC, that's what cleanup_buffer is supposed to do, triggered by the
pthread key destruction. Can you explain why it failed in your scenario.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

  reply	other threads:[~2010-01-11  8:02 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-08 12:50 [Xenomai-core] [PATCH 1/1] rtdk: various fixes Gilles Chanteperdrix
2010-01-11  8:02 ` Jan Kiszka [this message]
2010-01-11  8:20   ` Gilles Chanteperdrix
     [not found]   ` <4B4ADEE2.9070000@domain.hid>
2010-01-11  8:43     ` Jan Kiszka
2010-01-11  9:01       ` Gilles Chanteperdrix
2010-01-11 10:58       ` Gilles Chanteperdrix
2010-01-13 14:39       ` Gilles Chanteperdrix
2010-01-15  8:41         ` Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B4ADB17.4070905@domain.hid \
    --to=jan.kiszka@domain.hid \
    --cc=gilles.chanteperdrix@xenomai.org \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.