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

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Mon Mar  1 21:33:46 2010 +0100

Use pthread_once for initializations which should be called once.

---

 src/skins/common/sem_heap.c |   14 +++++++++-----
 src/skins/common/timeconv.c |   11 +++++++++--
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index ad2e9b8..55ad7d1 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -1,7 +1,8 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include <pthread.h>
+
 #include <unistd.h>
+#include <pthread.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -75,11 +76,8 @@ static void remap_on_fork(void)
        }
 }
 
-void xeno_init_sem_heaps(void)
+static void xeno_init_sem_heaps_inner(void)
 {
-       if (xeno_sem_heap[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)");
@@ -93,3 +91,9 @@ void xeno_init_sem_heaps(void)
                exit(EXIT_FAILURE);
        }
 }
+
+void xeno_init_sem_heaps(void)
+{
+       static pthread_once_t init_sem_heaps_once = PTHREAD_ONCE_INIT;
+       pthread_once(&init_sem_heaps_once, &xeno_init_sem_heaps_inner);
+}
diff --git a/src/skins/common/timeconv.c b/src/skins/common/timeconv.c
index 9b2ba23..87a0ba2 100644
--- a/src/skins/common/timeconv.c
+++ b/src/skins/common/timeconv.c
@@ -20,19 +20,26 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <pthread.h>
+
 #include <asm/xenomai/syscall.h>
 #include <asm-generic/xenomai/bits/timeconv.h>
 
 xnsysinfo_t sysinfo;
 
+static void xeno_init_timeconv_inner(void)
+{
+       xnarch_init_timeconv(sysinfo.cpufreq);
+}
+
 void xeno_init_timeconv(int muxid)
 {
+       static pthread_once_t init_timeconv_once = PTHREAD_ONCE_INIT;
        int err = XENOMAI_SYSCALL2(__xn_sys_info, muxid, &sysinfo);
        if (err) {
                fprintf(stderr, "Xenomai: sys_info failed: %s\n",
                        strerror(-err));
                exit(EXIT_FAILURE);
        }
-
-       xnarch_init_timeconv(sysinfo.cpufreq);
+       pthread_once(&init_timeconv_once, &xeno_init_timeconv_inner);
 }


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

Reply via email to