- 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:
parent
a8f684af9c
commit
39e8b7e461
1 changed files with 34 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue