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 |