diff options
author | marcel <marcel@FreeBSD.org> | 2004-07-02 00:40:07 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-07-02 00:40:07 +0000 |
commit | 622fe058c99b4a6cac2805c8352c92b4330882f9 (patch) | |
tree | 9c8400ddc4d640b6eb03f81ba5983718f183b0e0 /sys/kern/kern_umtx.c | |
parent | e84fdd61ba2c15de745151bb597597aed2b690ed (diff) | |
download | FreeBSD-src-622fe058c99b4a6cac2805c8352c92b4330882f9.zip FreeBSD-src-622fe058c99b4a6cac2805c8352c92b4330882f9.tar.gz |
Change the thread ID (thr_id_t) used for 1:1 threading from being a
pointer to the corresponding struct thread to the thread ID (lwpid_t)
assigned to that thread. The primary reason for this change is that
libthr now internally uses the same ID as the debugger and the kernel
when referencing to a kernel thread. This allows us to implement the
support for debugging without additional translations and/or mappings.
To preserve the ABI, the 1:1 threading syscalls, including the umtx
locking API have not been changed to work on a lwpid_t. Instead the
1:1 threading syscalls operate on long and the umtx locking API has
not been changed except for the contested bit. Previously this was
the least significant bit. Now it's the most significant bit. Since
the contested bit should not be tested by userland, this change is
not expected to be visible. Just to be sure, UMTX_CONTESTED has been
removed from <sys/umtx.h>.
Reviewed by: mtm@
ABI preservation tested on: i386, ia64
Diffstat (limited to 'sys/kern/kern_umtx.c')
-rw-r--r-- | sys/kern/kern_umtx.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index e767ec8..e1ae68d 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> +#include <sys/limits.h> #include <sys/lock.h> #include <sys/malloc.h> #include <sys/mutex.h> @@ -62,6 +63,7 @@ MTX_SYSINIT(umtx, &umtx_lock, "umtx", MTX_DEF); #define UMTX_LOCK() mtx_lock(&umtx_lock); #define UMTX_UNLOCK() mtx_unlock(&umtx_lock); +#define UMTX_CONTESTED LONG_MIN static struct umtx_q *umtx_lookup(struct thread *, struct umtx *umtx); static struct umtx_q *umtx_insert(struct thread *, struct umtx *umtx); @@ -161,7 +163,7 @@ _umtx_lock(struct thread *td, struct _umtx_lock_args *uap) * Try the uncontested case. This should be done in userland. */ owner = casuptr((intptr_t *)&umtx->u_owner, - UMTX_UNOWNED, (intptr_t)td); + UMTX_UNOWNED, td->td_tid); /* The address was invalid. */ if (owner == -1) @@ -174,7 +176,7 @@ _umtx_lock(struct thread *td, struct _umtx_lock_args *uap) /* If no one owns it but it is contested try to acquire it. */ if (owner == UMTX_CONTESTED) { owner = casuptr((intptr_t *)&umtx->u_owner, - UMTX_CONTESTED, ((intptr_t)td | UMTX_CONTESTED)); + UMTX_CONTESTED, td->td_tid | UMTX_CONTESTED); /* The address was invalid. */ if (owner == -1) @@ -263,7 +265,7 @@ _umtx_unlock(struct thread *td, struct _umtx_unlock_args *uap) if ((owner = fuword(&umtx->u_owner)) == -1) return (EFAULT); - if ((struct thread *)(owner & ~UMTX_CONTESTED) != td) + if ((owner & ~UMTX_CONTESTED) != td->td_tid) return (EPERM); /* We should only ever be in here for contested locks */ |