[Xenomai-git] Gilles Chanteperdrix : native: add cancellation points

2010-10-04 Thread GIT version control
Module: xenomai-head
Branch: master
Commit: 7a39eff4ed5f9e4aa8acb111328b1343511e41ae
URL:
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=7a39eff4ed5f9e4aa8acb111328b1343511e41ae

Author: Gilles Chanteperdrix 
Date:   Sun Aug  1 19:02:08 2010 +0200

native: add cancellation points

---

 src/skins/native/cond.c  |   81 +++---
 src/skins/native/intr.c  |   11 ++-
 src/skins/native/queue.c |   60 ++---
 src/skins/native/sem.c   |   22 +++-
 src/skins/native/task.c  |   46 ++
 5 files changed, 192 insertions(+), 28 deletions(-)

diff --git a/src/skins/native/cond.c b/src/skins/native/cond.c
index f874678..cf7a639 100644
--- a/src/skins/native/cond.c
+++ b/src/skins/native/cond.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
 
+#include 
+
 #include 
 #include 
 #include 
@@ -39,12 +41,40 @@ int rt_cond_delete(RT_COND *cond)
return XENOMAI_SKINCALL1(__native_muxid, __native_cond_delete, cond);
 }
 
+struct rt_cond_cleanup_t {
+   RT_MUTEX *mutex;
+   unsigned saved_lockcnt;
+};
+
+static void __rt_cond_cleanup(void *data)
+{
+   struct rt_cond_cleanup_t *c = (struct rt_cond_cleanup_t *)data;
+   int err;
+
+   do {
+   err = XENOMAI_SKINCALL2(__native_muxid,
+   __native_cond_wait_epilogue, c->mutex,
+   c->saved_lockcnt);
+   } while (err == EINTR);
+
+#ifdef CONFIG_XENO_FASTSYNCH
+   c->mutex->lockcnt = c->saved_lockcnt;
+#endif /* CONFIG_XENO_FASTSYNCH */
+}
+
 int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
@@ -53,54 +83,81 @@ int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME 
timeout)
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
+
+   pthread_setcanceltype(oldtype, NULL);
 
-   mutex->lockcnt = saved_lockcnt;
+   pthread_cleanup_pop(0);
+
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
 __native_cond_wait_prologue, cond, mutex,
-&saved_lockcnt, XN_RELATIVE, &timeout);
+&c.saved_lockcnt, XN_RELATIVE, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
 
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
 #endif /* !CONFIG_XENO_FASTSYNCH */
 
+   pthread_testcancel();
+
return err;
 }
 
 int rt_cond_wait_until(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
NULL, XN_REALTIME, &timeout);
 
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
+
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
-   mutex->lockcnt = saved_lockcnt;
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
-   &saved_lockcnt, XN_REALTIME, &timeout);
+   &c.saved_lockcnt, XN_REALTIME, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_c

[Xenomai-git] Gilles Chanteperdrix : native: add cancellation points

2010-08-02 Thread GIT version control
Module: xenomai-head
Branch: master
Commit: 3abdf95ed016b3b70bb08d5bd106917cdf057834
URL:
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=3abdf95ed016b3b70bb08d5bd106917cdf057834

Author: Gilles Chanteperdrix 
Date:   Sun Aug  1 19:02:08 2010 +0200

native: add cancellation points

---

 src/skins/native/cond.c  |   81 +++---
 src/skins/native/intr.c  |   11 ++-
 src/skins/native/queue.c |   60 ++---
 src/skins/native/sem.c   |   22 +++-
 src/skins/native/task.c  |   46 ++
 5 files changed, 192 insertions(+), 28 deletions(-)

diff --git a/src/skins/native/cond.c b/src/skins/native/cond.c
index f874678..cf7a639 100644
--- a/src/skins/native/cond.c
+++ b/src/skins/native/cond.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
 
+#include 
+
 #include 
 #include 
 #include 
@@ -39,12 +41,40 @@ int rt_cond_delete(RT_COND *cond)
return XENOMAI_SKINCALL1(__native_muxid, __native_cond_delete, cond);
 }
 
+struct rt_cond_cleanup_t {
+   RT_MUTEX *mutex;
+   unsigned saved_lockcnt;
+};
+
+static void __rt_cond_cleanup(void *data)
+{
+   struct rt_cond_cleanup_t *c = (struct rt_cond_cleanup_t *)data;
+   int err;
+
+   do {
+   err = XENOMAI_SKINCALL2(__native_muxid,
+   __native_cond_wait_epilogue, c->mutex,
+   c->saved_lockcnt);
+   } while (err == EINTR);
+
+#ifdef CONFIG_XENO_FASTSYNCH
+   c->mutex->lockcnt = c->saved_lockcnt;
+#endif /* CONFIG_XENO_FASTSYNCH */
+}
+
 int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
