Subversion Repositories Kolibri OS

Rev

Rev 7136 | Rev 9709 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7136 Rev 8874
Line 5... Line 5...
5
;;                                                              ;;
5
;;                                                              ;;
6
;; Synhronization for MenuetOS.                                 ;;
6
;; Synhronization for MenuetOS.                                 ;;
7
;; Author: Halyavin Andrey, halyavin@land.ru                    ;;
7
;; Author: Halyavin Andrey, halyavin@land.ru                    ;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 9... Line 9...
9
 
9
 
Line 10... Line 10...
10
$Revision: 7136 $
10
$Revision: 8874 $
11
 
11
 
Line 46... Line 46...
46
        mov     eax, -1
46
        mov     eax, -1
47
        xchg    eax, [ecx+MUTEX.count]
47
        xchg    eax, [ecx+MUTEX.count]
48
        dec     eax
48
        dec     eax
49
        jz      @F
49
        jz      @F
Line 50... Line 50...
50
 
50
 
51
        mov     [edx+TASKDATA.state], 1
51
        mov     [edx+TASKDATA.state], TSTATE_RUN_SUSPENDED
52
        call    change_task
52
        call    change_task
53
        jmp     .forever
53
        jmp     .forever
54
@@:
54
@@:
55
        mov     eax, ecx
55
        mov     eax, ecx
Line 78... Line 78...
78
        cmp     eax, ecx
78
        cmp     eax, ecx
79
        mov     [ecx+MUTEX.count], 1
79
        mov     [ecx+MUTEX.count], 1
80
        je      @F
80
        je      @F
Line 81... Line 81...
81
 
81
 
82
        mov     eax, [eax+MUTEX_WAITER.task]
82
        mov     eax, [eax+MUTEX_WAITER.task]
83
        mov     [eax+TASKDATA.state], 0
83
        mov     [eax+TASKDATA.state], TSTATE_RUNNING
84
@@:
84
@@:
85
        popfd
85
        popfd
Line 112... Line 112...
112
        sub     esp, sizeof.MUTEX_WAITER
112
        sub     esp, sizeof.MUTEX_WAITER
Line 113... Line 113...
113
 
113
 
114
        mov     eax, [TASK_BASE]
114
        mov     eax, [TASK_BASE]
115
        mov     [esp+MUTEX_WAITER.task], eax
115
        mov     [esp+MUTEX_WAITER.task], eax
116
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
116
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
Line 117... Line 117...
117
        mov     [eax+TASKDATA.state], 1
117
        mov     [eax+TASKDATA.state], TSTATE_RUN_SUSPENDED
Line 118... Line 118...
118
 
118
 
Line 139... Line 139...
139
        sub     esp, sizeof.MUTEX_WAITER
139
        sub     esp, sizeof.MUTEX_WAITER
Line 140... Line 140...
140
 
140
 
141
        mov     edx, [TASK_BASE]
141
        mov     edx, [TASK_BASE]
142
        mov     [esp+MUTEX_WAITER.task], edx
142
        mov     [esp+MUTEX_WAITER.task], edx
143
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
143
        mov     [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
Line 144... Line 144...
144
        mov     [edx+TASKDATA.state], 1
144
        mov     [edx+TASKDATA.state], TSTATE_RUN_SUSPENDED
Line 145... Line 145...
145
 
145
 
146
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
146
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
Line 147... Line 147...
147
 
147
 
148
        xor     eax, eax
148
        xor     eax, eax
149
        not     eax
149
        not     eax
Line 150... Line 150...
150
 
150
 
151
.forever:
151
.forever:
152
        test    eax, [ecx+RWSEM.count]
152
        test    eax, [ecx+RWSEM.count]
153
        jz      @F
153
        jz      @F
154
 
154
 
155
        mov     [edx+TASKDATA.state], 1
155
        mov     [edx+TASKDATA.state], TSTATE_RUN_SUSPENDED
Line 176... Line 176...
176
        mov     eax, [ecx+RWSEM.wait_list.next]
176
        mov     eax, [ecx+RWSEM.wait_list.next]
177
        cmp     eax, ecx
177
        cmp     eax, ecx
178
        je      @F
178
        je      @F
Line 179... Line 179...
179
 
179
 
180
        mov     eax, [eax+MUTEX_WAITER.task]
180
        mov     eax, [eax+MUTEX_WAITER.task]
181
        mov     [eax+TASKDATA.state], 0
181
        mov     [eax+TASKDATA.state], TSTATE_RUNNING
182
@@:
182
@@:
183
        popfd
183
        popfd
Line 184... Line 184...
184
        ret
184
        ret
Line 200... Line 200...
200
        mov     edx, [eax+MUTEX_WAITER.type]
200
        mov     edx, [eax+MUTEX_WAITER.type]
201
        test    edx, edx
201
        test    edx, edx
202
        jnz     .wake
202
        jnz     .wake
Line 203... Line 203...
203
 
203
 
204
        mov     eax, [eax+MUTEX_WAITER.task]
204
        mov     eax, [eax+MUTEX_WAITER.task]
205
        mov     [eax+TASKDATA.state], 0
205
        mov     [eax+TASKDATA.state], TSTATE_RUNNING
206
.done:
206
.done:
207
        popfd
207
        popfd
Line 208... Line 208...
208
        ret
208
        ret
Line 218... Line 218...
218
.wake_list:
218
.wake_list:
Line 219... Line 219...
219
 
219
 
220
        mov     ebx, [eax+MUTEX_WAITER.list.next]
220
        mov     ebx, [eax+MUTEX_WAITER.list.next]
221
        list_del eax
221
        list_del eax
222
        mov     edx, [eax+MUTEX_WAITER.task]
222
        mov     edx, [eax+MUTEX_WAITER.task]
223
        mov     [edx+TASKDATA.state], 0
223
        mov     [edx+TASKDATA.state], TSTATE_RUNNING
224
        inc     esi
224
        inc     esi
225
        cmp     edi, ebx
225
        cmp     edi, ebx
Line 226... Line 226...
226
        je      .wake_done
226
        je      .wake_done