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 |