Module: xenomai-jki
Branch: for-upstream
Commit: 40e5b366397db3dde0ebde861a739dc2cd624b5a
URL:    
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=40e5b366397db3dde0ebde861a739dc2cd624b5a

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Fri Feb 12 17:40:09 2010 +0100

Fix remapping of global sem_heap on fork

As xeno_init_sem_heaps might be called multiple times even without fork,
we must not remap the global heap here. Register an atfork handler
instead that handles this case and simple reject multiple heap creation
requests for the same process.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 src/skins/common/sem_heap.c |   29 ++++++++++++++++++-----------
 1 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index 89f325a..12b256f 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -1,6 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
-
+#include <pthread.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -65,24 +65,31 @@ static void unmap_sem_heap(unsigned long heap_addr, 
unsigned shared)
        munmap((void *) heap_addr, hinfo.size);
 }
 
+static void remap_on_fork(void)
+{
+       unmap_sem_heap(xeno_sem_heap[0], 0);
+
+       if (xeno_sem_heap[0] == (unsigned long) MAP_FAILED) {
+               perror("Xenomai: mmap(local sem heap)");
+               exit(EXIT_FAILURE);
+       }
+}
+
 void xeno_init_sem_heaps(void)
 {
-       /* In case we forked, we need to map the new local semaphore heap */
        if (xeno_sem_heap[0])
-               unmap_sem_heap(xeno_sem_heap[0], 0);
+               return;
+
        xeno_sem_heap[0] = (unsigned long) map_sem_heap(0);
        if (xeno_sem_heap[0] == (unsigned long) MAP_FAILED) {
                perror("Xenomai: mmap(local sem heap)");
                exit(EXIT_FAILURE);
        }
+       pthread_atfork(NULL, NULL, remap_on_fork);
 
-       /* Even if we forked the global semaphore heap did not change, no need
-         to map it anew */
-       if (!xeno_sem_heap[1]) {
-               xeno_sem_heap[1] = (unsigned long) map_sem_heap(1);
-               if (xeno_sem_heap[1] == (unsigned long) MAP_FAILED) {
-                       perror("Xenomai: mmap(global sem heap)");
-                       exit(EXIT_FAILURE);
-               }
+       xeno_sem_heap[1] = (unsigned long) map_sem_heap(1);
+       if (xeno_sem_heap[1] == (unsigned long) MAP_FAILED) {
+               perror("Xenomai: mmap(global sem heap)");
+               exit(EXIT_FAILURE);
        }
 }


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

Reply via email to