@@ -53,54 +83,81 @@ int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME 
timeout)
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
+
+   pthread_setcanceltype(oldtype, NULL);
 
-   mutex->lockcnt = saved_lockcnt;
+   pthread_cleanup_pop(0);
+
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
 __native_cond_wait_prologue, cond, mutex,
-&saved_lockcnt, XN_RELATIVE, &timeout);
+&c.saved_lockcnt, XN_RELATIVE, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
 
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
 #endif /* !CONFIG_XENO_FASTSYNCH */
 
+   pthread_testcancel();
+
return err;
 }
 
 int rt_cond_wait_until(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
NULL, XN_REALTIME, &timeout);
 
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
+
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
-   mutex->lockcnt = saved_lockcnt;
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
-   &saved_lockcnt, XN_REALTIME, &timeout);
+   &c.saved_lockcnt, XN_REALTIME, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_c

[Xenomai-git] Gilles Chanteperdrix : native: add cancellation points

2010-08-01 Thread GIT version control
Module: xenomai-2.5
Branch: master
Commit: 7a39eff4ed5f9e4aa8acb111328b1343511e41ae
URL:
http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=7a39eff4ed5f9e4aa8acb111328b1343511e41ae

Author: Gilles Chanteperdrix 
Date:   Sun Aug  1 19:02:08 2010 +0200

native: add cancellation points

---

 src/skins/native/cond.c  |   81 +++---
 src/skins/native/intr.c  |   11 ++-
 src/skins/native/queue.c |   60 ++---
 src/skins/native/sem.c   |   22 +++-
 src/skins/native/task.c  |   46 ++
 5 files changed, 192 insertions(+), 28 deletions(-)

diff --git a/src/skins/native/cond.c b/src/skins/native/cond.c
index f874678..cf7a639 100644
--- a/src/skins/native/cond.c
+++ b/src/skins/native/cond.c
@@ -16,6 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
 
+#include 
+
 #include 
 #include 
 #include 
@@ -39,12 +41,40 @@ int rt_cond_delete(RT_COND *cond)
return XENOMAI_SKINCALL1(__native_muxid, __native_cond_delete, cond);
 }
 
+struct rt_cond_cleanup_t {
+   RT_MUTEX *mutex;
+   unsigned saved_lockcnt;
+};
+
+static void __rt_cond_cleanup(void *data)
+{
+   struct rt_cond_cleanup_t *c = (struct rt_cond_cleanup_t *)data;
+   int err;
+
+   do {
+   err = XENOMAI_SKINCALL2(__native_muxid,
+   __native_cond_wait_epilogue, c->mutex,
+   c->saved_lockcnt);
+   } while (err == EINTR);
+
+#ifdef CONFIG_XENO_FASTSYNCH
+   c->mutex->lockcnt = c->saved_lockcnt;
+#endif /* CONFIG_XENO_FASTSYNCH */
+}
+
 int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
@@ -53,54 +83,81 @@ int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME 
timeout)
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
+
+   pthread_setcanceltype(oldtype, NULL);
 
-   mutex->lockcnt = saved_lockcnt;
+   pthread_cleanup_pop(0);
+
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
 __native_cond_wait_prologue, cond, mutex,
-&saved_lockcnt, XN_RELATIVE, &timeout);
+&c.saved_lockcnt, XN_RELATIVE, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
 
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
 #endif /* !CONFIG_XENO_FASTSYNCH */
 
+   pthread_testcancel();
+
return err;
 }
 
 int rt_cond_wait_until(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)
 {
-   int saved_lockcnt, err;
+   struct rt_cond_cleanup_t c = {
+   .mutex = mutex,
+   };
+   int err, oldtype;
+
+   pthread_cleanup_push(&__rt_cond_cleanup, &c);
+
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
 
 #ifdef CONFIG_XENO_FASTSYNCH
-   saved_lockcnt = mutex->lockcnt;
+   c.saved_lockcnt = mutex->lockcnt;
 
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
NULL, XN_REALTIME, &timeout);
 
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cleanup_pop(0);
+
while (err == -EINTR)
err = XENOMAI_SKINCALL2(__native_muxid,
__native_cond_wait_epilogue, mutex,
-   saved_lockcnt);
+   c.saved_lockcnt);
 
-   mutex->lockcnt = saved_lockcnt;
+   mutex->lockcnt = c.saved_lockcnt;
 
 #else /* !CONFIG_XENO_FASTSYNCH */
err = XENOMAI_SKINCALL5(__native_muxid,
__native_cond_wait_prologue, cond, mutex,
-   &saved_lockcnt, XN_REALTIME, &timeout);
+   &c.saved_lockcnt, XN_REALTIME, &timeout);
+
+   pthread_setcanceltype(oldtype, NULL);
+
+   pthread_cle