Subversion Repositories HelenOS

Rev

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

Rev 552 Rev 557
Line 60... Line 60...
60
 *
60
 *
61
 * @param sl Pointer to spinlock_t structure.
61
 * @param sl Pointer to spinlock_t structure.
62
 */
62
 */
63
void spinlock_lock(spinlock_t *sl)
63
void spinlock_lock(spinlock_t *sl)
64
{
64
{
65
    int i = 0;
65
    count_t i = 0;
66
    __address caller = ((__address *) &sl)[-1];
66
    __address caller = ((__address *) &sl)[-1];
67
    char *symbol;
67
    char *symbol;
-
 
68
    bool deadlock_reported = false;
68
 
69
 
69
    preemption_disable();
70
    preemption_disable();
70
    while (test_and_set(&sl->val)) {
71
    while (test_and_set(&sl->val)) {
71
        if (i++ > 300000) {
72
        if (i++ > 300000) {
72
            printf("cpu%d: looping on spinlock %p:%s, caller=%p",
73
            printf("cpu%d: looping on spinlock %p:%s, caller=%p",
Line 74... Line 75...
74
            symbol = get_symtab_entry(caller);
75
            symbol = get_symtab_entry(caller);
75
            if (symbol)
76
            if (symbol)
76
                printf("(%s)", symbol);
77
                printf("(%s)", symbol);
77
            printf("\n");
78
            printf("\n");
78
            i = 0;
79
            i = 0;
-
 
80
            deadlock_reported = true;
79
        }
81
        }
80
    }
82
    }
81
 
83
 
-
 
84
    if (deadlock_reported)
-
 
85
        printf("cpu%d: not deadlocked\n", CPU->id);
-
 
86
 
82
    /*
87
    /*
83
     * Prevent critical section code from bleeding out this way up.
88
     * Prevent critical section code from bleeding out this way up.
84
     */
89
     */
85
    CS_ENTER_BARRIER();
90
    CS_ENTER_BARRIER();
86
 
91