Rev 379 | Rev 431 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 379 | Rev 425 | ||
---|---|---|---|
- | 1 | $Revision: 425 $ |
|
1 | if ~defined sync_inc |
2 | if ~defined sync_inc |
2 | sync_inc_fix: |
3 | sync_inc_fix: |
3 | sync_inc fix sync_inc_fix |
4 | sync_inc fix sync_inc_fix |
4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
5 | ;;Synhronization for MenuetOS. ;; |
6 | ;;Synhronization for MenuetOS. ;; |
6 | ;;Author: Halyavin Andrey, halyavin@land.ru ;; |
7 | ;;Author: Halyavin Andrey, halyavin@land.ru ;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8 | 9 | ||
9 | ;simplest mutex. |
10 | ;simplest mutex. |
10 | macro SimpleMutex name |
11 | macro SimpleMutex name |
11 | { |
12 | { |
12 | ; iglobal |
13 | ; iglobal |
13 | name dd 0 |
14 | name dd 0 |
14 | name#.type = 1 |
15 | name#.type = 1 |
15 | ; endg |
16 | ; endg |
16 | } |
17 | } |
17 | macro WaitSimpleMutex name |
18 | macro WaitSimpleMutex name |
18 | { |
19 | { |
19 | local start_wait,ok |
20 | local start_wait,ok |
20 | start_wait=$ |
21 | start_wait=$ |
21 | cli |
22 | cli |
22 | cmp [name],dword 0 |
23 | cmp [name],dword 0 |
23 | jz ok |
24 | jz ok |
24 | sti |
25 | sti |
25 | call change_task |
26 | call change_task |
26 | jmp start_wait |
27 | jmp start_wait |
27 | ok=$ |
28 | ok=$ |
28 | push eax |
29 | push eax |
29 | mov eax,dword [TASK_BASE+second_base_address] |
30 | mov eax,dword [TASK_BASE+second_base_address] |
30 | mov eax,[eax+TASKDATA.pid] |
31 | mov eax,[eax+TASKDATA.pid] |
31 | mov [name],eax |
32 | mov [name],eax |
32 | pop eax |
33 | pop eax |
33 | sti |
34 | sti |
34 | } |
35 | } |
35 | macro ReleaseSimpleMutex name |
36 | macro ReleaseSimpleMutex name |
36 | { |
37 | { |
37 | mov [name],dword 0 |
38 | mov [name],dword 0 |
38 | } |
39 | } |
39 | macro TryWaitSimpleMutex name ;result in eax and in flags |
40 | macro TryWaitSimpleMutex name ;result in eax and in flags |
40 | { |
41 | { |
41 | local ok,try_end |
42 | local ok,try_end |
42 | cmp [name],dword 0 |
43 | cmp [name],dword 0 |
43 | jz ok |
44 | jz ok |
44 | xor eax,eax |
45 | xor eax,eax |
45 | jmp try_end |
46 | jmp try_end |
46 | ok=$ |
47 | ok=$ |
47 | xor eax,eax |
48 | xor eax,eax |
48 | inc eax |
49 | inc eax |
49 | try_end=$ |
50 | try_end=$ |
50 | } |
51 | } |
51 | macro SimpleCriticalSection name |
52 | macro SimpleCriticalSection name |
52 | { |
53 | { |
53 | ; iglobal |
54 | ; iglobal |
54 | name dd 0 |
55 | name dd 0 |
55 | dd 0 |
56 | dd 0 |
56 | name#.type=2 |
57 | name#.type=2 |
57 | ; endg |
58 | ; endg |
58 | } |
59 | } |
59 | macro WaitSimpleCriticalSection name |
60 | macro WaitSimpleCriticalSection name |
60 | { |
61 | { |
61 | local start_wait,first_wait,inc_counter,end_wait |
62 | local start_wait,first_wait,inc_counter,end_wait |
62 | push eax |
63 | push eax |
63 | mov eax,[TASK_BASE+second_base_address] |
64 | mov eax,[TASK_BASE+second_base_address] |
64 | mov eax,[eax+TASKDATA.pid] |
65 | mov eax,[eax+TASKDATA.pid] |
65 | start_wait=$ |
66 | start_wait=$ |
66 | cli |
67 | cli |
67 | cmp [name],dword 0 |
68 | cmp [name],dword 0 |
68 | jz first_wait |
69 | jz first_wait |
69 | cmp [name],eax |
70 | cmp [name],eax |
70 | jz inc_counter |
71 | jz inc_counter |
71 | sti |
72 | sti |
72 | call change_task |
73 | call change_task |
73 | jmp start_wait |
74 | jmp start_wait |
74 | first_wait=$ |
75 | first_wait=$ |
75 | mov [name],eax |
76 | mov [name],eax |
76 | mov [name+4],dword 1 |
77 | mov [name+4],dword 1 |
77 | jmp end_wait |
78 | jmp end_wait |
78 | inc_counter=$ |
79 | inc_counter=$ |
79 | inc dword [name+4] |
80 | inc dword [name+4] |
80 | end_wait=$ |
81 | end_wait=$ |
81 | sti |
82 | sti |
82 | pop eax |
83 | pop eax |
83 | } |
84 | } |
84 | macro ReleaseSimpleCriticalSection name |
85 | macro ReleaseSimpleCriticalSection name |
85 | { |
86 | { |
86 | local release_end |
87 | local release_end |
87 | dec dword [name+4] |
88 | dec dword [name+4] |
88 | jnz release_end |
89 | jnz release_end |
89 | mov [name],dword 0 |
90 | mov [name],dword 0 |
90 | release_end=$ |
91 | release_end=$ |
91 | } |
92 | } |
92 | macro TryWaitSimpleCriticalSection name ;result in eax and in flags |
93 | macro TryWaitSimpleCriticalSection name ;result in eax and in flags |
93 | { |
94 | { |
94 | local ok,try_end |
95 | local ok,try_end |
95 | mov eax,[CURRENT_TASK+second_base_address] |
96 | mov eax,[CURRENT_TASK+second_base_address] |
96 | mov eax,[eax+TASKDATA.pid] |
97 | mov eax,[eax+TASKDATA.pid] |
97 | cmp [name],eax |
98 | cmp [name],eax |
98 | jz ok |
99 | jz ok |
99 | cmp [name],0 |
100 | cmp [name],0 |
100 | jz ok |
101 | jz ok |
101 | xor eax,eax |
102 | xor eax,eax |
102 | jmp try_end |
103 | jmp try_end |
103 | ok=$ |
104 | ok=$ |
104 | xor eax,eax |
105 | xor eax,eax |
105 | inc eax |
106 | inc eax |
106 | try_end=$ |
107 | try_end=$ |
107 | } |
108 | } |
108 | _cli equ call MEM_HeapLock |
109 | _cli equ call MEM_HeapLock |
109 | _sti equ call MEM_HeapUnLock |
110 | _sti equ call MEM_HeapUnLock |
110 | end if |
111 | end if |