00001
00022 #ifndef _XENO_TASK_H
00023 #define _XENO_TASK_H
00024
00025 #include <nucleus/core.h>
00026 #include <nucleus/thread.h>
00027 #include <native/types.h>
00028
00029
00030 #define T_FPU XNFPU
00031 #define T_SUSP XNSUSP
00032
00033 #define T_CPU(cpu) (1 << (24 + (cpu & 7)))
00034 #define T_CPUMASK 0xff000000
00035
00043 #define T_BLOCKED XNPEND
00044 #define T_DELAYED XNDELAY
00045 #define T_READY XNREADY
00046 #define T_DORMANT XNDORMANT
00047 #define T_STARTED XNSTARTED
00048 #define T_BOOST XNBOOST
00049 #define T_LOCK XNLOCK
00050 #define T_RRB XNRRB
00051 #define T_NOSIG XNASDI
00052 #define T_SHIELD XNSHIELD
00053 #define T_WARNSW XNTRAPSW
00054 #define T_RPIOFF XNRPIOFF
00055 #define T_PRIMARY 0x00000200
00056 #define T_JOINABLE 0x00000400
00057
00058
00059
00060 #define T_HOOK_START XNHOOK_THREAD_START
00061 #define T_HOOK_SWITCH XNHOOK_THREAD_SWITCH
00062 #define T_HOOK_DELETE XNHOOK_THREAD_DELETE
00063 #define T_DESC(cookie) thread2rtask(cookie)
00064
00065
00066 #define T_LOPRIO XNCORE_LOW_PRIO
00067 #define T_HIPRIO XNCORE_HIGH_PRIO
00068
00069 typedef struct rt_task_placeholder {
00070 xnhandle_t opaque;
00071 unsigned long opaque2;
00072 } RT_TASK_PLACEHOLDER;
00073
00074 struct rt_queue_msg;
00075 struct rt_task;
00076
00081 typedef struct rt_task_info {
00082
00083 int bprio;
00085 int cprio;
00087 unsigned status;
00089 RTIME relpoint;
00091 char name[XNOBJECT_NAME_LEN];
00093 RTIME exectime;
00095 int modeswitches;
00097 int ctxswitches;
00099 int pagefaults;
00101 } RT_TASK_INFO;
00102
00103 #define RT_MCB_FSTORE_LIMIT 64
00104
00108 typedef struct rt_task_mcb {
00109
00110 int flowid;
00112 int opcode;
00114 caddr_t data;
00116 size_t size;
00118 } RT_TASK_MCB;
00119
00120 #if (defined(__KERNEL__) || defined(__XENO_SIM__)) && !defined(DOXYGEN_CPP)
00121
00122 #include <nucleus/synch.h>
00123
00124 #define XENO_TASK_MAGIC 0x55550101
00125
00126 typedef struct rt_task {
00127
00128 unsigned magic;
00129
00130 xnholder_t link;
00131
00132 #define link2rtask(ln) container_of(ln, RT_TASK, link)
00133
00134 xnthread_t thread_base;
00135
00136 char rname[XNOBJECT_NAME_LEN];
00137
00138 int suspend_depth;
00139
00140 int overrun;
00141
00142 xnsynch_t safesynch;
00143
00144 u_long safelock;
00145
00146 u_long cstamp;
00147
00148 xnarch_cpumask_t affinity;
00149
00150 union {
00151
00152 struct {
00153 int mode;
00154 unsigned long mask;
00155 } event;
00156
00157 struct rt_queue_msg *qmsg;
00158
00159 struct {
00160 size_t size;
00161 void *block;
00162 } heap;
00163
00164 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00165 struct {
00166 RT_TASK_MCB mcb_s;
00167 RT_TASK_MCB mcb_r;
00168 } mps;
00169 #endif
00170
00171 } wait_args;
00172
00173 #ifdef CONFIG_XENO_OPT_NATIVE_MPS
00174 xnsynch_t mrecv,
00175 msendq;
00176
00177 int flowgen;
00178 #endif
00179
00180 } RT_TASK;
00181
00182 static inline RT_TASK *thread2rtask (xnthread_t *t)
00183 {
00184 return t ? container_of(t, RT_TASK, thread_base) : NULL;
00185 }
00186
00187 #define xeno_current_task() thread2rtask(xnpod_current_thread())
00188
00189 #ifdef __cplusplus
00190 extern "C" {
00191 #endif
00192
00193 void __native_task_safe(RT_TASK *task);
00194
00195 void __native_task_unsafe(RT_TASK *task);
00196
00197 int __native_task_safewait(RT_TASK *task);
00198
00199 int __native_task_pkg_init(void);
00200
00201 void __native_task_pkg_cleanup(void);
00202
00203
00204
00205 int rt_task_add_hook(int type,
00206 void (*routine)(void *cookie));
00207
00208 int rt_task_remove_hook(int type,
00209 void (*routine)(void *cookie));
00210
00211 int rt_task_catch(void (*handler)(rt_sigset_t));
00212
00213 #ifdef __cplusplus
00214 }
00215 #endif
00216
00217 #else
00218
00219 typedef RT_TASK_PLACEHOLDER RT_TASK;
00220
00221 #ifdef __cplusplus
00222 extern "C" {
00223 #endif
00224
00225 int rt_task_shadow(RT_TASK *task,
00226 const char *name,
00227 int prio,
00228 int mode);
00229
00230 int rt_task_bind(RT_TASK *task,
00231 const char *name,
00232 RTIME timeout);
00233
00234 static inline int rt_task_unbind (RT_TASK *task)
00235
00236 {
00237 task->opaque = XN_NO_HANDLE;
00238 return 0;
00239 }
00240
00241 int rt_task_join(RT_TASK *task);
00242
00243 #ifdef __cplusplus
00244 }
00245 #endif
00246
00247 #endif
00248
00249 #ifdef __cplusplus
00250 extern "C" {
00251 #endif
00252
00253
00254
00255 int rt_task_create(RT_TASK *task,
00256 const char *name,
00257 int stksize,
00258 int prio,
00259 int mode);
00260
00261 int rt_task_start(RT_TASK *task,
00262 void (*fun)(void *cookie),
00263 void *cookie);
00264
00265 int rt_task_suspend(RT_TASK *task);
00266
00267 int rt_task_resume(RT_TASK *task);
00268
00269 int rt_task_delete(RT_TASK *task);
00270
00271 int rt_task_yield(void);
00272
00273 int rt_task_set_periodic(RT_TASK *task,
00274 RTIME idate,
00275 RTIME period);
00276
00277 int rt_task_wait_period(unsigned long *overruns_r);
00278
00279 int rt_task_set_priority(RT_TASK *task,
00280 int prio);
00281
00282 int rt_task_sleep(RTIME delay);
00283
00284 int rt_task_sleep_until(RTIME date);
00285
00286 int rt_task_unblock(RT_TASK *task);
00287
00288 int rt_task_inquire(RT_TASK *task,
00289 RT_TASK_INFO *info);
00290
00291 int rt_task_notify(RT_TASK *task,
00292 rt_sigset_t signals);
00293
00294 int rt_task_set_mode(int clrmask,
00295 int setmask,
00296 int *mode_r);
00297
00298 RT_TASK *rt_task_self(void);
00299
00300 int rt_task_slice(RT_TASK *task,
00301 RTIME quantum);
00302
00303 ssize_t rt_task_send(RT_TASK *task,
00304 RT_TASK_MCB *mcb_s,
00305 RT_TASK_MCB *mcb_r,
00306 RTIME timeout);
00307
00308 int rt_task_receive(RT_TASK_MCB *mcb_r,
00309 RTIME timeout);
00310
00311 int rt_task_reply(int flowid,
00312 RT_TASK_MCB *mcb_s);
00313
00314 static inline int rt_task_spawn(RT_TASK *task,
00315 const char *name,
00316 int stksize,
00317 int prio,
00318 int mode,
00319 void (*entry)(void *cookie),
00320 void *cookie)
00321 {
00322 int err = rt_task_create(task,name,stksize,prio,mode);
00323
00324 if (!err)
00325 err = rt_task_start(task,entry,cookie);
00326
00327 return err;
00328 }
00329
00330 #ifdef __cplusplus
00331 }
00332 #endif
00333
00334 #endif