This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
pthread_mutex_lock.c | 41 +++++++++++++---- pthread_mutex_setconsistency_np.c | 25 ++++++++++ pthread_mutex_setprioceiling.c | 33 +++++++++++++ pthread_mutex_setunlock_np.c | 30 ++++++++++++ pthread_mutex_timedlock.c | 33 +++++++++++-- pthread_mutex_trylock.c | 86 ++++++++++++++++++++++-------------- pthread_mutex_unlock.c | 63 +++++++++++++++++++++----- pthread_mutex_whose_owner_dead_np.c | 26 ++++++++++ pthread_mutexattr_getfast_np.c | 24 ++++++++++ pthread_mutexattr_getprioceiling.c | 27 +++++++++++ pthread_mutexattr_getprotocol.c | 36 +++++++++++++++ pthread_mutexattr_getrobust_np.c | 37 +++++++++++++++ pthread_mutexattr_gettype.c | 2 pthread_mutexattr_getunlock_np.c | 34 ++++++++++++++ pthread_mutexattr_init.c | 4 + pthread_mutexattr_setfast_np.c | 29 ++++++++++++ pthread_mutexattr_setprioceiling.c | 30 ++++++++++++ pthread_mutexattr_setprotocol.c | 42 +++++++++++++++++ pthread_mutexattr_setrobust_np.c | 43 ++++++++++++++++++ pthread_mutexattr_settype.c | 2 20 files changed, 585 insertions(+), 62 deletions(-) --- robustmutexes/rtnptl/src/nptl/pthread_mutex_lock.c:1.1.1.1.2.1 Fri Mar 26 02:41:35 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_lock.c Wed May 19 08:59:01 2004 @@ -2,6 +2,9 @@ This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + Redirect lowlevellock to use Fast User SYNchronization(fusyn). + Boris Hu <boris.hu@intel.com>, 2003. + The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -24,8 +27,19 @@ #ifndef LLL_MUTEX_LOCK -# define LLL_MUTEX_LOCK(mutex) lll_mutex_lock (mutex) -# define LLL_MUTEX_TRYLOCK(mutex) lll_mutex_trylock (mutex) +# ifdef USE_FUSYN_ROBUST_MUTEX +# define LLL_MUTEX_LOCK(mutex, tid) \ + do { \ + result = lll_rtmutex_lock (mutex,tid); \ + if (__builtin_expect (0 != result, 0)) \ + goto out_err; \ + } while (0) +# define LLL_MUTEX_TRYLOCK(mutex, tid) \ + lll_rtmutex_trylock(mutex, tid) +# else +# define LLL_MUTEX_LOCK(mutex, tid) lll_mutex_lock(mutex) +# define LLL_MUTEX_TRYLOCK(mutex, tid) lll_mutex_trylock (mutex) +# endif #endif @@ -36,8 +50,9 @@ assert (sizeof (mutex->__size) >= sizeof (mutex->__data)); pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - - switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) + int result = 0; + switch (__builtin_expect (mutex->__data.__kind & ~NON_MUTEX_KIND_MASK, + PTHREAD_MUTEX_TIMED_NP)) { /* Recursive mutex. */ case PTHREAD_MUTEX_RECURSIVE_NP: @@ -55,7 +70,7 @@ } /* We have to get the mutex. */ - LLL_MUTEX_LOCK (mutex->__data.__lock); + LLL_MUTEX_LOCK (mutex->__data.__lock, id); mutex->__data.__count = 1; break; @@ -73,14 +88,14 @@ case PTHREAD_MUTEX_TIMED_NP: simple: /* Normal mutex. */ - LLL_MUTEX_LOCK (mutex->__data.__lock); + LLL_MUTEX_LOCK (mutex->__data.__lock, id); break; case PTHREAD_MUTEX_ADAPTIVE_NP: if (! __is_smp) goto simple; - if (LLL_MUTEX_TRYLOCK (mutex->__data.__lock) != 0) + if (LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id) != 0) { int cnt = 0; int max_cnt = MIN (MAX_ADAPTIVE_COUNT, @@ -89,7 +104,7 @@ { if (cnt++ >= max_cnt) { - LLL_MUTEX_LOCK (mutex->__data.__lock); + LLL_MUTEX_LOCK (mutex->__data.__lock, id); break; } @@ -97,7 +112,7 @@ BUSY_WAIT_NOP; #endif } - while (LLL_MUTEX_TRYLOCK (mutex->__data.__lock) != 0); + while (LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id) != 0); mutex->__data.__spins += (cnt - mutex->__data.__spins) / 8; } @@ -112,6 +127,14 @@ #endif return 0; + + out_err: + /* owner dead or not recoverable */ + if (__builtin_expect (EOWNERDEAD == result || ENOTRECOVERABLE == result, 0)) + if (! is_mutex_robust (mutex)) /* non-robust mutex */ + pthread_mutex_whose_owner_dead_np (mutex, (void *)-1); + + return result; } #ifndef __pthread_mutex_lock strong_alias (__pthread_mutex_lock, pthread_mutex_lock) --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_setconsistency_np.c Mon Jun 7 05:21:33 2004 @@ -0,0 +1,25 @@ +/* + * (C) 2002-2003 Intel Corporation + * Bing Wei Liu <bing.wei.liu@intel.com>. + * + * Reimplement to sync with fusyn and POSIX spec. + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + +#include <errno.h> +#include "pthreadP.h" + +int +pthread_mutex_setconsistency_np(mutex, state) + pthread_mutex_t *mutex; + int state; +{ + int result = 0; + + if (state < 0 || state > PTHREAD_MUTEX_ROBUST_INIT_NP) + return EINVAL; + + result = lll_rtmutex_set_consistency (mutex->__data.__lock, state); + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_setprioceiling.c Tue Apr 13 11:37:02 2004 @@ -0,0 +1,33 @@ +/* + * (C) 2003 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> +#include <errno.h> + +int +pthread_mutex_setprioceiling (pthread_mutex_t *__mutex, + int __prioceiling, int *__old_ceiling) +{ + + if (__prioceiling < MIN_USER_RT_PRIO || __prioceiling > MAX_USER_RT_PRIO) + return EINVAL; + + /* Use Bit PRIOCEILING_OFFSET - PRIOCEILING_OFFSET + 6 to + * indicate the priority ceiling value. + * -- MIN_USER_RT_PRIO ~~ MAX_USER_RT_PRIO + */ + int res = pthread_mutex_lock (__mutex); + if (__builtin_expect (res != 0, 0)) + return res; + + *__old_ceiling = __mutex->__data.__kind & PRIOCEILING_MASK; + __mutex->__data.__kind &= ~PRIOCEILING_MASK; + __mutex->__data.__kind |= __prioceiling << PRIOCEILING_OFFSET; + pthread_mutex_unlock(__mutex); + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_setunlock_np.c Tue May 25 05:16:58 2004 @@ -0,0 +1,30 @@ +/* + * (C) 2004 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <errno.h> +#include <pthreadP.h> + + +int pthread_mutex_setunlock_np (pthread_mutex_t *mutex, + int fast_mode) +{ + switch (fast_mode) { + case PTHREAD_MUTEX_UNLOCK_SERIAL_NP: + mutex->__data.__kind |= (FULOCK_UNLOCK_SERIAL << FULOCK_UNLOCK_TYPE_OFFSET); + break; + case PTHREAD_MUTEX_UNLOCK_PARALLEL_NP: + mutex->__data.__kind |= (FULOCK_UNLOCK_PARALLEL << FULOCK_UNLOCK_TYPE_OFFSET); + break; + case PTHREAD_MUTEX_UNLOCK_AUTO_NP: + mutex->__data.__kind |= (FULOCK_UNLOCK_AUTO << FULOCK_UNLOCK_TYPE_OFFSET); + break; + default: + return EINVAL; + } + + return 0; +} --- robustmutexes/rtnptl/src/nptl/pthread_mutex_timedlock.c:1.1.1.1.2.1 Fri Mar 26 02:41:35 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_timedlock.c Wed May 19 08:59:01 2004 @@ -2,6 +2,9 @@ This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + Redirect lowlevellock to use Fast User SYNchronization(fusyn). + Boris Hu <boris.hu@intel.com>, 2003 + The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -21,6 +24,19 @@ #include "pthreadP.h" #include <lowlevellock.h> +#ifndef LLL_MUTEX_TIMEDLOCK +# ifdef USE_FUSYN_ROBUST_MUTEX +# define LLL_MUTEX_TIMEDLOCK(mutex, tid, abstime) \ + lll_rtmutex_timedlock (mutex, tid, abstime) +# define LLL_MUTEX_TRYLOCK(mutex, tid) \ + lll_rtmutex_trylock(mutex, tid) +# else +# define LLL_MUTEX_TIMEDLOCK(mutex, tid, abstime) \ + lll_mutex_timedlock (mutex, abstime) +# define LLL_MUTEX_TRYLOCK(mutex, tid) \ + lll_mutex_trylock(mutex) +# endif +#endif int pthread_mutex_timedlock (mutex, abstime) @@ -33,7 +49,7 @@ /* We must not check ABSTIME here. If the thread does not block abstime must not be checked for a valid value. */ - switch (mutex->__data.__kind) + switch (mutex->__data.__kind & ~NON_MUTEX_KIND_MASK) { /* Recursive mutex. */ case PTHREAD_MUTEX_RECURSIVE_NP: @@ -52,7 +68,7 @@ else { /* We have to get the mutex. */ - result = lll_mutex_timedlock (mutex->__data.__lock, abstime); + result = LLL_MUTEX_TIMEDLOCK (mutex->__data.__lock, id, abstime); if (result != 0) goto out; @@ -75,14 +91,14 @@ case PTHREAD_MUTEX_TIMED_NP: simple: /* Normal mutex. */ - result = lll_mutex_timedlock (mutex->__data.__lock, abstime); + result = LLL_MUTEX_TIMEDLOCK (mutex->__data.__lock, id, abstime); break; case PTHREAD_MUTEX_ADAPTIVE_NP: if (! __is_smp) goto simple; - if (lll_mutex_trylock (mutex->__data.__lock) != 0) + if (LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id) != 0) { int cnt = 0; int max_cnt = MIN (MAX_ADAPTIVE_COUNT, @@ -91,7 +107,7 @@ { if (cnt++ >= max_cnt) { - result = lll_mutex_timedlock (mutex->__data.__lock, abstime); + result = LLL_MUTEX_TIMEDLOCK (mutex->__data.__lock, id, abstime); break; } @@ -99,7 +115,7 @@ BUSY_WAIT_NOP; #endif } - while (lll_mutex_trylock (mutex->__data.__lock) != 0); + while (LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id) != 0); mutex->__data.__spins += (cnt - mutex->__data.__spins) / 8; } @@ -114,5 +130,10 @@ } out: + /* owner dead or not recoverable */ + if (__builtin_expect(EOWNERDEAD == result || ENOTRECOVERABLE == result, 0)) + if ( !is_mutex_robust (mutex)) /* non-robust mutex */ + result = pthread_mutex_whose_owner_dead_np (mutex, abstime); + return result; } --- robustmutexes/rtnptl/src/nptl/pthread_mutex_trylock.c:1.1.1.1 Thu Oct 9 06:54:44 2003 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_trylock.c Wed May 19 08:59:01 2004 @@ -1,6 +1,9 @@ /* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + Redirect lowlevellock to use Fast User SYNchronization(fusyn). + Boris Hu <boris.hu@intel.com>, 2003 The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,57 +24,76 @@ #include "pthreadP.h" #include <lowlevellock.h> +#ifndef LLL_MUTEX_TRYLOCK +# ifdef USE_FUSYN_ROBUST_MUTEX +# define LLL_MUTEX_TRYLOCK(mutex, tid) \ + lll_rtmutex_trylock (mutex, tid) +# else +# define LLL_MUTEX_TRYLOCK(mutex, tid) \ + ({ int ret = lll_mutex_trylock (mutex); \ + ret = 0 != ret ? EBUSY : 0; \ + ret; }) +# endif +#endif int __pthread_mutex_trylock (mutex) pthread_mutex_t *mutex; { - pid_t id; + pid_t id = THREAD_GETMEM (THREAD_SELF, tid); + int result; - switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) + switch (__builtin_expect (mutex->__data.__kind & ~NON_MUTEX_KIND_MASK, + PTHREAD_MUTEX_TIMED_NP)) { /* Recursive mutex. */ case PTHREAD_MUTEX_RECURSIVE_NP: - id = THREAD_GETMEM (THREAD_SELF, tid); /* Check whether we already hold the mutex. */ if (mutex->__data.__owner == id) - { - /* Just bump the counter. */ - if (__builtin_expect (mutex->__data.__count + 1 == 0, 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - return 0; - } - - if (lll_mutex_trylock (mutex->__data.__lock) == 0) - { - /* Record the ownership. */ - mutex->__data.__owner = id; - mutex->__data.__count = 1; - ++mutex->__data.__nusers; - return 0; - } - break; + { + /* Just bump the counter. */ + if (__builtin_expect (mutex->__data.__count + 1 == 0, 0)) + /* Overflow of the counter. */ + return EAGAIN; + + ++mutex->__data.__count; + return 0; + } + result = LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id); + if (__builtin_expect (0 != result, 0)) + goto out_err; + + /* Record the ownership. */ + mutex->__data.__owner = id; + mutex->__data.__count = 1; + ++mutex->__data.__nusers; + break; + case PTHREAD_MUTEX_ERRORCHECK_NP: /* Error checking mutex. We do not check for deadlocks. */ default: - /* Correct code cannot set any other type. */ + /* Correct code cannot set any other type. */ case PTHREAD_MUTEX_TIMED_NP: case PTHREAD_MUTEX_ADAPTIVE_NP: /* Normal mutex. */ - if (lll_mutex_trylock (mutex->__data.__lock) == 0) - { - /* Record the ownership. */ - mutex->__data.__owner = THREAD_GETMEM (THREAD_SELF, tid); - ++mutex->__data.__nusers; - - return 0; - } + result = LLL_MUTEX_TRYLOCK (mutex->__data.__lock, id); + if (__builtin_expect (0 != result, 0)) + goto out_err; + + /* Record the ownership. */ + mutex->__data.__owner = id; + ++mutex->__data.__nusers; } + + return 0; + +out_err: + /* owner dead or not recoverable */ + if (__builtin_expect (EOWNERDEAD == result || ENOTRECOVERABLE == result, 0)) + if (! is_mutex_robust(mutex)) /* non-robust mutex */ + pthread_mutex_whose_owner_dead_np (mutex, (void *)-1); - return EBUSY; + return result; } strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock) --- robustmutexes/rtnptl/src/nptl/pthread_mutex_unlock.c:1.1.1.1 Thu Oct 9 06:54:44 2003 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_unlock.c Sat Apr 17 11:54:02 2004 @@ -2,6 +2,9 @@ This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + Redirect lowlevellock to use Fast User SYNchronization(fusyn). + Boris Hu <boris.hu@intel.com>, 2003 + The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -21,6 +24,17 @@ #include "pthreadP.h" #include <lowlevellock.h> +#ifndef LLL_MUTEX_UNLOCK +# ifdef USE_FUSYN_ROBUST_MUTEX +# define LLL_MUTEX_UNLOCK(mutex, tid) \ + do { \ + result = lll_rtmutex_unlock(mutex,tid); \ + } while (0) +# else +# define LLL_MUTEX_UNLOCK(mutex, tid) lll_mutex_unlock(mutex) +# endif +#endif + int internal_function attribute_hidden @@ -28,23 +42,27 @@ pthread_mutex_t *mutex; int decr; { - switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) + pid_t id = THREAD_GETMEM (THREAD_SELF, tid); + int result = 0; + + switch (__builtin_expect (mutex->__data.__kind & ~NON_MUTEX_KIND_MASK, + PTHREAD_MUTEX_TIMED_NP)) { case PTHREAD_MUTEX_RECURSIVE_NP: /* Recursive mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; + if (mutex->__data.__owner != id) + return EPERM; if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; + /* We still hold the mutex. */ + return 0; break; case PTHREAD_MUTEX_ERRORCHECK_NP: /* Error checking mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid) - || ! lll_mutex_islocked (mutex->__data.__lock)) - return EPERM; + if (mutex->__data.__owner != id + || ! lll_mutex_islocked (mutex->__data.__lock)) + return EPERM; break; default: @@ -55,16 +73,37 @@ break; } - /* Always reset the owner field. */ mutex->__data.__owner = 0; + if (decr) /* One less user. */ --mutex->__data.__nusers; - /* Unlock. */ - lll_mutex_unlock (mutex->__data.__lock); + if (__builtin_expect (mutex->__data.__kind & (FULOCK_FL_RM_SUN >> 1), 0)) + goto solaris_compat_mode; - return 0; + /* Always reset the owner field. */ + LLL_MUTEX_UNLOCK (mutex->__data.__lock, id); + + return result; + +solaris_compat_mode: + { + int owner_tid = mutex->__data.__lock; + if (__builtin_expect (owner_tid == VFULOCK_DEAD, 0)) + { + if ((result = lll_rtmutex_set_consistency ( \ + mutex->__data.__lock, + PTHREAD_MUTEX_ROBUST_CONSISTENT_NP)) != 0) + return result; + result = lll_rtmutex_unlock_nocheck (mutex->__data.__lock); + } + else + { + LLL_MUTEX_UNLOCK (mutex->__data.__lock, id); + } + } + return result; } --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutex_whose_owner_dead_np.c Wed May 19 08:59:01 2004 @@ -0,0 +1,26 @@ +/* + * (C) 2003 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> +#include <errno.h> +#include <time.h> + +int +pthread_mutex_whose_owner_dead_np (pthread_mutex_t *__mutex, + const struct timespec *__reltime) +{ + /* Hang to tell the position when the owner of the lock is dead + * for non-RM lock. */ + if ((void *)-1 == __reltime) + while (1) ; + else + nanosleep(__reltime, NULL); + + return ETIMEDOUT; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_getfast_np.c Tue May 11 12:01:35 2004 @@ -0,0 +1,24 @@ +/* + * (C) 2004 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> + + +int +pthread_mutexattr_getfast_np (const pthread_mutexattr_t *attr, + int *fast_mode) +{ + const struct pthread_mutexattr *iattr; + + iattr = (const struct pthread_mutexattr *) attr; + + *fast_mode = iattr->mutexkind & FULOCK_FASTPATH_MODE + ? PTHREAD_MUTEX_FASTPATH_NP + : PTHREAD_MUTEX_SLOWPATH_NP; + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_getprioceiling.c Mon Jun 7 05:21:33 2004 @@ -0,0 +1,27 @@ +/* + * (C) 2003 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> + + +int +pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *__attr, + int *__prioceiling) +{ + const struct pthread_mutexattr *iattr; + + iattr = (const struct pthread_mutexattr *) __attr; + + /* Use Bit PRIOCEILING_OFFSET - PRIOCEILING_OFFSET + 6 to + * indicate the priority ceiling value. + * -- MIN_USER_RT_PRIO ~~ MAX_USER_RT_PRIO + */ + *__prioceiling = (iattr->mutexkind & PRIOCEILING_MASK) + >> PRIOCEILING_OFFSET; + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_getprotocol.c Tue Mar 30 09:20:22 2004 @@ -0,0 +1,36 @@ +/* + * (C) 2002-2003 Intel Corporation + * Bing Wei Liu <bing.wei.liu@intel.com>. + * + * Reimplement to sync with fusyn and POSIX spec. + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> + + +int +pthread_mutexattr_getprotocol (attr, protocol) + const pthread_mutexattr_t *attr; + int *protocol; +{ + const struct pthread_mutexattr *iattr; + int rtflags; + + iattr = (const struct pthread_mutexattr *) attr; + + /* Use Bit 30, 29 to indicate the protocol of mutex : + -- PTHREAD_PRIO_NONE (00) + -- PTHREAD_PRIO_INHERIT (10) + -- PTHREAD_PRIO_PROTECT (01) */ + + rtflags = iattr->mutexkind << 1; + + *protocol = rtflags & FULOCK_FL_PI ? PTHREAD_PRIO_INHERIT + : rtflags & FULOCK_FL_PP ? PTHREAD_PRIO_PROTECT + : PTHREAD_PRIO_NONE; + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_getrobust_np.c Tue Mar 30 09:20:22 2004 @@ -0,0 +1,37 @@ +/* + * (C) 2002-2003 Intel Corporation + * Bing Wei Liu <bing.wei.liu@intel.com>. + * + * Reimplement to sync with fusyn and POSIX spec. + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> + + +int +pthread_mutexattr_getrobust_np (attr, robustness) + const pthread_mutexattr_t *attr; + int *robustness; +{ + const struct pthread_mutexattr *iattr; + int rtflags; + + iattr = (const struct pthread_mutexattr *) attr; + + /* Use Bit 28, 27 to indicate the robustness type of mutex : + * -- PTHREAD_MUTEX_NOROBUST_NP (00) + * -- PTHREAD_MUTEX_ROBUST_NP (01) + * -- PTHREAD_MUTEX_ROBUST2_NP (10) + */ + + rtflags = iattr->mutexkind << 1; + + *robustness = rtflags & FULOCK_FL_RM ? PTHREAD_MUTEX_ROBUST_NP + : rtflags & FULOCK_FL_RM_SUN ? PTHREAD_MUTEX_ROBUST2_NP + : PTHREAD_MUTEX_NOROBUST_NP; + + return 0; +} --- robustmutexes/rtnptl/src/nptl/pthread_mutexattr_gettype.c:1.1.1.1.2.1 Sat Jun 12 14:22:11 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_gettype.c Sat Jun 12 15:19:47 2004 @@ -31,7 +31,7 @@ /* We use bit 31 to signal whether the mutex is going to be process-shared or not. */ - *kind = iattr->mutexkind & ~0x80000000; + *kind = iattr->mutexkind & ~NON_MUTEX_KIND_MASK; return 0; } --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_getunlock_np.c Tue May 25 05:16:58 2004 @@ -0,0 +1,34 @@ +/* + * (C) 2004 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> +#include <errno.h> + +int +pthread_mutexattr_getunlock_np (const pthread_mutexattr_t *attr, + int *serial_mode) +{ + const struct pthread_mutexattr *iattr; + + iattr = (const struct pthread_mutexattr *) attr; + + switch ((iattr->mutexkind & FULOCK_UNLOCK_TYPE_MASK) + >> FULOCK_UNLOCK_TYPE_OFFSET) { + case FULOCK_UNLOCK_SERIAL: + *serial_mode = PTHREAD_MUTEX_UNLOCK_SERIAL_NP; + break; + case FULOCK_UNLOCK_PARALLEL: + *serial_mode = PTHREAD_MUTEX_UNLOCK_PARALLEL_NP; + break; + case FULOCK_UNLOCK_AUTO: + *serial_mode = PTHREAD_MUTEX_UNLOCK_AUTO_NP; + break; + default: + return EINVAL; + } + return 0; +} --- robustmutexes/rtnptl/src/nptl/pthread_mutexattr_init.c:1.1.1.1.2.1 Sat Jun 12 14:22:11 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_init.c Sat Jun 12 15:19:47 2004 @@ -31,7 +31,9 @@ /* We use bit 31 to signal whether the mutex is going to be process-shared or not. By default it is zero, i.e., the mutex is not process-shared. */ - ((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL; + ((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL + | (MIN_USER_RT_PRIO << PRIOCEILING_OFFSET) + | (FULOCK_UNLOCK_AUTO << FULOCK_UNLOCK_TYPE_OFFSET); return 0; } --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_setfast_np.c Tue May 11 12:01:35 2004 @@ -0,0 +1,29 @@ +/* + * (C) 2004 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <errno.h> +#include <pthreadP.h> + + +int pthread_mutexattr_setfast_np (pthread_mutexattr_t *attr, + int fast_mode) +{ + struct pthread_mutexattr *iattr; + + if (fast_mode != PTHREAD_MUTEX_FASTPATH_NP + && fast_mode != PTHREAD_MUTEX_SLOWPATH_NP) + return EINVAL; + + iattr = (struct pthread_mutexattr *) attr; + + if (fast_mode == PTHREAD_MUTEX_FASTPATH_NP) + iattr->mutexkind |= FULOCK_FASTPATH_MODE; + else + iattr->mutexkind &= ~FULOCK_FASTPATH_MODE; + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_setprioceiling.c Wed May 19 08:59:01 2004 @@ -0,0 +1,30 @@ +/* + * (C) 2003 Intel Corporation + * Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <pthreadP.h> +#include <errno.h> + +int +pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr, + int __prioceiling) +{ + struct pthread_mutexattr *iattr; + + if (__prioceiling < MIN_USER_RT_PRIO || __prioceiling > MAX_USER_RT_PRIO) + return EINVAL; + + iattr = (struct pthread_mutexattr *) __attr; + + /* Use Bit PRIOCEILING_OFFSET - PRIOCEILING_OFFSET + 6 to indicate + * the priority ceiling value. + * -- MIN_USER_RT_PRIO ~~ MAX_USER_RT_PRIO + */ + iattr->mutexkind &= ~PRIOCEILING_MASK; + iattr->mutexkind |= (__prioceiling << PRIOCEILING_OFFSET); + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_setprotocol.c Fri May 21 06:17:50 2004 @@ -0,0 +1,42 @@ +/* + * (C) 2002-2003 Intel Corporation + * Bing Wei Liu <bing.wei.liu@intel.com>. + * + * Reimplement to sync with fusyn and POSIX spec. + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <errno.h> +#include <pthreadP.h> + + +int +pthread_mutexattr_setprotocol (attr, protocol) + pthread_mutexattr_t *attr; + int protocol; +{ + struct pthread_mutexattr *iattr; + int rtflags = 0; + + if (protocol < PTHREAD_PRIO_NONE || protocol > PTHREAD_PRIO_PROTECT) + return EINVAL; + + iattr = (struct pthread_mutexattr *) attr; + + /* Use Bit 30, 29 to indicate the protocol of mutex : + -- PTHREAD_PRIO_NONE (00) + -- PTHREAD_PRIO_INHERIT (10) + -- PTHREAD_PRIO_PROTECT (01) */ + + if (protocol == PTHREAD_PRIO_INHERIT) + rtflags |= FULOCK_FL_PI | FULOCK_FL_RM; + else if (protocol == PTHREAD_PRIO_PROTECT) + rtflags |= FULOCK_FL_PP | FULOCK_FL_RM; + + iattr->mutexkind &= ~((FULOCK_FL_PI | FULOCK_FL_PP) >> 1); + iattr->mutexkind |= rtflags >> 1; + + return 0; +} --- /dev/null Fri Jul 23 03:18:16 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_setrobust_np.c Fri May 21 06:17:50 2004 @@ -0,0 +1,43 @@ +/* + * (C) 2002-2003 Intel Corporation + * Bing Wei Liu <bing.wei.liu@intel.com>. + * + * Reimplement to sync with fusyn and POSIX spec. + * (C) 2003 Intel Corporation Boris Hu <boris.hu@intel.com> + * + * Distributed under the FSF's LGPL license, v2 or later. */ + + +#include <errno.h> +#include <pthreadP.h> + + +int +pthread_mutexattr_setrobust_np (attr, robustness) + pthread_mutexattr_t *attr; + int robustness; +{ + struct pthread_mutexattr *iattr; + unsigned int rtflags = 0; + + if (robustness < PTHREAD_MUTEX_NOROBUST_NP || robustness > PTHREAD_MUTEX_ROBUST2_NP) + return EINVAL; + + iattr = (struct pthread_mutexattr *) attr; + + /* Use Bit 28, 27 to indicate the robustness type of mutex : + * -- PTHREAD_MUTEX_NOROBUST_NP (00) + * -- PTHREAD_MUTEX_ROBUST_NP (01) + * -- PTHREAD_MUTEX_ROBUST2_NP (10) + */ + + if (robustness == PTHREAD_MUTEX_ROBUST_NP) + rtflags |= FULOCK_FL_RM; + else if (robustness == PTHREAD_MUTEX_ROBUST2_NP) + rtflags |= FULOCK_FL_RM_SUN; + + iattr->mutexkind &= ~((FULOCK_FL_RM | FULOCK_FL_RM_SUN) >> 1); + iattr->mutexkind |= (rtflags >> 1); + + return 0; +} --- robustmutexes/rtnptl/src/nptl/pthread_mutexattr_settype.c:1.1.1.1.2.1 Sat Jun 12 14:22:11 2004 +++ robustmutexes/rtnptl/src/nptl/pthread_mutexattr_settype.c Sat Jun 12 15:19:47 2004 @@ -35,7 +35,7 @@ /* We use bit 31 to signal whether the mutex is going to be process-shared or not. */ - iattr->mutexkind = (iattr->mutexkind & 0x80000000) | kind; + iattr->mutexkind = (iattr->mutexkind & NON_MUTEX_KIND_MASK) | kind; return 0; } Boris Hu (Hu Jiangtao) Intel China Software Center 86-021-5257-4545#1277 iNET: 8-752-1277 ************************************ There are my thoughts, not my employer's. ************************************ "gpg --recv-keys --keyserver wwwkeys.pgp.net 0FD7685F" {0FD7685F:CFD6 6F5C A2CB 7881 725B CEA0 956F 9F14 0FD7 685F}
Attachment:
rtnptl-2.3.patch-2
Description: rtnptl-2.3.patch-2
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |