Xenomai 3.3.2
Loading...
Searching...
No Matches
task.h
1/*
2 * Copyright (C) 2011 Philippe Gerum <rpm@xenomai.org>.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17 */
18#ifndef _XENOMAI_ALCHEMY_TASK_H
19#define _XENOMAI_ALCHEMY_TASK_H
20
21#include <sys/types.h>
22#include <stdint.h>
23#include <xeno_config.h>
24#include <boilerplate/list.h>
25#include <copperplate/threadobj.h>
26#include <alchemy/timer.h>
27#include <alchemy/compat.h>
28
35#define T_LOPRIO 0
36#define T_HIPRIO 99
37
39#define T_LOCK __THREAD_M_LOCK
41#define T_WARNSW __THREAD_M_WARNSW
42#define T_CONFORMING __THREAD_M_CONFORMING
43#define T_JOINABLE __THREAD_M_SPARE0
44
45struct RT_TASK {
46 uintptr_t handle;
47 pthread_t thread;
48};
49
50typedef struct RT_TASK RT_TASK;
51
52struct RT_TASK_MCB {
53 int flowid;
54 int opcode;
55 union {
56 dref_type(void *) __dref;
57 void *data;
58 };
59 ssize_t size;
60};
61
62typedef struct RT_TASK_MCB RT_TASK_MCB;
63
75 int prio;
79 struct threadobj_stat stat;
83 char name[XNOBJECT_NAME_LEN];
87 pid_t pid;
88};
89
90typedef struct RT_TASK_INFO RT_TASK_INFO;
91
92#define NO_ALCHEMY_TASK ((RT_TASK){ 0, 0 })
93
94#ifdef __cplusplus
95extern "C" {
96#endif
97
98CURRENT_DECL(int, rt_task_create(RT_TASK *task,
99 const char *name,
100 int stksize,
101 int prio,
102 int mode));
103
104int rt_task_delete(RT_TASK *task);
105
106int rt_task_set_affinity(RT_TASK *task,
107 const cpu_set_t *cpus);
108
109int rt_task_start(RT_TASK *task,
110 void (*entry)(void *arg),
111 void *arg);
112
113CURRENT_DECL(int, rt_task_spawn(RT_TASK *task, const char *name,
114 int stksize, int prio, int mode,
115 void (*entry)(void *arg),
116 void *arg));
117
118int rt_task_shadow(RT_TASK *task,
119 const char *name,
120 int prio,
121 int mode);
122
123int rt_task_join(RT_TASK *task);
124
125CURRENT_DECL(int, rt_task_set_periodic(RT_TASK *task,
126 RTIME idate, RTIME period));
127
128int rt_task_wait_period(unsigned long *overruns_r);
129
130int rt_task_sleep(RTIME delay);
131
132int rt_task_sleep_until(RTIME date);
133
134int rt_task_same(RT_TASK *task1, RT_TASK *task2);
135
136int rt_task_suspend(RT_TASK *task);
137
138int rt_task_resume(RT_TASK *task);
139
140RT_TASK *rt_task_self(void);
141
142int rt_task_set_priority(RT_TASK *task, int prio);
143
144int rt_task_set_mode(int clrmask, int setmask,
145 int *mode_r);
146
147int rt_task_yield(void);
148
149int rt_task_unblock(RT_TASK *task);
150
151int rt_task_slice(RT_TASK *task, RTIME quantum);
152
153int rt_task_inquire(RT_TASK *task,
154 RT_TASK_INFO *info);
155
156ssize_t rt_task_send_timed(RT_TASK *task,
157 RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
158 const struct timespec *abs_timeout);
159
160static inline
161ssize_t rt_task_send_until(RT_TASK *task,
162 RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
163 RTIME timeout)
164{
165 struct timespec ts;
166 return rt_task_send_timed(task, mcb_s, mcb_r,
167 alchemy_abs_timeout(timeout, &ts));
168}
169
170static inline
171ssize_t rt_task_send(RT_TASK *task,
172 RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
173 RTIME timeout)
174{
175 struct timespec ts;
176 return rt_task_send_timed(task, mcb_s, mcb_r,
177 alchemy_rel_timeout(timeout, &ts));
178}
179
180int rt_task_receive_timed(RT_TASK_MCB *mcb_r,
181 const struct timespec *abs_timeout);
182
183static inline
184int rt_task_receive_until(RT_TASK_MCB *mcb_r, RTIME timeout)
185{
186 struct timespec ts;
187 return rt_task_receive_timed(mcb_r,
188 alchemy_abs_timeout(timeout, &ts));
189}
190
191static inline
192int rt_task_receive(RT_TASK_MCB *mcb_r, RTIME timeout)
193{
194 struct timespec ts;
195 return rt_task_receive_timed(mcb_r,
196 alchemy_rel_timeout(timeout, &ts));
197}
198
199int rt_task_reply(int flowid,
200 RT_TASK_MCB *mcb_s);
201
202int rt_task_bind(RT_TASK *task,
203 const char *name, RTIME timeout);
204
205int rt_task_unbind(RT_TASK *task);
206
207#ifdef __cplusplus
208}
209#endif
210
213#endif /* _XENOMAI_ALCHEMY_TASK_H */
int rt_task_create(RT_TASK *task, const char *name, int stksize, int prio, int mode)
Create a task with Alchemy personality.
Definition task.c:415
int rt_task_sleep_until(RTIME date)
Delay the current real-time task (with absolute wakeup date).
Definition task.c:970
ssize_t rt_task_send_timed(RT_TASK *task, RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r, const struct timespec *abs_timeout)
Send a message to a real-time task.
Definition task.c:1725
int rt_task_wait_period(unsigned long *overruns_r)
Wait for the next periodic release point.
Definition task.c:930
int rt_task_resume(RT_TASK *task)
Resume a real-time task.
Definition task.c:1192
int rt_task_unbind(RT_TASK *task)
Unbind from a task.
Definition task.c:2182
int rt_task_yield(void)
Manual round-robin.
Definition task.c:1319
int rt_task_set_priority(RT_TASK *task, int prio)
Change the base priority of a real-time task.
Definition task.c:1272
int rt_task_start(RT_TASK *task, void(*entry)(void *arg), void *arg)
Start a real-time task.
Definition task.c:626
int rt_task_inquire(RT_TASK *task, RT_TASK_INFO *info)
Retrieve information about a real-time task.
Definition task.c:1561
int rt_task_shadow(RT_TASK *task, const char *name, int prio, int mode)
Turn caller into a real-time task.
Definition task.c:724
static ssize_t rt_task_send_until(RT_TASK *task, RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r, RTIME timeout)
Send a message to a real-time task (with absolute scalar timeout).
Definition task.h:161
int rt_task_unblock(RT_TASK *task)
Unblock a real-time task.
Definition task.c:1350
RT_TASK * rt_task_self(void)
Retrieve the current task descriptor.
Definition task.c:1226
int rt_task_join(RT_TASK *task)
Wait on the termination of a real-time task.
Definition task.c:542
static int rt_task_receive(RT_TASK_MCB *mcb_r, RTIME timeout)
Receive a message from a real-time task (with relative scalar timeout).
Definition task.h:192
int rt_task_set_mode(int clrmask, int setmask, int *mode_r)
Change the current task mode.
Definition task.c:1505
int rt_task_slice(RT_TASK *task, RTIME quantum)
Set a task's round-robin quantum.
Definition task.c:1405
int rt_task_suspend(RT_TASK *task)
Suspend a real-time task.
Definition task.c:1148
static ssize_t rt_task_send(RT_TASK *task, RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r, RTIME timeout)
Send a message to a real-time task (with relative scalar timeout).
Definition task.h:171
int rt_task_spawn(RT_TASK *task, const char *name, int stksize, int prio, int mode, void(*entry)(void *arg), void *arg)
Create and start a real-time task.
Definition task.c:1070
static int rt_task_receive_until(RT_TASK_MCB *mcb_r, RTIME timeout)
Receive a message from a real-time task (with absolute scalar timeout).
Definition task.h:184
int rt_task_bind(RT_TASK *task, const char *name, RTIME timeout)
Bind to a task.
Definition task.c:2160
int rt_task_delete(RT_TASK *task)
Delete a real-time task.
Definition task.c:484
int rt_task_set_periodic(RT_TASK *task, RTIME idate, RTIME period)
Make a real-time task periodic.
Definition task.c:840
int rt_task_reply(int flowid, RT_TASK_MCB *mcb_s)
Reply to a remote task message.
Definition task.c:2048
int rt_task_sleep(RTIME delay)
Delay the current real-time task (with relative delay).
Definition task.c:1012
int rt_task_set_affinity(RT_TASK *task, const cpu_set_t *cpus)
Set CPU affinity of real-time task.
Definition task.c:577
int rt_task_receive_timed(RT_TASK_MCB *mcb_r, const struct timespec *abs_timeout)
Receive a message from a real-time task.
Definition task.c:1929
int rt_task_same(RT_TASK *task1, RT_TASK *task2)
Compare real-time task descriptors.
Definition task.c:1101
Task status descriptor .
Definition task.h:71
char name[XNOBJECT_NAME_LEN]
Name of task.
Definition task.h:83
int prio
Task priority.
Definition task.h:75
pid_t pid
Host pid.
Definition task.h:87
struct threadobj_stat stat
Task status.
Definition task.h:79