Module: xenomai-head
Branch: master
Commit: eb3db3c55b7e716623b3bec9fc8b6b9720b48ee1
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=eb3db3c55b7e716623b3bec9fc8b6b9720b48ee1

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Wed Aug 24 19:44:39 2011 +0200

common: a better fix for rt_printf pool buffers and fork

---

 src/skins/common/rt_print.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/skins/common/rt_print.c b/src/skins/common/rt_print.c
index d4cf0db..ec10a21 100644
--- a/src/skins/common/rt_print.c
+++ b/src/skins/common/rt_print.c
@@ -467,6 +467,10 @@ static void cleanup_buffer(struct print_buffer *buffer)
                j = j % BITS_PER_LONG;
 
                old_bitmap = xnarch_atomic_get(&pool_bitmap[i]);
+
+               if ((old_bitmap & (1UL << j)) == 0)
+                       return;
+
                do {
                        bitmap = old_bitmap;
                        old_bitmap = xnarch_atomic_cmpxchg(&pool_bitmap[i],
@@ -610,11 +614,14 @@ static void forked_child_init(void)
        pthread_mutex_init(&buffer_lock, NULL);
 
        while (*pbuffer) {
-               if (*pbuffer == my_buffer
 #ifdef CONFIG_XENO_FASTSYNCH
-                   || (unsigned long)*pbuffer - pool_start < pool_len
+               if ((unsigned long)*pbuffer - pool_start < pool_len) {
+                       cleanup_buffer(*pbuffer);
+                       pbuffer = &(*pbuffer)->next;
+                       continue;
+               }
 #endif /* CONFIG_XENO_FASTSYNCH */
-                   )
+               if (*pbuffer == my_buffer)
                        pbuffer = &(*pbuffer)->next;
                else
                        cleanup_buffer(*pbuffer);


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to