summaryrefslogtreecommitdiff
path: root/hurd
diff options
context:
space:
mode:
authorneal <neal>2008-06-22 09:16:43 +0000
committerneal <neal>2008-06-22 09:16:43 +0000
commit61edfb886d649a07416a89b4294be738cdb4d061 (patch)
treeed30937d24cd854a8cecf8121e9ae9d94ce60690 /hurd
parent25f5fdaa9e28b4e768bc5c28435b3275bb60d886 (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/ChangeLog9
-rw-r--r--hurd/futex.h17
-rw-r--r--hurd/mutex.h12
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);
}
}