Module: xenomai-3
Branch: next
Commit: 3153c076d8ab143d3cdff799818e0cb0d649ab23
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3153c076d8ab143d3cdff799818e0cb0d649ab23

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Jul 26 16:55:58 2015 +0200

lib/cobalt: force cleanup of printer loop upon main() exit

This makes the obscure rt_print_cleanup() call useless, and therefore
removed from the API.

---

 include/cobalt/stdio.h |    2 --
 lib/cobalt/printf.c    |   85 ++++++++++++++++++++++--------------------------
 2 files changed, 38 insertions(+), 49 deletions(-)

diff --git a/include/cobalt/stdio.h b/include/cobalt/stdio.h
index 6642b40..f0c289d 100644
--- a/include/cobalt/stdio.h
+++ b/include/cobalt/stdio.h
@@ -108,8 +108,6 @@ void rt_vsyslog(int priority, const char *format, va_list 
args);
 
 int rt_print_init(size_t buffer_size, const char *name);
 
-void rt_print_cleanup(void);
-
 const char *rt_print_buffer_name(void);
 
 void rt_print_flush_buffers(void);
diff --git a/lib/cobalt/printf.c b/lib/cobalt/printf.c
index b91a17c..bb34d7e 100644
--- a/lib/cobalt/printf.c
+++ b/lib/cobalt/printf.c
@@ -81,13 +81,14 @@ static struct timespec syncdelay;
 static pthread_mutex_t buffer_lock;
 static pthread_cond_t printer_wakeup;
 static pthread_key_t buffer_key;
+static pthread_key_t cleanup_key;
 static pthread_t printer_thread;
 static atomic_long_t *pool_bitmap;
 static unsigned pool_bitmap_len;
 static unsigned pool_buf_size;
 static unsigned long pool_start, pool_len;
 
-static void cleanup_buffer(struct print_buffer *buffer);
+static void release_buffer(struct print_buffer *buffer);
 static void print_buffers(void);
 
 /* *** rt_print API *** */
@@ -408,7 +409,7 @@ int rt_print_init(size_t buffer_size, const char 
*buffer_name)
                        set_buffer_name(buffer, buffer_name);
                        return 0;
                }
-               cleanup_buffer(buffer);
+               release_buffer(buffer);
                buffer = NULL;
        }
 
@@ -461,23 +462,6 @@ int rt_print_init(size_t buffer_size, const char 
*buffer_name)
        return 0;
 }
 
-void rt_print_cleanup(void)
-{
-       struct print_buffer *buffer = pthread_getspecific(buffer_key);
-
-       if (buffer)
-               cleanup_buffer(buffer);
-       else {
-               pthread_mutex_lock(&buffer_lock);
-
-               print_buffers();
-
-               pthread_mutex_unlock(&buffer_lock);
-       }
-
-       pthread_cancel(printer_thread);
-}
-
 const char *rt_print_buffer_name(void)
 {
        struct print_buffer *buffer = pthread_getspecific(buffer_key);
@@ -503,9 +487,11 @@ void rt_print_flush_buffers(void)
        pthread_mutex_unlock(&buffer_lock);
 }
 
-static void cleanup_buffer(struct print_buffer *buffer)
+static void release_buffer(struct print_buffer *buffer)
 {
        struct print_buffer *prev, *next;
+       unsigned long old_bitmap, bitmap;
+       unsigned int i, j;
 
        assert_nrt();
 
@@ -518,29 +504,23 @@ static void cleanup_buffer(struct print_buffer *buffer)
        pthread_mutex_unlock(&buffer_lock);
 
        /* Return the buffer to the pool */
-       {
-               unsigned long old_bitmap, bitmap;
-               unsigned i, j;
-
-               if ((unsigned long)buffer - pool_start >= pool_len)
-                       goto dofree;
-
-               j = ((unsigned long)buffer - pool_start) / pool_buf_size;
-               i = j / __WORDSIZE;
-               j = j % __WORDSIZE;
+       if ((unsigned long)buffer - pool_start >= pool_len)
+               goto dofree;
 
-               old_bitmap = atomic_long_read(&pool_bitmap[i]);
-               do {
-                       bitmap = old_bitmap;
-                       old_bitmap = atomic_cmpxchg(&pool_bitmap[i],
-                                                   bitmap,
-                                                   bitmap | (1UL << j));
-               } while (old_bitmap != bitmap);
-
-               return;
-       }
-  dofree:
+       j = ((unsigned long)buffer - pool_start) / pool_buf_size;
+       i = j / __WORDSIZE;
+       j = j % __WORDSIZE;
 
+       old_bitmap = atomic_long_read(&pool_bitmap[i]);
+       do {
+               bitmap = old_bitmap;
+               old_bitmap = atomic_cmpxchg(&pool_bitmap[i],
+                                           bitmap,
+                                           bitmap | (1UL << j));
+       } while (old_bitmap != bitmap);
+
+       return;
+dofree:
        pthread_mutex_lock(&buffer_lock);
 
        prev = buffer->prev;
@@ -561,6 +541,16 @@ static void cleanup_buffer(struct print_buffer *buffer)
        free(buffer);
 }
 
+static void do_cleanup(void *arg)
+{
+       struct print_buffer *buffer = pthread_getspecific(buffer_key);
+
+       if (buffer)
+               release_buffer(buffer);
+
+       pthread_cancel(printer_thread);
+}
+
 static inline uint32_t get_next_seq_no(struct print_buffer *buffer)
 {
        struct entry_head *head = buffer->ring + buffer->read_pos;
@@ -651,7 +641,7 @@ static void spawn_printer_thread(void)
 {
        pthread_attr_t thattr;
 
-       __COBALT(pthread_attr_init)(&thattr);
+       pthread_attr_init(&thattr);
        pthread_create(&printer_thread, &thattr, printer_loop, NULL);
 }
 
@@ -676,11 +666,11 @@ void cobalt_print_init_atfork(void)
                if (*pbuffer == my_buffer)
                        pbuffer = &(*pbuffer)->next;
                else if ((unsigned long)*pbuffer - pool_start < pool_len) {
-                       cleanup_buffer(*pbuffer);
+                       release_buffer(*pbuffer);
                        pbuffer = &(*pbuffer)->next;
                }
                else
-                       cleanup_buffer(*pbuffer);
+                       release_buffer(*pbuffer);
        }
 
        spawn_printer_thread();
@@ -728,11 +718,12 @@ void cobalt_print_init(void)
        }
 done:
        pthread_mutex_init(&buffer_lock, NULL);
-       pthread_key_create(&buffer_key, (void (*)(void*))cleanup_buffer);
-
+       pthread_key_create(&buffer_key, (void (*)(void*))release_buffer);
+       pthread_key_create(&cleanup_key, do_cleanup);
        pthread_cond_init(&printer_wakeup, NULL);
-
        spawn_printer_thread();
+       /* We just need a non-zero TSD to trigger the dtor upon unwinding. */
+       pthread_setspecific(cleanup_key, (void *)1);
 
        atexit(rt_print_flush_buffers);
 }


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to