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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
|
#include <proto/exec.h>
#include <devices/timer.h>
#ifndef OF_AMIGAOS4
# include <clib/alib_protos.h>
#endif
int
of_condition_new(of_condition_t *condition)
OFPlainConditionNew(OFPlainCondition *condition)
{
condition->waitingTasks = NULL;
return 0;
}
int
of_condition_signal(of_condition_t *condition)
OFPlainConditionSignal(OFPlainCondition *condition)
{
Forbid();
@try {
if (condition->waitingTasks == NULL)
return 0;
Signal(condition->waitingTasks->task,
(1ul << condition->waitingTasks->sigBit));
condition->waitingTasks = condition->waitingTasks->next;
} @finally {
Permit();
}
return 0;
}
int
of_condition_broadcast(of_condition_t *condition)
OFPlainConditionBroadcast(OFPlainCondition *condition)
{
Forbid();
@try {
if (condition->waitingTasks == NULL)
return 0;
while (condition->waitingTasks != NULL) {
Signal(condition->waitingTasks->task,
(1ul << condition->waitingTasks->sigBit));
condition->waitingTasks = condition->waitingTasks->next;
}
} @finally {
Permit();
}
return 0;
}
int
of_condition_wait(of_condition_t *condition, OFPlainMutex *mutex)
OFPlainConditionWait(OFPlainCondition *condition, OFPlainMutex *mutex)
{
ULONG signalMask = 0;
return of_condition_wait_or_signal(condition, mutex, &signalMask);
return OFPlainConditionWaitOrExecSignal(condition, mutex, &signalMask);
}
int
of_condition_wait_or_signal(of_condition_t *condition, OFPlainMutex *mutex,
ULONG *signalMask)
OFPlainConditionWaitOrExecSignal(OFPlainCondition *condition,
OFPlainMutex *mutex, ULONG *signalMask)
{
struct of_condition_waiting_task waitingTask = {
struct OFPlainConditionWaitingTask waitingTask = {
.task = FindTask(NULL),
.sigBit = AllocSignal(-1)
};
int error = 0;
ULONG mask;
if (waitingTask.sigBit == -1)
|
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
|
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
|
-
+
-
+
-
+
-
+
|
Permit();
return error;
}
int
of_condition_timed_wait(of_condition_t *condition, OFPlainMutex *mutex,
OFPlainConditionTimedWait(OFPlainCondition *condition, OFPlainMutex *mutex,
OFTimeInterval timeout)
{
ULONG signalMask = 0;
return of_condition_timed_wait_or_signal(condition, mutex, timeout,
return OFPlainConditionTimedWaitOrExecSignal(condition, mutex, timeout,
&signalMask);
}
int
of_condition_timed_wait_or_signal(of_condition_t *condition,
OFPlainConditionTimedWaitOrExecSignal(OFPlainCondition *condition,
OFPlainMutex *mutex, OFTimeInterval timeout, ULONG *signalMask)
{
struct of_condition_waiting_task waitingTask = {
struct OFPlainConditionWaitingTask waitingTask = {
.task = FindTask(NULL),
.sigBit = AllocSignal(-1)
};
struct MsgPort port = {
.mp_Node = {
.ln_Type = NT_MSGPORT
},
|
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
-
+
|
if (port.mp_SigBit != -1)
FreeSignal(port.mp_SigBit);
return error;
}
int
of_condition_free(of_condition_t *condition)
OFPlainConditionFree(OFPlainCondition *condition)
{
Forbid();
@try {
if (condition->waitingTasks != NULL)
return EBUSY;
} @finally {
Permit();
}
return 0;
}
|