Rev 5201 | Rev 5593 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5201 | Rev 5565 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 5201 $ |
8 | $Revision: 5565 $ |
9 | 9 | ||
10 | 10 | ||
Line 114... | Line 114... | ||
114 | ; set tss.esp0 |
114 | ; set tss.esp0 |
Line 115... | Line 115... | ||
115 | 115 | ||
Line 116... | Line 116... | ||
116 | Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0] |
116 | Mov [tss._esp0],eax,[ebx+APPDATA.saved_esp0] |
117 | - | ||
118 | mov edx, [ebx+APPDATA.tls_base] |
- | |
Line 119... | Line 117... | ||
119 | cmp edx, [esi+APPDATA.tls_base] |
117 | |
120 | je @f |
118 | mov edx, [ebx+APPDATA.tls_base] |
121 | 119 | ||
122 | mov [tls_data_l+2], dx |
120 | mov [tls_data_l+2], dx |
Line 123... | Line 121... | ||
123 | shr edx, 16 |
121 | shr edx, 16 |
124 | mov [tls_data_l+4], dl |
122 | mov [tls_data_l+4], dl |
125 | mov [tls_data_l+7], dh |
123 | mov [tls_data_l+7], dh |
126 | 124 | ||
127 | mov dx, app_tls |
125 | mov dx, app_tls |
128 | mov fs, dx |
126 | mov fs, dx |
129 | @@: |
127 | |
130 | ; set gs selector unconditionally |
128 | ; set gs selector unconditionally |
Line 153... | Line 151... | ||
153 | @@: |
151 | @@: |
154 | ret |
152 | ret |
155 | ;end. |
153 | ;end. |
Line 156... | Line -... | ||
156 | - | ||
157 | 154 | ||
158 | 155 | ||
159 | struct MUTEX_WAITER |
156 | struct MUTEX_WAITER |
- | 157 | list LHEAD |
|
160 | list LHEAD |
158 | task dd ? |
Line -... | Line 159... | ||
- | 159 | type dd ? |
|
- | 160 | ends |
|
- | 161 | ||
161 | task dd ? |
162 | RWSEM_WAITING_FOR_WRITE equ 0 |
Line 162... | Line 163... | ||
162 | ends |
163 | RWSEM_WAITING_FOR_READ equ 1 |
163 | 164 | ||
164 | ;void __fastcall mutex_init(struct mutex *lock) |
165 | ;void __fastcall mutex_init(struct mutex *lock) |
165 | 166 | ||
166 | align 4 |
167 | align 4 |
167 | mutex_init: |
168 | mutex_init: |
Line 168... | Line -... | ||
168 | mov [ecx+MUTEX.lhead.next], ecx |
- | |
169 | mov [ecx+MUTEX.lhead.prev], ecx |
169 | mov [ecx+MUTEX.wait_list.next], ecx |
Line 170... | Line 170... | ||
170 | mov [ecx+MUTEX.count], 1 |
170 | mov [ecx+MUTEX.wait_list.prev], ecx |
171 | ret |
171 | mov [ecx+MUTEX.count], 1 |
Line 198... | Line 198... | ||
198 | 198 | ||
199 | mov [edx+TASKDATA.state], 1 |
199 | mov [edx+TASKDATA.state], 1 |
200 | call change_task |
200 | call change_task |
201 | jmp .forever |
201 | jmp .forever |
202 | @@: |
202 | @@: |
203 | mov edx, [esp+MUTEX_WAITER.list.next] |
203 | mov eax, ecx |
Line 204... | Line -... | ||
204 | mov eax, [esp+MUTEX_WAITER.list.prev] |
- | |
205 | - | ||
206 | mov [eax+MUTEX_WAITER.list.next], edx |
204 | list_del esp |
207 | mov [edx+MUTEX_WAITER.list.prev], eax |
205 | |
Line 208... | Line 206... | ||
208 | cmp [ecx+MUTEX.lhead.next], ecx |
206 | cmp [eax+MUTEX.wait_list.next], eax |
209 | jne @F |
207 | jne @F |
210 | 208 | ||
Line 211... | Line 209... | ||
211 | mov [ecx+MUTEX.count], 0 |
209 | mov [eax+MUTEX.count], 0 |
212 | @@: |
210 | @@: |
Line 222... | Line 220... | ||
222 | mutex_unlock: |
220 | mutex_unlock: |
Line 223... | Line 221... | ||
223 | 221 | ||
224 | pushfd |
222 | pushfd |
Line 225... | Line 223... | ||
225 | cli |
223 | cli |
226 | 224 | ||
227 | mov eax, [ecx+MUTEX.lhead.next] |
225 | mov eax, [ecx+MUTEX.wait_list.next] |
228 | cmp eax, ecx |
226 | cmp eax, ecx |
Line 229... | Line 227... | ||
229 | mov [ecx+MUTEX.count], 1 |
227 | mov [ecx+MUTEX.count], 1 |
Line 234... | Line 232... | ||
234 | @@: |
232 | @@: |
235 | popfd |
233 | popfd |
236 | ret |
234 | ret |
Line -... | Line 235... | ||
- | 235 | ||
- | 236 | ||
- | 237 | ;void __fastcall init_rwsem(struct rw_semaphore *sem) |
|
- | 238 | ||
- | 239 | align 4 |
|
- | 240 | init_rwsem: |
|
- | 241 | mov [ecx+RWSEM.wait_list.next], ecx |
|
- | 242 | mov [ecx+RWSEM.wait_list.prev], ecx |
|
- | 243 | mov [ecx+RWSEM.count], 0 |
|
- | 244 | ret |
|
- | 245 | ||
- | 246 | ;void __fastcall down_read(struct rw_semaphore *sem) |
|
- | 247 | ||
- | 248 | align 4 |
|
- | 249 | down_read: |
|
- | 250 | pushfd |
|
- | 251 | cli |
|
- | 252 | ||
- | 253 | mov eax, [ecx+RWSEM.count] |
|
- | 254 | test eax, eax |
|
- | 255 | js @F |
|
- | 256 | ||
- | 257 | cmp ecx, [ecx+RWSEM.wait_list.next] |
|
- | 258 | je .ok |
|
- | 259 | @@: |
|
- | 260 | sub esp, sizeof.MUTEX_WAITER |
|
- | 261 | ||
- | 262 | mov eax, [TASK_BASE] |
|
- | 263 | mov [esp+MUTEX_WAITER.task], eax |
|
- | 264 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ |
|
- | 265 | mov [eax+TASKDATA.state], 1 |
|
- | 266 | ||
- | 267 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
|
- | 268 | ||
- | 269 | call change_task |
|
- | 270 | ||
- | 271 | add esp, sizeof.MUTEX_WAITER |
|
- | 272 | popfd |
|
- | 273 | ret |
|
- | 274 | .ok: |
|
- | 275 | inc eax |
|
- | 276 | mov [ecx+RWSEM.count], eax |
|
- | 277 | ||
- | 278 | popfd |
|
- | 279 | ret |
|
- | 280 | ||
- | 281 | ;void __fastcall down_write(struct rw_semaphore *sem) |
|
- | 282 | ||
- | 283 | align 4 |
|
- | 284 | down_write: |
|
- | 285 | pushfd |
|
- | 286 | cli |
|
- | 287 | sub esp, sizeof.MUTEX_WAITER |
|
- | 288 | ||
- | 289 | mov edx, [TASK_BASE] |
|
- | 290 | mov [esp+MUTEX_WAITER.task], edx |
|
- | 291 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE |
|
- | 292 | mov [edx+TASKDATA.state], 1 |
|
- | 293 | ||
- | 294 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
|
- | 295 | ||
- | 296 | xor eax, eax |
|
- | 297 | not eax |
|
- | 298 | ||
- | 299 | .forever: |
|
- | 300 | test eax, [ecx+RWSEM.count] |
|
- | 301 | jz @F |
|
- | 302 | ||
- | 303 | mov [edx+TASKDATA.state], 1 |
|
- | 304 | call change_task |
|
- | 305 | jmp .forever |
|
- | 306 | @@: |
|
- | 307 | mov [ecx+RWSEM.count], eax |
|
- | 308 | list_del esp |
|
- | 309 | ||
- | 310 | add esp, sizeof.MUTEX_WAITER |
|
- | 311 | popfd |
|
- | 312 | ret |
|
- | 313 | ||
- | 314 | ;void __fastcall up_read(struct rw_semaphore *sem) |
|
- | 315 | ||
- | 316 | align 4 |
|
- | 317 | up_read: |
|
- | 318 | pushfd |
|
- | 319 | cli |
|
- | 320 | ||
- | 321 | dec [ecx+RWSEM.count] |
|
- | 322 | jnz @F |
|
- | 323 | ||
- | 324 | mov eax, [ecx+RWSEM.wait_list.next] |
|
- | 325 | cmp eax, ecx |
|
- | 326 | je @F |
|
- | 327 | ||
- | 328 | mov eax, [eax+MUTEX_WAITER.task] |
|
- | 329 | mov [eax+TASKDATA.state], 0 |
|
- | 330 | @@: |
|
- | 331 | popfd |
|
- | 332 | ret |
|
- | 333 | ||
- | 334 | ;void __fastcall up_write(struct rw_semaphore *sem) |
|
- | 335 | ||
- | 336 | align 4 |
|
- | 337 | up_write: |
|
- | 338 | ||
- | 339 | pushfd |
|
- | 340 | cli |
|
- | 341 | ||
- | 342 | mov eax, [ecx+RWSEM.wait_list.next] |
|
- | 343 | mov [ecx+RWSEM.count], 0 |
|
- | 344 | ||
- | 345 | cmp ecx, eax |
|
- | 346 | je .done |
|
- | 347 | ||
- | 348 | mov edx, [eax+MUTEX_WAITER.type] |
|
- | 349 | test edx, edx |
|
- | 350 | jnz .wake |
|
- | 351 | ||
- | 352 | mov eax, [eax+MUTEX_WAITER.task] |
|
- | 353 | mov [eax+TASKDATA.state], 0 |
|
- | 354 | .done: |
|
- | 355 | popfd |
|
- | 356 | ret |
|
- | 357 | ||
- | 358 | .wake: |
|
- | 359 | push ebx |
|
- | 360 | push esi |
|
- | 361 | push edi |
|
- | 362 | ||
- | 363 | xor esi, esi |
|
- | 364 | mov edi, ecx |
|
- | 365 | ||
- | 366 | .wake_list: |
|
- | 367 | ||
- | 368 | mov ebx, [eax+MUTEX_WAITER.list.next] |
|
- | 369 | list_del eax |
|
- | 370 | mov edx, [eax+MUTEX_WAITER.task] |
|
- | 371 | mov [edx+TASKDATA.state], 0 |
|
- | 372 | inc esi |
|
- | 373 | cmp edi, ebx |
|
- | 374 | je .wake_done |
|
- | 375 | ||
- | 376 | mov ecx, [ebx+MUTEX_WAITER.type] |
|
- | 377 | test ecx, ecx |
|
- | 378 | jz .wake_done |
|
- | 379 | ||
- | 380 | mov eax, ebx |
|
- | 381 | jmp .wake_list |
|
- | 382 | ||
- | 383 | .wake_done: |
|
- | 384 | add [edi+RWSEM.count], esi |
|
- | 385 | ||
- | 386 | pop edi |
|
- | 387 | pop esi |
|
- | 388 | pop ebx |
|
- | 389 | popfd |
|
- | 390 | ret |
|
237 | 391 | ||
- | 392 | ||
- | 393 | purge MUTEX_WAITER |
|
- | 394 | purge RWSEM_WAITING_FOR_WRITE |
|
Line 238... | Line 395... | ||
238 | 395 | purge RWSEM_WAITING_FOR_READ |
|
239 | purge MUTEX_WAITER |
396 | |
240 | 397 | ||
241 | MAX_PRIORITY = 0 ; highest, used for kernel tasks |
398 | MAX_PRIORITY = 0 ; highest, used for kernel tasks |