Subversion Repositories HelenOS-historic

Rev

Rev 625 | Rev 1104 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 625 Rev 1100
Line 31... Line 31...
31
 
31
 
32
#include <arch/types.h>
32
#include <arch/types.h>
33
#include <typedefs.h>
33
#include <typedefs.h>
34
#include <preemption.h>
34
#include <preemption.h>
35
#include <arch/atomic.h>
35
#include <arch/atomic.h>
-
 
36
#include <debug.h>
36
 
37
 
37
#ifdef CONFIG_SMP
38
#ifdef CONFIG_SMP
38
struct spinlock {
39
struct spinlock {
39
#ifdef CONFIG_DEBUG_SPINLOCK
40
#ifdef CONFIG_DEBUG_SPINLOCK
40
    char *name;
41
    char *name;
Line 64... Line 65...
64
        .val = { 0 }        \
65
        .val = { 0 }        \
65
    }
66
    }
66
#endif
67
#endif
67
 
68
 
68
extern void spinlock_initialize(spinlock_t *sl, char *name);
69
extern void spinlock_initialize(spinlock_t *sl, char *name);
69
extern void spinlock_lock(spinlock_t *sl);
-
 
70
extern int spinlock_trylock(spinlock_t *sl);
70
extern int spinlock_trylock(spinlock_t *sl);
71
extern void spinlock_unlock(spinlock_t *sl);
71
extern void spinlock_lock_debug(spinlock_t *sl);
-
 
72
 
-
 
73
#ifdef CONFIG_DEBUG_SPINLOCK
-
 
74
#  define spinlock_lock(x) spinlock_lock_debug(x)
-
 
75
#else
-
 
76
#  define spinlock_lock(x) atomic_lock_arch(&(x)->val)
-
 
77
#endif
-
 
78
 
-
 
79
/** Unlock spinlock
-
 
80
 *
-
 
81
 * Unlock spinlock.
-
 
82
 *
-
 
83
 * @param sl Pointer to spinlock_t structure.
-
 
84
 */
-
 
85
static inline void spinlock_unlock(spinlock_t *sl)
-
 
86
{
-
 
87
    ASSERT(atomic_get(&sl->val) != 0);
-
 
88
 
-
 
89
    /*
-
 
90
     * Prevent critical section code from bleeding out this way down.
-
 
91
     */
-
 
92
    CS_LEAVE_BARRIER();
-
 
93
   
-
 
94
    atomic_set(&sl->val,0);
-
 
95
    preemption_enable();
-
 
96
}
72
 
97
 
73
#else
98
#else
74
 
99
 
75
/* On UP systems, spinlocks are effectively left out. */
100
/* On UP systems, spinlocks are effectively left out. */
76
#define SPINLOCK_DECLARE(name)
101
#define SPINLOCK_DECLARE(name)