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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu May 16 12:51:31 2013 +0200

nucleus/thread: optimize cancellation point traversal

---

 include/cobalt/nucleus/pod.h |   24 ++++++++++++++++++++++--
 kernel/cobalt/nucleus/pod.c  |   21 ++-------------------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/include/cobalt/nucleus/pod.h b/include/cobalt/nucleus/pod.h
index 685f970..632e2a8 100644
--- a/include/cobalt/nucleus/pod.h
+++ b/include/cobalt/nucleus/pod.h
@@ -32,6 +32,7 @@
  *@{*/
 
 #include <nucleus/sched.h>
+#include <nucleus/shadow.h>
 
 /* Pod status flags */
 #define XNFATAL  0x00000001    /* Fatal error in progress */
@@ -194,8 +195,6 @@ int xnpod_start_thread(xnthread_t *thread,
 
 void xnpod_stop_thread(xnthread_t *thread);
 
-void xnpod_testcancel_thread(void);
-
 void xnpod_cancel_thread(xnthread_t *thread);
 
 void xnpod_join_thread(xnthread_t *thread);
@@ -308,6 +307,27 @@ static inline void xnpod_unlock_sched(void)
        xnlock_put_irqrestore(&nklock, s);
 }
 
+void __xnpod_testcancel_thread(struct xnthread *curr);
+
+/**
+ * @fn void xnpod_testcancel_thread(void)
+ *
+ * @brief Introduce a thread cancellation point.
+ *
+ * Terminates the current thread if a cancellation request is pending
+ * for it, i.e. if xnpod_cancel_thread() was called.
+ *
+ * Calling context: This service may be called from all runtime modes
+ * of kernel or user-space threads.
+ */
+static inline void xnpod_testcancel_thread(void)
+{
+       struct xnthread *curr = xnshadow_current();
+
+       if (curr && xnthread_test_info(curr, XNCANCELD))
+               __xnpod_testcancel_thread(curr);
+}
+
 int xnpod_handle_exception(struct ipipe_trap_data *d);
 
 void xnpod_fire_callouts(xnqueue_t *hookq,
diff --git a/kernel/cobalt/nucleus/pod.c b/kernel/cobalt/nucleus/pod.c
index dc1de97..8917d5c 100644
--- a/kernel/cobalt/nucleus/pod.c
+++ b/kernel/cobalt/nucleus/pod.c
@@ -874,31 +874,14 @@ void __xnpod_cleanup_thread(struct xnthread *thread)
        wake_up(&nkjoinq);
 }
 
-/**
- * @fn void xnpod_testcancel_thread(void)
- *
- * @brief Introduce a thread cancellation point.
- *
- * Terminates the current thread if a cancellation request is pending
- * for it, i.e. if xnpod_cancel_thread() was called.
- *
- * Calling context: This service may be called from all runtime modes.
- *
- * Rescheduling: always in case of cancellation from primary mode.
- */
-void xnpod_testcancel_thread(void)
+void __xnpod_testcancel_thread(struct xnthread *curr)
 {
-       struct xnthread *curr = xnshadow_current();
-
-       if (curr == NULL || !xnthread_test_info(curr, XNCANCELD))
-               return;
-
        if (!xnthread_test_state(curr, XNRELAX))
                xnshadow_relax(0, 0);
 
        do_exit(0);
 }
-EXPORT_SYMBOL_GPL(xnpod_testcancel_thread);
+EXPORT_SYMBOL_GPL(__xnpod_testcancel_thread);
 
 /**
  * @fn void xnpod_cancel_thread(struct xnthread *thread)


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

Reply via email to