Rev 1298 | Rev 2118 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1298 | Rev 1434 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. 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: 1298 $ |
8 | $Revision: 1434 $ |
9 | 9 | ||
10 | 10 | ||
Line 215... | Line 215... | ||
215 | } lodsReg dr0, dr1, dr2, dr3, dr7 |
215 | } lodsReg dr0, dr1, dr2, dr3, dr7 |
216 | purge lodsReg |
216 | purge lodsReg |
217 | @@: ret |
217 | @@: ret |
218 | ;end. |
218 | ;end. |
Line -... | Line 219... | ||
- | 219 | ||
- | 220 | ||
- | 221 | ||
- | 222 | struc MUTEX_WAITER |
|
- | 223 | { |
|
- | 224 | .next rd 1 |
|
- | 225 | .prev rd 1 |
|
- | 226 | .task rd 1 |
|
- | 227 | .sizeof: |
|
- | 228 | }; |
|
- | 229 | ||
- | 230 | virtual at 0 |
|
- | 231 | MUTEX_WAITER MUTEX_WAITER |
|
- | 232 | end virtual |
|
- | 233 | ||
- | 234 | ;void __fastcall mutex_init(struct mutex *lock) |
|
- | 235 | ||
- | 236 | align 4 |
|
- | 237 | mutex_init: |
|
- | 238 | lea eax, [ecx+MUTEX.next] |
|
- | 239 | mov [ecx+MUTEX.count],1 |
|
- | 240 | mov [ecx+MUTEX.next], eax |
|
- | 241 | mov [ecx+MUTEX.prev], eax |
|
- | 242 | ret |
|
- | 243 | ||
- | 244 | ||
- | 245 | ;void __fastcall mutex_lock(struct mutex *lock) |
|
- | 246 | ||
- | 247 | align 4 |
|
- | 248 | mutex_lock: |
|
- | 249 | ||
- | 250 | dec [ecx+MUTEX.count] |
|
- | 251 | jns .done |
|
- | 252 | ||
- | 253 | pushfd |
|
- | 254 | cli |
|
- | 255 | ||
- | 256 | push esi |
|
- | 257 | sub esp, MUTEX_WAITER.sizeof |
|
- | 258 | ||
- | 259 | mov eax, [ecx+MUTEX.prev] |
|
- | 260 | lea esi, [ecx+MUTEX.next] |
|
- | 261 | ||
- | 262 | mov [ecx+MUTEX.prev], esp |
|
- | 263 | mov [esp+MUTEX_WAITER.next], esi |
|
- | 264 | mov [esp+MUTEX_WAITER.prev], eax |
|
- | 265 | mov [eax], esp |
|
- | 266 | ||
- | 267 | mov edx, [TASK_BASE] |
|
- | 268 | mov [esp+MUTEX_WAITER.task], edx |
|
- | 269 | ||
- | 270 | .forever: |
|
- | 271 | ||
- | 272 | mov eax, -1 |
|
- | 273 | xchg eax, [ecx+MUTEX.count] |
|
- | 274 | dec eax |
|
- | 275 | jz @F |
|
- | 276 | ||
- | 277 | mov [edx+TASKDATA.state], 1 |
|
- | 278 | call change_task |
|
- | 279 | jmp .forever |
|
- | 280 | @@: |
|
- | 281 | mov edx, [esp+MUTEX_WAITER.next] |
|
- | 282 | mov eax, [esp+MUTEX_WAITER.prev] |
|
- | 283 | ||
- | 284 | mov [eax+MUTEX_WAITER.next], edx |
|
- | 285 | cmp [ecx+MUTEX.next], esi |
|
- | 286 | mov [edx+MUTEX_WAITER.prev], eax |
|
- | 287 | jne @F |
|
- | 288 | ||
- | 289 | mov [ecx+MUTEX.count], 0 |
|
- | 290 | @@: |
|
- | 291 | add esp, MUTEX_WAITER.sizeof |
|
- | 292 | ||
- | 293 | pop esi |
|
- | 294 | popfd |
|
- | 295 | .done: |
|
- | 296 | ret |
|
- | 297 | ||
- | 298 | ;void __fastcall mutex_unlock(struct mutex *lock) |
|
- | 299 | ||
- | 300 | align 4 |
|
- | 301 | mutex_unlock: |
|
- | 302 | ||
- | 303 | pushfd |
|
- | 304 | cli |
|
- | 305 | ||
- | 306 | lea eax, [ecx+MUTEX.next] |
|
- | 307 | cmp eax, [ecx+MUTEX.next] |
|
- | 308 | mov [ecx+MUTEX.count], 1 |
|
- | 309 | je @F |
|
- | 310 | ||
- | 311 | mov eax, [eax+MUTEX_WAITER.task] |
|
- | 312 | mov [eax+TASKDATA.state], 0 |
|
- | 313 | @@: |
|
- | 314 | popfd |
|
- | 315 | ret |
|
- | 316 | ||
- | 317 | ||
- | 318 | purge MUTEX_WAITER |
|
219 | 319 | ||
- | 320 | if 0 |
|
220 | if 0 |
321 | |
221 | struc TIMER |
322 | struc TIMER |
222 | { |
323 | { |
223 | .next dd ? |
324 | .next dd ? |
224 | .exp_time dd ? |
325 | .exp_time dd ? |