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 |