diff options
author | neal <neal> | 2008-06-22 09:16:43 +0000 |
---|---|---|
committer | neal <neal> | 2008-06-22 09:16:43 +0000 |
commit | 61edfb886d649a07416a89b4294be738cdb4d061 (patch) | |
tree | ed30937d24cd854a8cecf8121e9ae9d94ce60690 /hurd | |
parent | 25f5fdaa9e28b4e768bc5c28435b3275bb60d886 (diff) |
viengoos/
2008-06-22 Neal H. Walfield <neal@gnu.org>
* thread.h: Include "list.h".
(struct thread) [! NDEBUG]: Add field futex_waiter_node.
[! NDEBUG]: Instantiate the futex_waiter list class.
(futex_waiters) [! NDEBUG]: Declare.
* server.c (futex_waiters) [! NDEBUG]: New variable.
(server_loop) [! NDEBUG]: If we don't get an RPC for a while,
dequeue all thread's enqueued on FUTEX_WAITERS and return EDEADLK.
When blocking a thread on a futex, add THREAD to FUTEX_WAITERS.
* object.c (object_wait_queue_dequeue) [! NDEBUG]: If
THREAD->WAIT_REASON is THREAD_WAIT_FUTEX, unlink THREAD from
FUTEX_WAITERS.
hurd/
2008-06-22 Neal H. Walfield <neal@gnu.org>
* futex.h [! RM_INTERN]: Include <errno.h>.
(futex_wait): On error, set ERRNO and return -1.
(futex_timed_wait): Likewise.
(futex_wake): Likewise.
* mutex.h (ss_mutex_lock): If FUTEX_WAIT returns failure, print
some debugging information.
Diffstat (limited to 'hurd')
-rw-r--r-- | hurd/ChangeLog | 9 | ||||
-rw-r--r-- | hurd/futex.h | 17 | ||||
-rw-r--r-- | hurd/mutex.h | 12 |
3 files changed, 34 insertions, 4 deletions
diff --git a/hurd/ChangeLog b/hurd/ChangeLog index e09ea21..4ff7d2d 100644 --- a/hurd/ChangeLog +++ b/hurd/ChangeLog @@ -1,5 +1,14 @@ 2008-06-22 Neal H. Walfield <neal@gnu.org> + * futex.h [! RM_INTERN]: Include <errno.h>. + (futex_wait): On error, set ERRNO and return -1. + (futex_timed_wait): Likewise. + (futex_wake): Likewise. + * mutex.h (ss_mutex_lock): If FUTEX_WAIT returns failure, print + some debugging information. + +2008-06-22 Neal H. Walfield <neal@gnu.org> + * lock.h (SS_MUTEX_LOCK, SS_MUTEX_LOCK_WAIT, SS_MUTEX_UNLOCK, SS_MUTEX_TRYLOCK, SS_MUTEX_TRYLOCK_BLOCKED, SS_RMUTEX_LOCK, SS_RMUTEX_LOCK_INC, SS_RMUTEX_LOCK_WAIT, SS_RMUTEX_UNLOCK, diff --git a/hurd/futex.h b/hurd/futex.h index 5910212..8c4507c 100644 --- a/hurd/futex.h +++ b/hurd/futex.h @@ -116,6 +116,8 @@ RPC (futex, 8, 1, #undef RPC_TARGET #ifndef RM_INTERN +#include <errno.h> + struct futex_return { error_t err; @@ -149,7 +151,10 @@ futex_wait (int *f, int val) struct futex_return ret; ret = futex (f, FUTEX_WAIT, val, NULL, 0, 0); if (ret.err) - return 0; + { + errno = ret.err; + return -1; + } return ret.ret; } @@ -160,7 +165,10 @@ futex_timed_wait (int *f, int val, struct timespec *timespec) struct futex_return ret; ret = futex (f, FUTEX_WAIT, val, timespec, 0, 0); if (ret.err) - return 0; + { + errno = ret.err; + return -1; + } return ret.ret; } @@ -171,7 +179,10 @@ futex_wake (int *f, int nwake) struct futex_return ret; ret = futex (f, FUTEX_WAKE, nwake, NULL, 0, 0); if (ret.err) - return 0; + { + errno = ret.err; + return -1; + } return ret.ret; } #endif /* !RM_INTERN */ diff --git a/hurd/mutex.h b/hurd/mutex.h index 3f50934..f1aee64 100644 --- a/hurd/mutex.h +++ b/hurd/mutex.h @@ -68,7 +68,17 @@ ss_mutex_lock (__const char *caller, int line, ss_mutex_t *lockp) /* Try to sleep but only if LOCKP is _MUTEX_WAITERS. */ while (c != _MUTEX_UNLOCKED) { - futex_wait (lockp, _MUTEX_WAITERS); + if (futex_wait (lockp, _MUTEX_WAITERS) == -1) + { + debug (0, "Possible deadlock: %p!", lockp); + extern int backtrace (void **array, int size); + void *a[20]; + int c = backtrace (a, sizeof (a) / sizeof (a[0])); + int i; + for (i = 0; i < c; i ++) + debug (0, "%p", a[i]); + ss_lock_trace_dump (lockp); + } c = atomic_exchange_acq (lockp, _MUTEX_WAITERS); } } |