Subversion Repositories Kolibri OS

Rev

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

Rev 9715 Rev 9831
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 9715 $
8
$Revision: 9831 $
9
 
9
 
10
align 4
10
align 4
11
;struct futex*  __fastcall create_futex(int *ptr)
11
;struct futex*  __fastcall create_futex(int *ptr)
Line 79... Line 79...
79
.fail:
79
.fail:
80
.requeue:
80
.requeue:
81
.cmp_requeue:
81
.cmp_requeue:
82
.wait_bitset:
82
.wait_bitset:
83
.wake_bitset:
83
.wake_bitset:
84
        mov     [esp + SYSCALL_STACK._eax], -1
84
        mov     [esp + SYSCALL_STACK.eax], -1
85
        ret
85
        ret
Line 86... Line 86...
86
 
86
 
87
align 4
87
align 4
88
.init:
88
.init:
89
        call    create_futex
89
        call    create_futex
90
        test    eax, eax
90
        test    eax, eax
91
        jz      @F
91
        jz      @F
92
        mov     eax, [eax + FUTEX.handle]
92
        mov     eax, [eax + FUTEX.handle]
93
@@:
93
@@:
94
        mov     [esp + SYSCALL_STACK._eax], eax
94
        mov     [esp + SYSCALL_STACK.eax], eax
Line 95... Line 95...
95
        ret
95
        ret
96
 
96
 
97
align 4
97
align 4
98
;ecx futex handle
98
;ecx futex handle
99
;edi current process
99
;edi current process
100
;ebp futex object
100
;ebp futex object
101
.destroy:
101
.destroy:
102
        mov     ecx, ebp
102
        mov     ecx, ebp
103
        call    destroy_futex
103
        call    destroy_futex
Line 104... Line 104...
104
        mov     [esp + SYSCALL_STACK._eax], eax
104
        mov     [esp + SYSCALL_STACK.eax], eax
105
        ret
105
        ret
106
 
106
 
Line 116... Line 116...
116
        mov     ecx, [ebp + FUTEX.pointer]
116
        mov     ecx, [ebp + FUTEX.pointer]
117
        mov     eax, edx
117
        mov     eax, edx
118
        lock cmpxchg [ecx], edx
118
        lock cmpxchg [ecx], edx
119
        je      .wait_slow
119
        je      .wait_slow
Line 120... Line 120...
120
 
120
 
121
        mov     [esp + SYSCALL_STACK._eax], -2
121
        mov     [esp + SYSCALL_STACK.eax], -2
Line 122... Line 122...
122
        ret
122
        ret
123
 
123
 
124
.wait_slow:
124
.wait_slow:
Line 141... Line 141...
141
 
141
 
142
        list_del esp
142
        list_del esp
Line 143... Line 143...
143
        add     esp, sizeof.MUTEX_WAITER
143
        add     esp, sizeof.MUTEX_WAITER
144
 
144
 
145
        popfd
145
        popfd
Line 146... Line 146...
146
        mov     [esp + SYSCALL_STACK._eax], 0
146
        mov     [esp + SYSCALL_STACK.eax], 0
147
        ret
147
        ret
148
 
148
 
Line 157... Line 157...
157
        mov     ecx, [ebp + FUTEX.pointer]
157
        mov     ecx, [ebp + FUTEX.pointer]
158
        mov     eax, edx
158
        mov     eax, edx
159
        lock cmpxchg [ecx], edx         ;wait until old_value == new_value
159
        lock cmpxchg [ecx], edx         ;wait until old_value == new_value
160
        je      .wait_slow_timeout
160
        je      .wait_slow_timeout
Line 161... Line 161...
161
 
161
 
162
        mov     [esp + SYSCALL_STACK._eax], -2
162
        mov     [esp + SYSCALL_STACK.eax], -2
Line 163... Line 163...
163
        ret
163
        ret
164
 
164
 
165
align 4
165
align 4
Line 198... Line 198...
198
@@:
198
@@:
199
        list_del esp
199
        list_del esp
200
        add     esp, sizeof.MUTEX_WAITER
200
        add     esp, sizeof.MUTEX_WAITER
Line 201... Line 201...
201
 
201
 
202
        popfd
202
        popfd
203
        mov     [esp + SYSCALL_STACK._eax], 0
203
        mov     [esp + SYSCALL_STACK.eax], 0
Line 204... Line 204...
204
        ret
204
        ret
205
 
205
 
206
.timeout:
206
.timeout:
Line 207... Line 207...
207
        list_del esp
207
        list_del esp
208
        add     esp, sizeof.MUTEX_WAITER
208
        add     esp, sizeof.MUTEX_WAITER
209
 
209
 
Line 210... Line 210...
210
        popfd
210
        popfd
211
        mov     [esp + SYSCALL_STACK._eax], -1
211
        mov     [esp + SYSCALL_STACK.eax], -1
Line 237... Line 237...
237
        inc     ecx
237
        inc     ecx
238
        cmp     ecx, edx
238
        cmp     ecx, edx
239
        jb      .again_wake
239
        jb      .again_wake
240
.done:
240
.done:
241
        popfd
241
        popfd
242
        mov     [esp + SYSCALL_STACK._eax], ecx
242
        mov     [esp + SYSCALL_STACK.eax], ecx
243
        ret
243
        ret