Subversion Repositories HelenOS

Rev

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

Rev 111 Rev 153
Line 27... Line 27...
27
 */
27
 */
28
 
28
 
29
#include <arch.h>
29
#include <arch.h>
30
 
30
 
31
#include <arch/atomic.h>
31
#include <arch/atomic.h>
-
 
32
#include <arch/barrier.h>
32
#include <synch/spinlock.h>
33
#include <synch/spinlock.h>
33
 
34
 
34
#ifdef __SMP__
35
#ifdef __SMP__
35
 
36
 
36
void spinlock_initialize(spinlock_t *sl)
37
void spinlock_initialize(spinlock_t *sl)
Line 48... Line 49...
48
        if (i++ > 300000) {
49
        if (i++ > 300000) {
49
            printf("cpu%d: looping on spinlock %X, caller=%X\n", CPU->id, sl, caller);
50
            printf("cpu%d: looping on spinlock %X, caller=%X\n", CPU->id, sl, caller);
50
            i = 0;
51
            i = 0;
51
        }
52
        }
52
    }
53
    }
-
 
54
    CS_ENTER_BARRIER();
53
 
55
 
54
}
56
}
55
#else
57
#else
56
void spinlock_lock(spinlock_t *sl)
58
void spinlock_lock(spinlock_t *sl)
57
{
59
{
58
    /*
60
    /*
59
     * Each architecture has its own efficient/recommended
61
     * Each architecture has its own efficient/recommended
60
     * implementation of spinlock.
62
     * implementation of spinlock.
61
     */
63
     */
62
    spinlock_arch(&sl->val);
64
    spinlock_arch(&sl->val);
-
 
65
    CS_ENTER_BARRIER();
63
}
66
}
64
#endif
67
#endif
65
 
68
 
66
int spinlock_trylock(spinlock_t *sl)
69
int spinlock_trylock(spinlock_t *sl)
67
{
70
{
-
 
71
    int rc;
-
 
72
   
68
    return !test_and_set(&sl->val);
73
    rc = !test_and_set(&sl->val);
-
 
74
    CS_ENTER_BARRIER();
-
 
75
   
-
 
76
    return rc;
69
}
77
}
70
 
78
 
71
void spinlock_unlock(spinlock_t *sl)
79
void spinlock_unlock(spinlock_t *sl)
72
{
80
{
-
 
81
    CS_LEAVE_BARRIER();
73
    sl->val = 0;
82
    sl->val = 0;
74
}
83
}
75
 
84
 
76
#endif
85
#endif