Subversion Repositories Kolibri OS

Rev

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