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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Nov 20 18:17:48 2011 +0100

copperplate/timerobj: segregate core-specific data

---

 include/copperplate/timerobj.h    |   19 +++++++++++++++++--
 lib/copperplate/timerobj-cobalt.c |   32 ++++++++++++++++----------------
 2 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/include/copperplate/timerobj.h b/include/copperplate/timerobj.h
index 91be73f..ab1fbd8 100644
--- a/include/copperplate/timerobj.h
+++ b/include/copperplate/timerobj.h
@@ -22,13 +22,28 @@
 #include <pthread.h>
 #include <time.h>
 #include <copperplate/lock.h>
+
+#ifdef CONFIG_XENO_COBALT
+
 #include <copperplate/list.h>
 
+struct timerobj_corespec {
+       struct itimerspec spec;
+       struct pvholder link;
+};
+
+#else  /* CONFIG_XENO_MERCURY */
+
+struct timerobj_corespec {
+       /* Nothing specific. */
+};
+
+#endif /* CONFIG_XENO_MERCURY */
+
 struct timerobj {
+       struct timerobj_corespec core;
        void (*handler)(struct timerobj *tmobj);
        timer_t timer;
-       struct itimerspec spec;
-       struct pvholder link;
        pthread_mutex_t lock;
        int cancel_state;
 };
diff --git a/lib/copperplate/timerobj-cobalt.c 
b/lib/copperplate/timerobj-cobalt.c
index 772dea7..248d8f5 100644
--- a/lib/copperplate/timerobj-cobalt.c
+++ b/lib/copperplate/timerobj-cobalt.c
@@ -72,17 +72,17 @@ static void timerobj_enqueue(struct timerobj *tmobj)
        struct timerobj *__tmobj;
 
        if (pvlist_empty(&svtimers)) {
-               pvlist_append(&tmobj->link, &svtimers);
+               pvlist_append(&tmobj->core.link, &svtimers);
                return;
        }
 
-       pvlist_for_each_entry_reverse(__tmobj, &svtimers, link) {
-               if (timeobj_compare(&__tmobj->spec.it_value,
-                                   &tmobj->spec.it_value) <= 0)
+       pvlist_for_each_entry_reverse(__tmobj, &svtimers, core.link) {
+               if (timeobj_compare(&__tmobj->core.spec.it_value,
+                                   &tmobj->core.spec.it_value) <= 0)
                        break;
        }
 
-       atpvh(&__tmobj->link, &tmobj->link);
+       atpvh(&__tmobj->core.link, &tmobj->core.link);
 }
 
 static void *timerobj_server(void *arg)
@@ -108,14 +108,14 @@ static void *timerobj_server(void *arg)
 
                __RT(clock_gettime(CLOCK_COPPERPLATE, &now));
 
-               pvlist_for_each_entry_safe(tmobj, tmp, &svtimers, link) {
-                       value = tmobj->spec.it_value;
+               pvlist_for_each_entry_safe(tmobj, tmp, &svtimers, core.link) {
+                       value = tmobj->core.spec.it_value;
                        if (timeobj_compare(&value, &now) > 0)
                                break;
-                       pvlist_remove_init(&tmobj->link);
-                       interval = tmobj->spec.it_interval;
+                       pvlist_remove_init(&tmobj->core.link);
+                       interval = tmobj->core.spec.it_interval;
                        if (interval.tv_sec > 0 || interval.tv_nsec > 0) {
-                               timespec_add(&tmobj->spec.it_value,
+                               timespec_add(&tmobj->core.spec.it_value,
                                             &value, &interval);
                                timerobj_enqueue(tmobj);
                        }
@@ -172,7 +172,7 @@ int timerobj_init(struct timerobj *tmobj)
        evt.sigev_value.sival_ptr = &svsem;
 
        tmobj->handler = NULL;
-       pvholder_init(&tmobj->link); /* so we may use pvholder_linked() */
+       pvholder_init(&tmobj->core.link); /* so we may use pvholder_linked() */
 
        if (__RT(timer_create(CLOCK_COPPERPLATE, &evt, &tmobj->timer)))
                return __bt(-errno);
@@ -190,8 +190,8 @@ void timerobj_destroy(struct timerobj *tmobj) /* lock held, 
dropped */
 {
        write_lock_nocancel(&svlock);
 
-       if (pvholder_linked(&tmobj->link))
-               pvlist_remove_init(&tmobj->link);
+       if (pvholder_linked(&tmobj->core.link))
+               pvlist_remove_init(&tmobj->core.link);
 
        write_unlock(&svlock);
 
@@ -205,7 +205,7 @@ int timerobj_start(struct timerobj *tmobj,
                   struct itimerspec *it) /* lock held, dropped */
 {
        tmobj->handler = handler;
-       tmobj->spec = *it;
+       tmobj->core.spec = *it;
        write_lock_nocancel(&svlock);
        timerobj_enqueue(tmobj);
        write_unlock(&svlock);
@@ -223,8 +223,8 @@ int timerobj_stop(struct timerobj *tmobj) /* lock held, 
dropped */
 {
        write_lock_nocancel(&svlock);
 
-       if (pvholder_linked(&tmobj->link))
-               pvlist_remove_init(&tmobj->link);
+       if (pvholder_linked(&tmobj->core.link))
+               pvlist_remove_init(&tmobj->core.link);
 
        write_unlock(&svlock);
 


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

Reply via email to