On Sun, Jul 29, 2007, Jeff Johnson wrote:
> Not setting the return code from pthread_mutexattr_setrobust_np()
> is likely the fix for interoperability with glibc/kernel that does not
> support robust mutexes but does define EOWNERDEAD:
>
> +#if defined(EOWNERDEAD)
> RET_SET((pthread_mutexattr_init(&mutexattr)), ret);
> + if (ret == 0) {
> + RET_SET((pthread_mutexattr_setrobust_np(
> + &mutexattr, PTHREAD_MUTEX_ROBUST_NP)), ret);
> + }
> +#endif
>
> The other two returns should never return EOWNERDEAD if robust
> mutexes are not supported:
>
> @@ -196,6 +202,12 @@
> #endif
>
> RET_SET((pthread_mutex_lock(&mutexp->mutex)), ret);
> +#if defined(EOWNERDEAD)
> + if (ret == EOWNERDEAD) {
> + RET_SET((pthread_mutex_consistent_np(&mutexp->mutex)), ret);
> + ret = 0;
> + }
> +#endif
> if (ret != 0)
> goto err;
>
> @@ -306,6 +318,12 @@
> #endif
> if (F_ISSET(mutexp, DB_MUTEX_SELF_BLOCK)) {
> RET_SET((pthread_mutex_lock(&mutexp->mutex)), ret);
> +#if defined(EOWNERDEAD)
> + if (ret == EOWNERDEAD) {
> + RET_SET((pthread_mutex_consistent_np(&mutexp->mutex)), ret);
> + ret = 0;
> + }
> +#endif
> if (ret != 0)
> goto err;
Anyway, I suggest to at least use "#if defined(EOWNERDEAD) &&
defined(PTHREAD_MUTEX_ROBUST_NP)" in all 3 cases or we will suffer from
portability issues too easily...
Ralf S. Engelschall
rse@engelschall.com
www.engelschall.com
Received on Sun Jul 29 16:50:17 2007