hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
/*
 * Copyright (C) 2011 Philippe Gerum <rpm@xenomai.org>.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#ifndef _XENOMAI_ALCHEMY_TASK_H
#define _XENOMAI_ALCHEMY_TASK_H
 
#include <sys/types.h>
#include <stdint.h>
#include <xeno_config.h>
#include <boilerplate/list.h>
#include <copperplate/threadobj.h>
#include <alchemy/timer.h>
#include <alchemy/compat.h>
 
/**
 * @addtogroup alchemy_task
 * @{
 */
 
/** Task priorities. */
#define T_LOPRIO  0
#define T_HIPRIO  99
 
/** Task mode bits. */
#define T_LOCK        __THREAD_M_LOCK
/** Cobalt only, nop over Mercury. */
#define T_WARNSW    __THREAD_M_WARNSW
#define T_CONFORMING    __THREAD_M_CONFORMING
#define T_JOINABLE    __THREAD_M_SPARE0
 
struct RT_TASK {
   uintptr_t handle;
   pthread_t thread;
};
 
typedef struct RT_TASK RT_TASK;
 
struct RT_TASK_MCB {
   int flowid;
   int opcode;
   union {
       dref_type(void *) __dref;
       void *data;
   };
   ssize_t size;
};
 
typedef struct RT_TASK_MCB RT_TASK_MCB;
 
/**
 * @brief Task status descriptor
 * @anchor RT_TASK_INFO
 *
 * This structure reports various static and runtime information about
 * a real-time task, returned by a call to rt_task_inquire().
 */
struct RT_TASK_INFO {
   /**
    * Task priority.
    */
   int prio;
   /**
    * Task status.
    */
   struct threadobj_stat stat;
   /**
    * Name of task.
    */
   char name[XNOBJECT_NAME_LEN];
   /**
    * Host pid.
    */
   pid_t pid;
};
 
typedef struct RT_TASK_INFO RT_TASK_INFO;
 
#define NO_ALCHEMY_TASK    ((RT_TASK){ 0, 0 })
 
#ifdef __cplusplus
extern "C" {
#endif
 
CURRENT_DECL(int, rt_task_create(RT_TASK *task,
                const char *name,
                int stksize,
                int prio,
                int mode));
 
int rt_task_delete(RT_TASK *task);
 
int rt_task_set_affinity(RT_TASK *task,
            const cpu_set_t *cpus);
 
int rt_task_start(RT_TASK *task,
         void (*entry)(void *arg),
         void *arg);
 
CURRENT_DECL(int, rt_task_spawn(RT_TASK *task, const char *name,
               int stksize, int prio, int mode,
               void (*entry)(void *arg),
               void *arg));
 
int rt_task_shadow(RT_TASK *task,
          const char *name,
          int prio,
          int mode);
 
int rt_task_join(RT_TASK *task);
 
CURRENT_DECL(int, rt_task_set_periodic(RT_TASK *task,
                      RTIME idate, RTIME period));
 
int rt_task_wait_period(unsigned long *overruns_r);
 
int rt_task_sleep(RTIME delay);
 
int rt_task_sleep_until(RTIME date);
 
int rt_task_same(RT_TASK *task1, RT_TASK *task2);
 
int rt_task_suspend(RT_TASK *task);
 
int rt_task_resume(RT_TASK *task);
 
RT_TASK *rt_task_self(void);
 
int rt_task_set_priority(RT_TASK *task, int prio);
 
int rt_task_set_mode(int clrmask, int setmask,
            int *mode_r);
 
int rt_task_yield(void);
 
int rt_task_unblock(RT_TASK *task);
 
int rt_task_slice(RT_TASK *task, RTIME quantum);
 
int rt_task_inquire(RT_TASK *task,
           RT_TASK_INFO *info);
 
ssize_t rt_task_send_timed(RT_TASK *task,
              RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
              const struct timespec *abs_timeout);
 
static inline
ssize_t rt_task_send_until(RT_TASK *task,
              RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
              RTIME timeout)
{
   struct timespec ts;
   return rt_task_send_timed(task, mcb_s, mcb_r,
                 alchemy_abs_timeout(timeout, &ts));
}
 
static inline
ssize_t rt_task_send(RT_TASK *task,
            RT_TASK_MCB *mcb_s, RT_TASK_MCB *mcb_r,
            RTIME timeout)
{
   struct timespec ts;
   return rt_task_send_timed(task, mcb_s, mcb_r,
                 alchemy_rel_timeout(timeout, &ts));
}
 
int rt_task_receive_timed(RT_TASK_MCB *mcb_r,
             const struct timespec *abs_timeout);
 
static inline
int rt_task_receive_until(RT_TASK_MCB *mcb_r, RTIME timeout)
{
   struct timespec ts;
   return rt_task_receive_timed(mcb_r,
                    alchemy_abs_timeout(timeout, &ts));
}
 
static inline
int rt_task_receive(RT_TASK_MCB *mcb_r, RTIME timeout)
{
   struct timespec ts;
   return rt_task_receive_timed(mcb_r,
                    alchemy_rel_timeout(timeout, &ts));
}
 
int rt_task_reply(int flowid,
         RT_TASK_MCB *mcb_s);
 
int rt_task_bind(RT_TASK *task,
        const char *name, RTIME timeout);
 
int rt_task_unbind(RT_TASK *task);
 
#ifdef __cplusplus
}
#endif
 
/** @} */
 
#endif /* _XENOMAI_ALCHEMY_TASK_H */