crabmeat 1.0
Loading...
Searching...
No Matches
kbase.h
1
8
9#ifndef CBM_KERNEL_H_
10#define CBM_KERNEL_H_
11
12#include "crabmeat-common.h"
13#include "time/cbm_time.h"
14#include "comm/cbm_comm.h"
15
16#include "kernel/kobject.h"
17#include "kernel/ksetup.h"
18#include "kernel/kstats.h"
19
20#include "cfgfile/cbm_cfgfile.h"
21
22namespace cbm {
23
24class public_state_t;
25class io_kcomm_t;
26struct request_t;
27struct reply_t;
28
29enum RunLevel
30{
31 RL_NONE = -1,
32
33 RL_CREATE = 0,
34 RL_CONFIGURE,
35 RL_REGISTERPORTS,
36 RL_INITIALIZE,
37
38#define RL_LoopStart RL_READ
39 RL_READ, /*input refresh*/
40 RL_SOLVE, /*rate calculations */
41 RL_INTEGRATE, /*state update*/
42 RL_WRITE, /*stream output*/
43#define RL_LoopEnd RL_WRITE
44
45 RL_FINALIZE,
46 RL_UNREGISTERPORTS,
47 RL_DESTROY,
48
49 RL_ALL
50};
51
52struct RunLevelFlags
53{
54 bool terminate:1;
55 bool skip:1;
56 bool drop:1;
57 bool error:1;
58 int prio:4; /* (low) -7, .., 0, .., 7 (high) */
59
60 bool usr1:1;
61 bool usr2:1;
62};
63
64struct RunLevelArgs
65{
66 RunLevelArgs( RunLevel _rl=RL_NONE)
67 : iokcomm( NULL),
68 cfg( NULL), clk( NULL),
69 kcfg( NULL), ptr( NULL),
70 sse( -1), nextcall_sse( -1),
71 rl( _rl), nextcall_rl( RL_NONE)
72 {
73 this->dT.q = this->nextcall_dT.q = -1;
74 this->dT.unit = this->nextcall_dT.unit = '-';
75
76 this->flags.terminate = 0;
77 this->flags.skip = 0;
78 this->flags.drop = 0;
79 this->flags.error = 0;
80 this->flags.prio = 0;
81
82 this->flags.usr1 = 0;
83 this->flags.usr2 = 0;
84 }
85 cbm::io_kcomm_t * iokcomm;
86 cbm::config_file_t const * cfg; /*configuration file*/
87 cbm::sclock_t const * clk; /* TODO use sse instead*/
88
89 char const * kcfg; /*nul-terminated json formatted string*/
90 void * ptr; /*arbitrary data in local memory*/
91
92 /*kernel feedback (nextcall_*)*/
93 cbm::dT_t dT, nextcall_dT; /*current/next time step size*/
94 cbm::td_scalar_t sse, nextcall_sse; /*current/next execution time step*/
95 RunLevel rl, nextcall_rl; /*current/next execution runlevel*/
96
97 cbm::RunLevelFlags flags;
98};
99
100class kernel_t;
101struct CBM_API CBM_KernelTask
102{
103 virtual ~CBM_KernelTask() = 0;
104 virtual RunLevel runlevel() const = 0;
105 virtual lerr_t execute( kernel_t *, RunLevelArgs *) = 0;
106};
107template < RunLevel _RunLevel >
108struct CBM_KernelRunLevelTask : CBM_KernelTask
109{
110 RunLevel runlevel() const
111 { return _RunLevel; }
112};
113struct CBM_API CBM_KernelTaskConfigure : CBM_KernelRunLevelTask<RL_CONFIGURE>
114{
115 lerr_t execute( kernel_t *, RunLevelArgs *);
116};
117struct CBM_API CBM_KernelTaskRegisterPorts : CBM_KernelRunLevelTask<RL_REGISTERPORTS>
118{
119 lerr_t execute( kernel_t *, RunLevelArgs *);
120};
121struct CBM_API CBM_KernelTaskInitialize : CBM_KernelRunLevelTask<RL_INITIALIZE>
122{
123 lerr_t execute( kernel_t *, RunLevelArgs *);
124};
125
126struct CBM_API CBM_KernelTaskRead : CBM_KernelRunLevelTask<RL_READ>
127{
128 lerr_t execute( kernel_t *, RunLevelArgs *);
129};
130struct CBM_API CBM_KernelTaskSolve : CBM_KernelRunLevelTask<RL_SOLVE>
131{
132 lerr_t execute( kernel_t *, RunLevelArgs *);
133};
134struct CBM_API CBM_KernelTaskIntegrate : CBM_KernelRunLevelTask<RL_INTEGRATE>
135{
136 lerr_t execute( kernel_t *, RunLevelArgs *);
137};
138struct CBM_API CBM_KernelTaskWrite : CBM_KernelRunLevelTask<RL_WRITE>
139{
140 lerr_t execute( kernel_t *, RunLevelArgs *);
141};
142
143struct CBM_API CBM_KernelTaskUnregisterPorts : CBM_KernelRunLevelTask<RL_UNREGISTERPORTS>
144{
145 lerr_t execute( kernel_t *, RunLevelArgs *);
146};
147struct CBM_API CBM_KernelTaskFinalize : CBM_KernelRunLevelTask<RL_FINALIZE>
148{
149 lerr_t execute( kernel_t *, RunLevelArgs *);
150};
151
152class CBM_API kernel_t : public kernel_object_t
153{
154 CBM_KernelTask * tasks[RL_ALL];
155public:
156 void set_runlevel_task( RunLevel, CBM_KernelTask *);
157 lerr_t execute_runlevel( RunLevelArgs *);
158
159public:
160 virtual char const * name() const = 0;
161 virtual char const * ID() const = 0;
162 virtual char const * model_name()
163 const { return this->name(); }
164
165#ifdef CRABMEAT_KERNEL_STATISTICS
166public:
167 cbm::resources_statistics_t stats;
168#endif
169
170protected:
171 kernel_t();
172public:
173 virtual ~kernel_t() = 0;
174
175public:
177 virtual lerr_t configure( RunLevelArgs *)
178 { return LDNDC_ERR_OK; }
180 virtual lerr_t register_ports( RunLevelArgs *)
181 { return LDNDC_ERR_OK; }
183 virtual lerr_t initialize( RunLevelArgs *)
184 { return LDNDC_ERR_OK; }
185
187 virtual lerr_t read( RunLevelArgs *)
188 { return LDNDC_ERR_OK; }
190 virtual lerr_t solve( RunLevelArgs *)
191 { return LDNDC_ERR_OK; }
193 virtual lerr_t integrate( RunLevelArgs *)
194 { return LDNDC_ERR_OK; }
196 virtual lerr_t write( RunLevelArgs *)
197 { return LDNDC_ERR_OK; }
198
200 virtual lerr_t finalize( RunLevelArgs *)
201 { return LDNDC_ERR_OK; }
203 virtual lerr_t unregister_ports( RunLevelArgs *)
204 { return LDNDC_ERR_OK; }
205
206public:
207 virtual int process_request(
208 reply_t *, request_t const *)
209 { return 1; }
210 virtual int query_feature( char ** /*result buffer*/,
211 char const * /*query*/)
212 { return -1; }
213
214#ifdef CRABMEAT_OUTPUTS_SERIALIZE
215 virtual int create_checkpoint()
216 { return 0; }
217 virtual int restore_checkpoint( ldate_t)
218 { return 0; }
219#endif
220
221 cbm::ksetup_t setup_parser( char const * /*input*/,
222 char const * = NULL /*kernel ID (use own if NULL)*/);
223
224
225public: /*status*/
226 bool is_active() const
227 { return this->m_status == 0; }
228 void deactivate()
229 { this->m_status = 1; }
230private:
231 int m_status;
232
233public: /*rank*/
234 int rank() const
235 { return this->m_rank; }
236 void rank( int _rank)
237 { this->m_rank = _rank; }
238private:
239 int m_rank;
240
241public: /*URI*/
242 cbm::uri_t const & uri() const
243 { return this->m_uri; }
244 void uri( cbm::uri_t const & _uri)
245 { this->m_uri = _uri; }
246private:
247 cbm::uri_t m_uri;
248
249private:
250 typedef lerr_t (kernel_t::*RunLevelMaintenanceTask)( RunLevelArgs *);
251 RunLevelMaintenanceTask pre_tasks[RL_ALL];
252 lerr_t pre_execute_runlevel( RunLevelArgs *);
253 RunLevelMaintenanceTask post_tasks[RL_ALL];
254 lerr_t post_execute_runlevel( RunLevelArgs *);
256 lerr_t pre_configure( RunLevelArgs *);
257 lerr_t post_configure( RunLevelArgs *);
259 lerr_t pre_register_ports( RunLevelArgs *);
260 lerr_t post_register_ports( RunLevelArgs *);
262 lerr_t pre_initialize( RunLevelArgs *);
263 lerr_t post_initialize( RunLevelArgs *);
264
266 lerr_t pre_read( RunLevelArgs *);
267 lerr_t post_read( RunLevelArgs *);
269 lerr_t pre_solve( RunLevelArgs *);
270 lerr_t post_solve( RunLevelArgs *);
272 lerr_t pre_integrate( RunLevelArgs *);
273 lerr_t post_integrate( RunLevelArgs *);
275 lerr_t pre_write( RunLevelArgs *);
276 lerr_t post_write( RunLevelArgs *);
277
279 lerr_t pre_finalize( RunLevelArgs *);
280 lerr_t post_finalize( RunLevelArgs *);
282 lerr_t pre_unregister_ports( RunLevelArgs *);
283 lerr_t post_unregister_ports( RunLevelArgs *);
284
285};
286
287} /* namespace cbm */
288
289#define CBM_KERNEL_LINKME(__name__) int ldndc_kernel_force_link_##__name__ = 0;
290#define CBM_KERNEL_LINKIT(__name__) void ldndc_kernel_force_link_function_##__name__( void) { extern int ldndc_kernel_force_link_##__name__; ldndc_kernel_force_link_##__name__ = 1; }
291
292#endif /* !CBM_KERNEL_H_ */
293
The "Service Registry" holds information about available services (e.g., models, readers,...
Definition Lresources.h:51