/
scheduler.h
219 lines (188 loc) · 7.33 KB
/
scheduler.h
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/* scheduler.h
* Copyright (C) 2007, Parrot Foundation.
* Overview:
* Parrot concurrency scheduler header stuff
* Data Structure and Algorithms:
* History:
* Notes:
* References:
*/
#ifndef PARROT_SCHEDULER_H_GUARD
#define PARROT_SCHEDULER_H_GUARD
#include "parrot/parrot.h"
#define PARROT_TASK_SWITCH_QUANTUM 0.02
/* HEADERIZER BEGIN: src/scheduler.c */
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
PARROT_EXPORT
void Parrot_cx_begin_execution(PARROT_INTERP,
ARGIN(PMC *main),
ARGIN(PMC *argv))
__attribute__nonnull__(1)
__attribute__nonnull__(2)
__attribute__nonnull__(3);
PARROT_EXPORT
void Parrot_cx_check_alarms(PARROT_INTERP, ARGIN(PMC *scheduler))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
PARROT_CANNOT_RETURN_NULL
PARROT_EXPORT
opcode_t* Parrot_cx_run_scheduler(PARROT_INTERP,
ARGIN(PMC *scheduler),
ARGIN(opcode_t *next))
__attribute__nonnull__(1)
__attribute__nonnull__(2)
__attribute__nonnull__(3);
PARROT_EXPORT
void Parrot_cx_schedule_immediate(PARROT_INTERP, ARGIN(PMC *task_or_sub))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
PARROT_EXPORT
PARROT_WARN_UNUSED_RESULT
PARROT_CAN_RETURN_NULL
opcode_t * Parrot_cx_schedule_sleep(PARROT_INTERP,
FLOATVAL time,
ARGIN_NULLOK(opcode_t *next))
__attribute__nonnull__(1);
PARROT_EXPORT
void Parrot_cx_schedule_task(PARROT_INTERP, ARGIN(PMC *task_or_sub))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
PARROT_EXPORT
void Parrot_cx_send_message(PARROT_INTERP,
ARGIN(STRING *messagetype),
ARGIN(PMC *payload))
__attribute__nonnull__(1)
__attribute__nonnull__(2)
__attribute__nonnull__(3);
PARROT_EXPORT
PARROT_CANNOT_RETURN_NULL
PMC* Parrot_cx_stop_task(PARROT_INTERP, ARGIN(opcode_t *next))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
void Parrot_cx_check_quantum(PARROT_INTERP, ARGIN(PMC *scheduler))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
PARROT_CANNOT_RETURN_NULL
opcode_t* Parrot_cx_check_scheduler(PARROT_INTERP, ARGIN(opcode_t *next))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
PARROT_CANNOT_RETURN_NULL
PARROT_PURE_FUNCTION
PMC* Parrot_cx_current_task(PARROT_INTERP)
__attribute__nonnull__(1);
void Parrot_cx_disable_preemption(PARROT_INTERP)
__attribute__nonnull__(1);
void Parrot_cx_enable_preemption(PARROT_INTERP)
__attribute__nonnull__(1);
void Parrot_cx_init_scheduler(PARROT_INTERP)
__attribute__nonnull__(1);
void Parrot_cx_next_task(PARROT_INTERP, ARGIN(PMC *scheduler))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
void Parrot_cx_outer_runloop(PARROT_INTERP)
__attribute__nonnull__(1);
PARROT_CAN_RETURN_NULL
opcode_t* Parrot_cx_preempt_task(PARROT_INTERP,
ARGIN(PMC *scheduler),
ARGIN(opcode_t *next))
__attribute__nonnull__(1)
__attribute__nonnull__(2)
__attribute__nonnull__(3);
void Parrot_cx_runloop_wake(PARROT_INTERP, ARGIN(PMC *scheduler))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
void Parrot_cx_schedule_alarm(PARROT_INTERP, ARGIN(PMC *alarm))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
void Parrot_cx_set_scheduler_alarm(PARROT_INTERP)
__attribute__nonnull__(1);
#define ASSERT_ARGS_Parrot_cx_begin_execution __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(main) \
, PARROT_ASSERT_ARG(argv))
#define ASSERT_ARGS_Parrot_cx_check_alarms __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler))
#define ASSERT_ARGS_Parrot_cx_run_scheduler __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler) \
, PARROT_ASSERT_ARG(next))
#define ASSERT_ARGS_Parrot_cx_schedule_immediate __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(task_or_sub))
#define ASSERT_ARGS_Parrot_cx_schedule_sleep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_schedule_task __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(task_or_sub))
#define ASSERT_ARGS_Parrot_cx_send_message __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(messagetype) \
, PARROT_ASSERT_ARG(payload_unused))
#define ASSERT_ARGS_Parrot_cx_stop_task __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(next))
#define ASSERT_ARGS_Parrot_cx_check_quantum __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler))
#define ASSERT_ARGS_Parrot_cx_check_scheduler __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(next))
#define ASSERT_ARGS_Parrot_cx_current_task __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_disable_preemption __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_enable_preemption __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_init_scheduler __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_next_task __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler))
#define ASSERT_ARGS_Parrot_cx_outer_runloop __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_Parrot_cx_preempt_task __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler) \
, PARROT_ASSERT_ARG(next))
#define ASSERT_ARGS_Parrot_cx_runloop_wake __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(scheduler))
#define ASSERT_ARGS_Parrot_cx_schedule_alarm __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(alarm))
#define ASSERT_ARGS_Parrot_cx_set_scheduler_alarm __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
/* HEADERIZER END: src/scheduler.c */
/* Timer PMC interface constants */
/* &gen_from_enum(timer.pasm) */
typedef enum {
PARROT_TIMER_SEC,
PARROT_TIMER_USEC,
PARROT_TIMER_NSEC,
PARROT_TIMER_REPEAT,
PARROT_TIMER_INTERVAL,
PARROT_TIMER_RUNNING,
PARROT_TIMER_HANDLER,
PARROT_TIMER_MAX,
PARROT_ALARM_TIME,
PARROT_ALARM_TASK
} parrot_timer_enum_t;
/* &end_gen */
/* Alarm PMC interface constants */
/* &gen_from_enum(alarm.pasm) */
/* TODO: Figure out how to actually gen alarm.pasm
typedef enum {
PARROT_ALARM_TIME,
PARROT_ALARM_SUB
} parrot_alarm_enum_t;
*/
/* &end_gen */
#endif /* PARROT_SCHEDULER_H_GUARD */
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
*/