[Xenomai-git] Gilles Chanteperdrix : native: add cancellation points
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
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
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