From f8598074c9df8821312f2c4a7cea9ba772625f82 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 3 Dec 2005 18:16:20 +0000 Subject: add userland thread library. incomplete, but functional --- lib/librthread/arch/i386/_atomic_lock.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/librthread/arch/i386/_atomic_lock.c (limited to 'lib/librthread/arch/i386/_atomic_lock.c') diff --git a/lib/librthread/arch/i386/_atomic_lock.c b/lib/librthread/arch/i386/_atomic_lock.c new file mode 100644 index 00000000000..7b9b46a73c7 --- /dev/null +++ b/lib/librthread/arch/i386/_atomic_lock.c @@ -0,0 +1,25 @@ +/* $OpenBSD: _atomic_lock.c,v 1.1 2005/12/03 18:16:19 tedu Exp $ */ +/* David Leonard, . Public domain. */ + +/* + * Atomic lock for i386 + */ + +#include + +int +_atomic_lock(register volatile _spinlock_lock_t *lock) +{ + register _spinlock_lock_t old; + + /* + * Use the eXCHanGe instruction to swap the lock value with + * a local variable containing the locked state. + */ + old = _SPINLOCK_LOCKED; + __asm__("xchg %0,%1" + : "=r" (old), "=m" (*lock) + : "0" (old), "1" (*lock)); + + return (old != _SPINLOCK_UNLOCKED); +} -- cgit v1.2.3