-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathThread.cpp
162 lines (110 loc) · 1.85 KB
/
Thread.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
157
158
159
160
161
162
/*
* thread.cpp
*
* Created on: Aug 20, 2018
* Author: OS1
*/
#include "thread.h"
#include "System.h"
#include "symbols.h"
#include "PCB.h"
#include <dos.h>
void dispatch () {
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
mov dx, 0h
int 61h
pop dx
}
#endif
}
Thread::Thread(StackSize stacksize, Time timeSlice) {
System::softLock();
Thread::threadConstructorArgs* args = new threadConstructorArgs(stacksize,timeSlice,this);
System::softUnlock();
#ifndef BCC_BLOCK_IGNORE
unsigned argSeg = FP_SEG(args);
unsigned argOff = FP_OFF (args);
asm {
push dx
push ax
push bx
mov dx, 1h
mov ax, argSeg
mov bx, argOff
int 61h
pop bx
pop ax
pop dx
}
#endif
System::softLock();
delete args;
args = NULL;
System::softUnlock();
}
Thread::~Thread() {
unsigned id = this->pcbID;
if (System::runningKernelThread != NULL) {
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push cx
mov dx, 5h
mov cx, id
int 61h
pop cx
pop dx
}
#endif
} else {
delete PCB::getPCBbyID(this->pcbID);
}
}
void Thread::start() {
unsigned id = this->pcbID;
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push cx
mov dx, 2h
mov cx, id
int 61h
pop cx
pop dx
}
#endif
}
void Thread::threadWrapper(Thread* runningThread) {
runningThread->run();
System::exit_thread();
}
void Thread::waitToComplete() {
unsigned id = this->pcbID;
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push cx
mov dx, 3h
mov cx, id
int 61h
pop cx
pop dx
}
#endif
}
void Thread::sleep(Time timeToSleep) {
unsigned toSleep = timeToSleep+1;
#ifndef BCC_BLOCK_IGNORE
asm {
push dx
push ax
mov dx, 4h
mov ax, toSleep
int 61h
pop ax
pop dx
}
#endif
}