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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core