-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsemaphor.cpp
156 lines (117 loc) · 2.1 KB
/
semaphor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
* semaphor.cpp
*
* Created on: Aug 23, 2018
* Author: OS1
*/
#include "semaphor.h"
#include <dos.h>
#include "System.h"
Semaphore::Semaphore(int init) {
System::softLock();
semConstructorArgs* constructorArgs = new Semaphore::semConstructorArgs(init,this);
System::softUnlock();
#ifndef BCC_BLOCK_IGNORE
unsigned argSeg = FP_SEG(constructorArgs);
unsigned argOff = FP_OFF(constructorArgs);
asm {
push dx
push ax
push bx
mov dx, 6h
mov ax, argSeg
mov bx, argOff
int 61h
pop bx
pop ax
pop dx
}
#endif
System::softLock();
delete constructorArgs;
System::softUnlock();
}
void Semaphore::signal() {
unsigned id = this->myKernelSemID;
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push cx
mov dx, 9h
mov cx, id
int 61h
pop cx
pop dx
}
#endif
}
int Semaphore::val() const {
int *retValue = new int ;
unsigned id = this->myKernelSemID;
#ifndef BCC_BLOCK_IGNORE
unsigned retValueSeg = FP_SEG(retValue);
unsigned retValueOff = FP_OFF(retValue);
asm {
push dx
push cx
push ax
push bx
mov dx, 7h
mov cx, id
mov ax, retValueSeg
mov bx, retValueOff
int 61h
pop bx
pop ax
pop cx
pop dx
}
#endif
int ret = *retValue;
delete retValue;
return ret;
}
int Semaphore::wait(int toBlock) {
System::softLock();
Semaphore::semWaitArgs* semWait = new semWaitArgs(toBlock);
System::softUnlock();
unsigned id = this->myKernelSemID;
#ifndef BCC_BLOCK_IGNORE
unsigned semWaitSeg = FP_SEG(semWait);
unsigned semWaitOff = FP_OFF(semWait);
asm {
push dx
push cx
push ax
push bx
mov dx, 8h
mov cx, id
mov ax, semWaitSeg
mov bx, semWaitOff
int 61h
pop bx
pop ax
pop cx
pop dx
}
#endif
int ret = semWait->ret;
System::softLock();
delete semWait;
System::softUnlock();
return ret;
}
Semaphore::~Semaphore() {
unsigned id = this->myKernelSemID;
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push cx
mov dx, 000ah
mov cx, id
int 61h
pop cx
pop dx
}
#endif
}