[PATCH] Disable thread cancellation support for RTEMS
Joel Sherrill
joel.sherrill@oarcorp.com
Tue Mar 26 16:08:00 GMT 2013
I just commit this to the newlib head.
Thanks Sebastian and Corinna.
--joel
RTEMS
On 3/22/2013 9:47 AM, Sebastian Huber wrote:
> newlib/ChangeLog
> 2013-03-22 Sebastian Huber<sebastian.huber@embedded-brains.de>
>
> * libc/stdio/local.h (_STDIO_WITH_THREAD_CANCELLATION_SUPPORT):
> New define.
> * libc/stdio/fclose.c: Use
> _STDIO_WITH_THREAD_CANCELLATION_SUPPORT.
> * libc/stdio/freopen.c: Likewise.
> * libc/stdio64/freopen64.c: Likewise.
> ---
> newlib/libc/stdio/fclose.c | 6 +++---
> newlib/libc/stdio/freopen.c | 8 ++++----
> newlib/libc/stdio/local.h | 11 ++++++++---
> newlib/libc/stdio64/freopen64.c | 4 ++--
> 4 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/newlib/libc/stdio/fclose.c b/newlib/libc/stdio/fclose.c
> index 7904964..fd054fe 100644
> --- a/newlib/libc/stdio/fclose.c
> +++ b/newlib/libc/stdio/fclose.c
> @@ -78,7 +78,7 @@ _DEFUN(_fclose_r, (rptr, fp),
>
> /* We can't use the _newlib_flockfile_XXX macros here due to the
> interlocked locking with the sfp_lock. */
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> int __oldcancel;
> pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel);
> #endif
> @@ -87,7 +87,7 @@ _DEFUN(_fclose_r, (rptr, fp),
> if (fp->_flags == 0) /* not open! */
> {
> _funlockfile (fp);
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
> return (0);
> @@ -112,7 +112,7 @@ _DEFUN(_fclose_r, (rptr, fp),
> #endif
>
> __sfp_lock_release ();
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
>
> diff --git a/newlib/libc/stdio/freopen.c b/newlib/libc/stdio/freopen.c
> index b33eb1e..884e561 100644
> --- a/newlib/libc/stdio/freopen.c
> +++ b/newlib/libc/stdio/freopen.c
> @@ -102,7 +102,7 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp),
>
> /* We can't use the _newlib_flockfile_XXX macros here due to the
> interlocked locking with the sfp_lock. */
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> int __oldcancel;
> pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel);
> #endif
> @@ -111,7 +111,7 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp),
> if ((flags = __sflags (ptr, mode, &oflags)) == 0)
> {
> _funlockfile (fp);
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
> _fclose_r (ptr, fp);
> @@ -222,7 +222,7 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp),
> __lock_close_recursive (fp->_lock);
> #endif
> __sfp_lock_release ();
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
> return NULL;
> @@ -242,7 +242,7 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp),
> #endif
>
> _funlockfile (fp);
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
> return fp;
> diff --git a/newlib/libc/stdio/local.h b/newlib/libc/stdio/local.h
> index b4bc5e0..58a16bd 100644
> --- a/newlib/libc/stdio/local.h
> +++ b/newlib/libc/stdio/local.h
> @@ -45,7 +45,12 @@
> section before reaching the end of the critical section's code end, use
> the appropriate _newlib_XXX_exit macro. */
>
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS) \
> + && !defined (__rtems__)
> +#define _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> +#endif
> +
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> #include <pthread.h>
>
> /* Start a stream oriented critical section: */
> @@ -84,7 +89,7 @@
> pthread_setcancelstate (__oldsfpcancel, &__oldsfpcancel); \
> }
>
> -#else /* __SINGLE_THREAD__ || !_POSIX_THREADS */
> +#else /* !_STDIO_WITH_THREAD_CANCELLATION_SUPPORT */
>
> # define _newlib_flockfile_start(_fp) \
> { \
> @@ -108,7 +113,7 @@
> __sfp_lock_release (); \
> }
>
> -#endif /* !__SINGLE_THREAD__ && _POSIX_THREADS */
> +#endif /* _STDIO_WITH_THREAD_CANCELLATION_SUPPORT */
>
> extern u_char *_EXFUN(__sccl, (char *, u_char *fmt));
> extern int _EXFUN(__svfscanf_r,(struct _reent *,FILE *, _CONST char *,va_list));
> diff --git a/newlib/libc/stdio64/freopen64.c b/newlib/libc/stdio64/freopen64.c
> index db0e1ee..dfe36ea 100644
> --- a/newlib/libc/stdio64/freopen64.c
> +++ b/newlib/libc/stdio64/freopen64.c
> @@ -102,7 +102,7 @@ _DEFUN (_freopen64_r, (ptr, file, mode, fp),
>
> /* We can't use the _newlib_flockfile_XXX macros here due to the
> interlocked locking with the sfp_lock. */
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> int __oldcancel;
> pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel);
> #endif
> @@ -111,7 +111,7 @@ _DEFUN (_freopen64_r, (ptr, file, mode, fp),
> if ((flags = __sflags (ptr, mode, &oflags)) == 0)
> {
> _funlockfile (fp);
> -#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS)
> +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT
> pthread_setcancelstate (__oldcancel, &__oldcancel);
> #endif
> _fclose_r (ptr, fp);
> -- 1.7.7
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the Newlib
mailing list