Subversion Repositories Kolibri OS

Rev

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

Rev 8874 Rev 9709
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: 8874 $
10
$Revision: 9709 $
11
 
11
 
Line 36... Line 36...
36
 
36
 
Line 37... Line 37...
37
        sub     esp, sizeof.MUTEX_WAITER
37
        sub     esp, sizeof.MUTEX_WAITER
Line 38... Line 38...
38
 
38
 
39
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
39
        list_add_tail esp, ecx      ;esp= new waiter, ecx= list head
Line 40... Line 40...
40
 
40
 
Line 41... Line 41...
41
        mov     edx, [TASK_BASE]
41
        mov     edx, [current_slot]
42
        mov     [esp+MUTEX_WAITER.task], edx
42
        mov     [esp+MUTEX_WAITER.task], edx
43
 
43
 
44
.forever:
44
.forever:
Line 45... Line 45...
45
 
45
 
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
50
 
50
 
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], TSTATE_RUNNING
83
        mov     [eax + APPDATA.state], TSTATE_RUNNING
84
@@:
84
@@:
85
        popfd
85
        popfd
Line 109... Line 109...
109
        cmp     ecx, [ecx+RWSEM.wait_list.next]
109
        cmp     ecx, [ecx+RWSEM.wait_list.next]
110
        je      .ok
110
        je      .ok
111
@@:
111
@@:
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, [current_slot]
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], TSTATE_RUN_SUSPENDED
117
        mov     [eax + APPDATA.state], TSTATE_RUN_SUSPENDED
Line 118... Line 118...
118
 
118
 
Line 136... Line 136...
136
down_write:
136
down_write:
137
        pushfd
137
        pushfd
138
        cli
138
        cli
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, [current_slot]
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], TSTATE_RUN_SUSPENDED
144
        mov     [edx + APPDATA.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], TSTATE_RUN_SUSPENDED
155
        mov     [edx + APPDATA.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], TSTATE_RUNNING
181
        mov     [eax + APPDATA.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], TSTATE_RUNNING
205
        mov     [eax + APPDATA.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], TSTATE_RUNNING
223
        mov     [edx + APPDATA.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