- add some additional error checks

git-svn-id: http://svn.lfbs.rwth-aachen.de/svn/scc/trunk/MetalSVM@38 315a16e6-25f9-4109-90ae-ca3045a26c18
This commit is contained in:
stefan 2010-08-04 17:21:25 +00:00
parent a8f684af9c
commit 39e8b7e461

View file

@ -35,39 +35,69 @@ typedef struct {
#define SPINLOCK_INIT { 0 }
inline static void spinlock_init(spinlock_t* s) {
inline static int spinlock_init(spinlock_t* s) {
if (BUILTIN_EXPECT(!s, 0))
return -1;
s->lock = 0;
return 0;
}
inline static void spinlock_destroy(spinlock_t* s) {
inline static int spinlock_destroy(spinlock_t* s) {
if (BUILTIN_EXPECT(!s, 0))
return -1;
s->lock = 0;
return 0;
}
inline static int spinlock_lock(spinlock_t* s) {
if (BUILTIN_EXPECT(!s, 0))
return -1;
while (atomic_uint32_test_and_set(&(s->lock)))
schedule();
return 0;
}
inline static int spinlock_trylock(spinlock_t* s) {
if (BUILTIN_EXPECT(!s, 0))
return -1;
return !atomic_uint32_test_and_set(&(s->lock));
}
inline static int spinlock_unlock(spinlock_t* s) {
if (BUILTIN_EXPECT(!s->lock, 0))
if (BUILTIN_EXPECT(!s, 0))
return -1;
if (BUILTIN_EXPECT(!(s->lock), 0))
return -1;
s->lock = 0;
return 0;
}
inline static int spinlock_lock_irqsave(spinlock_t* s) {
if (BUILTIN_EXPECT(!s, 0))
return -1;
irq_disable();
return spinlock_lock(s);
}
inline static int spinlock_unlock_irqsave(spinlock_t* s) {
int ret = spinlock_unlock(s);
int ret;
if (BUILTIN_EXPECT(!s, 0))
return -1;
ret = spinlock_unlock(s);
irq_enable();
return ret;
}