1 #ifndef XENOMAI_WRAPS_H
2 #define XENOMAI_WRAPS_H
5 #if !defined(XENOMAI_MAJOR)
6 #error Xenomai version not set
8 #if !defined(XENOMAI_SKIN_native) && !defined(XENOMAI_SKIN_posix)
9 #error Xenomai skin unsupported or not defined
19 #ifdef XENOMAI_SKIN_posix
22 #include <sys/socket.h>
26 int __wrap_nanosleep(
const struct timespec *req,
struct timespec *rem);
27 int __wrap_pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (
void *),
void *arg);
28 int __wrap_pthread_setschedparam(pthread_t thread,
int policy,
const struct sched_param *param);
29 int __wrap_pthread_getschedparam(pthread_t thread,
int *policy,
struct sched_param *param);
30 int __wrap_pthread_yield(
void);
32 int __wrap_pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
33 int __wrap_pthread_mutex_destroy(pthread_mutex_t *mutex);
34 int __wrap_pthread_mutex_lock(pthread_mutex_t *mutex);
35 int __wrap_pthread_mutex_trylock(pthread_mutex_t *mutex);
36 int __wrap_pthread_mutex_unlock(pthread_mutex_t *mutex);
38 int __wrap_pthread_cond_destroy(pthread_cond_t *cond);
39 int __wrap_pthread_cond_init(pthread_cond_t *cond,
const pthread_condattr_t *attr);
40 int __wrap_pthread_cond_signal(pthread_cond_t *cond);
41 int __wrap_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
43 int __wrap_socket(
int protocol_family,
int socket_type,
int protocol);
44 int __wrap_setsockopt(
int fd,
int level,
int optname,
const void *optval, socklen_t optlen);
45 int __wrap_bind(
int fd,
const struct sockaddr *my_addr, socklen_t addrlen);
46 ssize_t __wrap_sendto(
int fd,
const void *buf,
size_t len,
int flags,
const struct sockaddr *to, socklen_t tolen);
48 mqd_t __wrap_mq_open(
const char *name,
int oflags, ...);
49 int __wrap_mq_close(mqd_t mqdes);
50 ssize_t __wrap_mq_receive(mqd_t mqdes,
char *msg_ptr,
size_t msg_len,
unsigned *msg_prio);
51 int __wrap_mq_send(mqd_t mqdes,
const char *msg_ptr,
size_t msg_len,
unsigned msg_prio);
52 int __wrap_mq_unlink(
const char *name);
58 #if XENOMAI_MAJOR == 2
59 #define __wrap_pthread_join(a,b) pthread_join(a,b) // NOWRAP
60 #define __wrap_pthread_attr_init(a) pthread_attr_init(a) // NOWRAP
61 #define __wrap_sched_get_priority_max(a) sched_get_priority_max(a) // NOWRAP
63 #if XENOMAI_MAJOR == 3
64 int __wrap_pthread_join(pthread_t thread,
void **retval);
65 int __wrap_pthread_attr_init(pthread_attr_t *attr);
66 int __wrap_sched_get_priority_max(
int policy);
70 #ifdef XENOMAI_SKIN_native
71 #include <native/task.h>
72 typedef RTIME time_ns_t;
74 #ifdef XENOMAI_SKIN_posix
75 #if XENOMAI_MAJOR == 3
78 #include <rtdm/rtipc.h>
80 typedef long long int time_ns_t;
81 typedef void *(pthread_callback_t)(
void *);
84 inline int task_sleep_ns(
long long int timens)
86 #ifdef XENOMAI_SKIN_native
87 return rt_task_sleep((RTIME) timens);
89 #ifdef XENOMAI_SKIN_posix
91 req.tv_sec = timens/1000000000;
92 req.tv_nsec = timens - req.tv_sec * 1000000000;
93 return __wrap_nanosleep(&req, NULL);
97 #ifdef XENOMAI_SKIN_posix
106 inline void setup_sched_parameters(pthread_attr_t *attr,
int prio)
108 struct sched_param p;
110 ret = pthread_attr_setinheritsched(attr, PTHREAD_EXPLICIT_SCHED);
112 error(1, ret,
"pthread_attr_setinheritsched()");
114 ret = pthread_attr_setschedpolicy(attr, prio ? SCHED_FIFO : SCHED_OTHER);
116 error(1, ret,
"pthread_attr_setschedpolicy()");
118 p.sched_priority = prio;
119 ret = pthread_attr_setschedparam(attr, &p);
121 error(1, ret,
"pthread_attr_setschedparam()");
124 inline int set_thread_stack_and_priority(pthread_attr_t *attr,
int stackSize,
int prio)
126 if(pthread_attr_setdetachstate(attr, PTHREAD_CREATE_JOINABLE))
128 fprintf(stderr,
"Error: unable to set detachstate\n");
135 if(pthread_attr_setstacksize(attr, stackSize))
137 fprintf(stderr,
"Error: unable to set stack size to %d\n", stackSize);
140 setup_sched_parameters(attr, prio);
143 inline int create_and_start_thread(pthread_t* task,
const char* taskName,
int priority,
int stackSize, pthread_callback_t* callback,
void* arg)
146 if(__wrap_pthread_attr_init(&attr))
148 fprintf(stderr,
"Error: unable to init thread attributes\n");
151 if(
int ret = set_thread_stack_and_priority(&attr, stackSize, priority))
155 if(
int ret = __wrap_pthread_create(task, &attr, callback, arg))
159 #if XENOMAI_MAJOR == 2
163 pthread_set_name_np(*task, taskName);
165 #if XENOMAI_MAJOR == 3
166 __wrap_pthread_setname_np(*task, taskName);
175 pthread_attr_destroy(&attr);
179 inline int createXenomaiPipe(
const char* portName,
int poolsz)
186 int s = __wrap_socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_XDDP);
188 fprintf(stderr,
"Failed call to socket: %d %s\n", errno, strerror(errno));
196 struct rtipc_port_label plabel;
197 strcpy(plabel.label, portName);
198 int ret = __wrap_setsockopt(s, SOL_XDDP, XDDP_LABEL,
199 &plabel,
sizeof(plabel));
202 fprintf(stderr,
"Failed call to __wrap_setsockopt SOL_XDDP XDDP_LABEL: %d %s\n", errno, strerror(errno));
213 ret = __wrap_setsockopt(s, SOL_XDDP, XDDP_POOLSZ,
214 &poolsz,
sizeof(poolsz));
217 fprintf(stderr,
"Failed call to __wrap_setsockopt SOL_XDDP XDDP_POOLSZ: %d %s\n", errno, strerror(errno));
225 struct sockaddr_ipc saddr;
226 memset(&saddr, 0,
sizeof(saddr));
227 saddr.sipc_family = AF_RTIPC;
228 saddr.sipc_port = -1;
229 ret = __wrap_bind(s, (
struct sockaddr *)&saddr,
sizeof(saddr));
232 fprintf(stderr,
"Failed call to __wrap_bind: %d %s\n", errno, strerror(errno));