rtai_msg.h
1 /* 2 * Copyright (C) 2002 POSEIDON CONTROLS INC <pcloutier@poseidoncontrols.com> 3 * Paolo Mantegazza <mantegazza@aero.polimi.it> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 */ 19 20 #ifndef _RTAI_MSG_H 21 #define _RTAI_MSG_H 22 23 #include <rtai_types.h> 24 25 #define MSG_ERR ((RT_TASK *)RTE_OBJINV) 26 27 struct rt_task_struct; 28 struct QueueBlock; 29 struct QueueHook; 30 31 #ifdef __KERNEL__ 32 33 typedef struct t_msgcb { /* Message control block structure. */ 34 int cmd; 35 void *sbuf; 36 size_t sbytes; 37 void *rbuf; 38 size_t rbytes; 39 } MSGCB; 40 41 #define PROXY_MIN_STACK_SIZE 2048 42 43 struct proxy_t { 44 struct rt_task_struct *receiver; 45 int nmsgs, nbytes; 46 char *msg; 47 }; 48 49 #define SYNCMSG 0 50 #define PROXY -1 51 52 #ifdef __cplusplus 53 extern "C" { 54 #endif /* __cplusplus */ 55 56 int __rtai_msg_init(void); 57 58 void __rtai_msg_exit(void); 59 60 RTAI_SYSCALL_MODE struct rt_task_struct *rt_send(struct rt_task_struct *task, 61 unsigned long msg); 62 63 RTAI_SYSCALL_MODE struct rt_task_struct *rt_send_if(struct rt_task_struct *task, 64 unsigned long msg); 65 66 RTAI_SYSCALL_MODE struct rt_task_struct *rt_send_until(struct rt_task_struct *task, 67 unsigned long msg, 68 RTIME time); 69 70 RTAI_SYSCALL_MODE struct rt_task_struct *rt_send_timed(struct rt_task_struct *task, 71 unsigned long msg, 72 RTIME delay); 73 74 RTAI_SYSCALL_MODE struct rt_task_struct *rt_evdrp(struct rt_task_struct *task, 75 void *msg); 76 77 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receive(struct rt_task_struct *task, 78 void *msg); 79 80 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receive_if(struct rt_task_struct *task, 81 void *msg); 82 83 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receive_until(struct rt_task_struct *task, 84 void *msg, 85 RTIME time); 86 87 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receive_timed(struct rt_task_struct *task, 88 void *msg, 89 RTIME delay); 90 91 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpc(struct rt_task_struct *task, 92 unsigned long to_do, 93 void *result); 94 95 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpc_if(struct rt_task_struct *task, 96 unsigned long to_do, 97 void *result); 98 99 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpc_until(struct rt_task_struct *task, 100 unsigned long to_do, 101 void *result, 102 RTIME time); 103 104 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpc_timed(struct rt_task_struct *task, 105 unsigned long to_do, 106 void *result, 107 RTIME delay); 108 109 RTAI_SYSCALL_MODE int rt_isrpc(struct rt_task_struct *task); 110 111 RTAI_SYSCALL_MODE struct rt_task_struct *rt_return(struct rt_task_struct *task, 112 unsigned long result); 113 114 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpcx(struct rt_task_struct *task, 115 void *smsg, 116 void *rmsg, 117 int ssize, 118 int rsize); 119 120 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpcx_if(struct rt_task_struct *task, 121 void *smsg, 122 void *rmsg, 123 int ssize, 124 int rsize); 125 126 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpcx_until(struct rt_task_struct *task, 127 void *smsg, 128 void *rmsg, 129 int ssize, 130 int rsize, 131 RTIME time); 132 133 RTAI_SYSCALL_MODE struct rt_task_struct *rt_rpcx_timed(struct rt_task_struct *task, 134 void *smsg, 135 void *rmsg, 136 int ssize, 137 int rsize, 138 RTIME delay); 139 140 RTAI_SYSCALL_MODE struct rt_task_struct *rt_sendx(struct rt_task_struct *task, 141 void *msg, 142 int size); 143 144 RTAI_SYSCALL_MODE struct rt_task_struct *rt_sendx_if(struct rt_task_struct *task, 145 void *msg, 146 int size); 147 148 RTAI_SYSCALL_MODE struct rt_task_struct *rt_sendx_until(struct rt_task_struct *task, 149 void *msg, 150 int size, 151 RTIME time); 152 153 RTAI_SYSCALL_MODE struct rt_task_struct *rt_sendx_timed(struct rt_task_struct *task, 154 void *msg, 155 int size, 156 RTIME delay); 157 158 RTAI_SYSCALL_MODE struct rt_task_struct *rt_returnx(struct rt_task_struct *task, 159 void *msg, 160 int size); 161 162 #define rt_isrpcx(task) rt_isrpc(task) 163 164 RTAI_SYSCALL_MODE struct rt_task_struct *rt_evdrpx(struct rt_task_struct *task, 165 void *msg, 166 int size, 167 long *len); 168 169 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receivex(struct rt_task_struct *task, 170 void *msg, 171 int size, 172 long *len); 173 174 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receivex_if(struct rt_task_struct *task, 175 void *msg, 176 int size, 177 long *len); 178 179 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receivex_until(struct rt_task_struct *task, 180 void *msg, 181 int size, 182 long *len, 183 RTIME time); 184 185 RTAI_SYSCALL_MODE struct rt_task_struct *rt_receivex_timed(struct rt_task_struct *task, 186 void *msg, 187 int size, 188 long *len, 189 RTIME delay); 190 191 struct rt_task_struct *__rt_proxy_attach(void (*func)(long), 192 struct rt_task_struct *task, 193 void *msg, 194 int nbytes, 195 int priority); 196 197 RTAI_SYSCALL_MODE struct rt_task_struct *rt_proxy_attach(struct rt_task_struct *task, 198 void *msg, 199 int nbytes, 200 int priority); 201 202 RTAI_SYSCALL_MODE int rt_proxy_detach(struct rt_task_struct *proxy); 203 204 RTAI_SYSCALL_MODE struct rt_task_struct *rt_trigger(struct rt_task_struct *proxy); 205 206 #define exist(name) rt_get_adr(nam2num(name)) 207 208 RTAI_SYSCALL_MODE int rt_Send(pid_t pid, 209 void *smsg, 210 void *rmsg, 211 size_t ssize, 212 size_t rsize); 213 214 RTAI_SYSCALL_MODE pid_t rt_Receive(pid_t pid, 215 void *msg, 216 size_t maxsize, 217 size_t *msglen); 218 219 RTAI_SYSCALL_MODE pid_t rt_Creceive(pid_t pid, 220 void *msg, 221 size_t maxsize, 222 size_t *msglen, 223 RTIME delay); 224 225 RTAI_SYSCALL_MODE int rt_Reply(pid_t pid, 226 void *msg, 227 size_t size); 228 229 RTAI_SYSCALL_MODE pid_t rt_Proxy_attach(pid_t pid, 230 void *msg, 231 int nbytes, 232 int priority); 233 234 RTAI_SYSCALL_MODE int rt_Proxy_detach(pid_t pid); 235 236 RTAI_SYSCALL_MODE pid_t rt_Trigger(pid_t pid); 237 238 RTAI_SYSCALL_MODE pid_t rt_Name_attach(const char *name); 239 240 RTAI_SYSCALL_MODE pid_t rt_Name_locate(const char *host, 241 const char *name); 242 243 RTAI_SYSCALL_MODE int rt_Name_detach(pid_t pid); 244 245 #ifdef __cplusplus 246 } 247 #endif /* __cplusplus */ 248 249 #else /* !__KERNEL__ */ 250 251 #include <rtai_lxrt.h> 252 253 #ifdef __cplusplus 254 extern "C" { 255 #endif /* __cplusplus */ 256 257 RTAI_PROTO(struct rt_task_struct *,rt_send,(struct rt_task_struct *task, unsigned long msg)) 258 { 259 struct { struct rt_task_struct *task; unsigned long msg; } arg = { task, msg }; 260 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SENDMSG, &arg).v[LOW]; 261 } 262 263 RTAI_PROTO(struct rt_task_struct *,rt_send_if,(struct rt_task_struct *task, unsigned long msg)) 264 { 265 struct { struct rt_task_struct *task; unsigned long msg; } arg = { task, msg }; 266 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SEND_IF, &arg).v[LOW]; 267 } 268 269 RTAI_PROTO(struct rt_task_struct *,rt_send_until,(struct rt_task_struct *task, unsigned long msg, RTIME time)) 270 { 271 struct { struct rt_task_struct *task; unsigned long msg; RTIME time; } arg = { task, msg, time }; 272 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SEND_UNTIL, &arg).v[LOW]; 273 } 274 275 RTAI_PROTO(struct rt_task_struct *,rt_send_timed,(struct rt_task_struct *task, unsigned long msg, RTIME delay)) 276 { 277 struct { struct rt_task_struct *task; unsigned long msg; RTIME delay; } arg = { task, msg, delay }; 278 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SEND_TIMED, &arg).v[LOW]; 279 } 280 281 RTAI_PROTO(struct rt_task_struct *,rt_evdrp,(struct rt_task_struct *task, void *msg)) 282 { 283 struct { struct rt_task_struct *task; void *msg; } arg = { task, msg }; 284 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, EVDRP, &arg).v[LOW]; 285 } 286 287 RTAI_PROTO(struct rt_task_struct *,rt_receive,(struct rt_task_struct *task, void *msg)) 288 { 289 struct { struct rt_task_struct *task; void *msg; } arg = { task, msg }; 290 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVEMSG, &arg).v[LOW]; 291 } 292 293 RTAI_PROTO(struct rt_task_struct *,rt_receive_if,(struct rt_task_struct *task, void *msg)) 294 { 295 struct { struct rt_task_struct *task; void *msg; } arg = { task, msg }; 296 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVE_IF, &arg).v[LOW]; 297 } 298 299 RTAI_PROTO(struct rt_task_struct *,rt_receive_until,(struct rt_task_struct *task, void *msg, RTIME time)) 300 { 301 struct { struct rt_task_struct *task; void *msg; RTIME time; } arg = { task, msg, time }; 302 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVE_UNTIL, &arg).v[LOW]; 303 } 304 305 RTAI_PROTO(struct rt_task_struct *,rt_receive_timed,(struct rt_task_struct *task, void *msg, RTIME delay)) 306 { 307 struct { struct rt_task_struct *task; void *msg; RTIME delay; } arg = { task, msg, delay }; 308 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVE_TIMED, &arg).v[LOW]; 309 } 310 311 RTAI_PROTO(struct rt_task_struct *,rt_rpc,(struct rt_task_struct *task, unsigned long to_do, void *result)) 312 { 313 struct { struct rt_task_struct *task; unsigned long to_do; void *result; } arg = { task, to_do, result }; 314 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPCMSG, &arg).v[LOW]; 315 } 316 317 RTAI_PROTO(struct rt_task_struct *,rt_rpc_if,(struct rt_task_struct *task, unsigned long to_do, void *result)) 318 { 319 struct { struct rt_task_struct *task; unsigned long to_do; void *result; } arg = { task, to_do, result }; 320 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPC_IF, &arg).v[LOW]; 321 } 322 323 RTAI_PROTO(struct rt_task_struct *,rt_rpc_until,(struct rt_task_struct *task, unsigned long to_do, void *result, RTIME time)) 324 { 325 struct { struct rt_task_struct *task; unsigned long to_do; void *result; RTIME time; } arg = { task, to_do, result, time }; 326 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPC_UNTIL, &arg).v[LOW]; 327 } 328 329 RTAI_PROTO(struct rt_task_struct *,rt_rpc_timed,(struct rt_task_struct *task, unsigned long to_do, void *result, RTIME delay)) 330 { 331 struct { struct rt_task_struct *task; unsigned long to_do; void *result; RTIME delay; } arg = { task, to_do, result, delay }; 332 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPC_TIMED, &arg).v[LOW]; 333 } 334 335 RTAI_PROTO(int, rt_isrpc,(struct rt_task_struct *task)) 336 { 337 struct { struct rt_task_struct *task; } arg = { task }; 338 return (int)rtai_lxrt(BIDX, SIZARG, ISRPC, &arg).i[LOW]; 339 } 340 341 RTAI_PROTO(struct rt_task_struct *,rt_return,(struct rt_task_struct *task, unsigned long result)) 342 { 343 struct { struct rt_task_struct *task; unsigned long result; } arg = { task, result }; 344 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RETURNMSG, &arg).v[LOW]; 345 } 346 347 RTAI_PROTO(struct rt_task_struct *,rt_rpcx,(struct rt_task_struct *task, void *smsg, void *rmsg, int ssize, int rsize)) 348 { 349 struct { struct rt_task_struct *task; void *smsg; void *rmsg; long ssize; long rsize; } arg = { task, smsg, rmsg, ssize, rsize }; 350 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPCX, &arg).v[LOW]; 351 } 352 353 RTAI_PROTO(struct rt_task_struct *,rt_rpcx_if,(struct rt_task_struct *task, void *smsg, void *rmsg, int ssize, int rsize)) 354 { 355 struct { struct rt_task_struct *task; void *smsg; void *rmsg; long ssize; long rsize; } arg = { task, smsg, rmsg, ssize, rsize }; 356 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPCX_IF, &arg).v[LOW]; 357 } 358 359 RTAI_PROTO(struct rt_task_struct *,rt_rpcx_until,(struct rt_task_struct *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME time)) 360 { 361 struct { struct rt_task_struct *task; void *smsg; void *rmsg; long ssize; long rsize; RTIME time; } arg = { task, smsg, rmsg, ssize, rsize, time }; 362 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPCX_UNTIL, &arg).v[LOW]; 363 } 364 365 RTAI_PROTO(struct rt_task_struct *,rt_rpcx_timed,(struct rt_task_struct *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME delay)) 366 { 367 struct { struct rt_task_struct *task; void *smsg; void *rmsg; long ssize; long rsize; RTIME delay; } arg = { task, smsg, rmsg, ssize, rsize, delay }; 368 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RPCX_TIMED, &arg).v[LOW]; 369 } 370 371 RTAI_PROTO(struct rt_task_struct *,rt_sendx,(struct rt_task_struct *task, void *msg, int size)) 372 { 373 struct { struct rt_task_struct *task; void *msg; long size; } arg = { task, msg, size }; 374 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SENDX, &arg).v[LOW]; 375 } 376 377 RTAI_PROTO(struct rt_task_struct *,rt_sendx_if,(struct rt_task_struct *task, void *msg, int size)) 378 { 379 struct { struct rt_task_struct *task; void *msg; long size; } arg = { task, msg, size }; 380 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SENDX_IF, &arg).v[LOW]; 381 } 382 383 RTAI_PROTO(struct rt_task_struct *,rt_sendx_until,(struct rt_task_struct *task, void *msg, int size, RTIME time)) 384 { 385 struct { struct rt_task_struct *task; void *msg; long size; RTIME time; } arg = { task, msg, size, time }; 386 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SENDX_UNTIL, &arg).v[LOW]; 387 } 388 389 RTAI_PROTO(struct rt_task_struct *,rt_sendx_timed,(struct rt_task_struct *task, void *msg, long size, RTIME delay)) 390 { 391 struct { struct rt_task_struct *task; void *msg; long size; RTIME delay; } arg = { task, msg, size, delay }; 392 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, SENDX_TIMED, &arg).v[LOW]; 393 } 394 395 RTAI_PROTO(struct rt_task_struct *,rt_returnx,(struct rt_task_struct *task, void *msg, int size)) 396 { 397 struct { struct rt_task_struct *task; void *msg; long size; } arg = { task, msg, size }; 398 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RETURNX, &arg).v[LOW]; 399 } 400 401 #define rt_isrpcx(task) rt_isrpc(task) 402 403 RTAI_PROTO(struct rt_task_struct *,rt_evdrpx,(struct rt_task_struct *task, void *msg, int size, long *len)) 404 { 405 struct { struct rt_task_struct *task; void *msg; long size; long *len; } arg = { task, msg, size, len }; 406 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, EVDRPX, &arg).v[LOW]; 407 } 408 409 RTAI_PROTO(struct rt_task_struct *,rt_receivex,(struct rt_task_struct *task, void *msg, int size, long *len)) 410 { 411 struct { struct rt_task_struct *task; void *msg; long size; long *len; } arg = { task, msg, size, len }; 412 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVEX, &arg).v[LOW]; 413 } 414 415 RTAI_PROTO(struct rt_task_struct *,rt_receivex_if,(struct rt_task_struct *task, void *msg, int size, long *len)) 416 { 417 struct { struct rt_task_struct *task; void *msg; long size; long *len; } arg = { task, msg, size, len }; 418 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVEX_IF, &arg).v[LOW]; 419 } 420 421 RTAI_PROTO(struct rt_task_struct *,rt_receivex_until,(struct rt_task_struct *task, void *msg, int size, long *len, RTIME time)) 422 { 423 struct { struct rt_task_struct *task; void *msg; long size; long *len; RTIME time; } arg = { task, msg, size, len, time }; 424 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVEX_UNTIL, &arg).v[LOW]; 425 } 426 427 RTAI_PROTO(struct rt_task_struct *,rt_receivex_timed,(struct rt_task_struct *task, void *msg, int size, long *len, RTIME delay)) 428 { 429 struct { struct rt_task_struct *task; void *msg; long size; long *len; RTIME delay; } arg = { task, msg, size, len, delay }; 430 return (struct rt_task_struct *)rtai_lxrt(BIDX, SIZARG, RECEIVEX_TIMED, &arg).v[LOW]; 431 } 432 433 RTAI_PROTO(struct rt_task_struct *,rt_proxy_attach,(struct rt_task_struct *proxy, void *msg, int nbytes, int priority)) 434 { 435 struct { struct rt_task_struct *proxy; void *msg; long nbytes, priority;} arg = { proxy, msg, nbytes, priority }; 436 return (struct rt_task_struct *) rtai_lxrt(BIDX, SIZARG, PROXY_ATTACH, &arg).v[LOW]; 437 } 438 439 RTAI_PROTO(int, rt_proxy_detach,(struct rt_task_struct *proxy)) 440 { 441 struct { struct rt_task_struct *proxy; } arg = { proxy }; 442 return (pid_t) rtai_lxrt(BIDX, SIZARG, PROXY_DETACH, &arg).i[LOW]; 443 } 444 445 RTAI_PROTO(struct rt_task_struct *,rt_trigger,(struct rt_task_struct *proxy)) 446 { 447 struct { struct rt_task_struct *proxy; } arg = { proxy }; 448 return (struct rt_task_struct *) rtai_lxrt(BIDX, SIZARG, PROXY_TRIGGER, &arg).v[LOW]; 449 } 450 451 RTAI_PROTO(int, rt_Send,(pid_t pid, void *smsg, void *rmsg, size_t ssize, size_t rsize )) 452 { 453 struct { long pid; void *smsg; void *rmsg; long ssize, rsize;} arg = { pid, smsg, rmsg, ssize, rsize }; 454 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_SEND, &arg).i[LOW]; 455 } 456 457 RTAI_PROTO(pid_t, rt_Receive,(pid_t pid, void *msg, size_t maxsize, size_t *msglen)) 458 { 459 struct { long pid; void *msg; long maxsize; size_t *msglen; } arg = { pid, msg, maxsize, msglen }; 460 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_RECEIVE, &arg).i[LOW]; 461 } 462 463 RTAI_PROTO(pid_t, rt_Creceive,(pid_t pid, void *msg, size_t maxsize, size_t *msglen, RTIME delay)) 464 { 465 struct { long pid; void *msg; long maxsize; size_t *msglen; RTIME delay;} arg = { pid, msg, maxsize, msglen, delay }; 466 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_CRECEIVE, &arg).i[LOW]; 467 } 468 469 RTAI_PROTO(pid_t, rt_Reply,(pid_t pid, void *msg, size_t size)) 470 { 471 struct { long pid; void *msg; long size;} arg = { pid, msg, size }; 472 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_REPLY, &arg).i[LOW]; 473 } 474 475 RTAI_PROTO(pid_t, rt_Proxy_attach,(pid_t pid, void *msg, int nbytes, int priority)) 476 { 477 struct { long pid; void *msg; long nbytes, priority;} arg = { pid, msg, nbytes, priority }; 478 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_PROXY_ATTACH, &arg).i[LOW]; 479 } 480 481 RTAI_PROTO(pid_t, rt_Proxy_detach,(pid_t pid)) 482 { 483 struct { long pid; } arg = { pid }; 484 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_PROXY_DETACH, &arg).i[LOW]; 485 } 486 487 RTAI_PROTO(pid_t, rt_Trigger,(pid_t pid)) 488 { 489 struct { long pid; } arg = { pid }; 490 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_TRIGGER, &arg).i[LOW]; 491 } 492 493 RTAI_PROTO(pid_t, rt_Alias_attach,(const char *name)) 494 { 495 struct { const char *name; } arg = { name}; 496 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_NAME_ATTACH, &arg).i[LOW]; 497 } 498 499 RTAI_PROTO(pid_t, rt_Name_locate,(const char *host, const char *name)) 500 { 501 struct { const char *host, *name; } arg = { host, name }; 502 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_NAME_LOCATE, &arg).i[LOW]; 503 } 504 505 RTAI_PROTO(int, rt_Name_detach,(pid_t pid)) 506 { 507 struct { long pid; } arg = { pid }; 508 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_NAME_DETACH, &arg).i[LOW]; 509 } 510 511 RTAI_PROTO(int, rt_InitTickQueue,(void)) 512 { 513 struct { unsigned long dummy; } arg; 514 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_INITTICKQUEUE, &arg).i[LOW]; 515 } 516 517 RTAI_PROTO(void, rt_ReleaseTickQueue,(void)) 518 { 519 struct { unsigned long dummy; } arg; 520 rtai_lxrt(BIDX, SIZARG, RT_RELEASETICKQUEUE, &arg); 521 } 522 523 RTAI_PROTO(unsigned long, rt_qDynAlloc,(unsigned long n)) 524 { 525 struct { unsigned long n; } arg = { n }; 526 return (unsigned long) rtai_lxrt(BIDX, SIZARG, RT_QDYNALLOC, &arg).i[LOW]; 527 } 528 529 RTAI_PROTO(unsigned long, rt_qDynFree,(int n)) 530 { 531 struct { unsigned long n; } arg = { n }; 532 return (unsigned long) rtai_lxrt(BIDX, SIZARG, RT_QDYNFREE, &arg).i[LOW]; 533 } 534 535 RTAI_PROTO(struct QueueBlock *,rt_qDynInit,(struct QueueBlock **q, void (*fun)(void *, int), void *data, int evn )) 536 { 537 struct QueueBlock *r; 538 539 struct { struct QueueBlock **q; void (*fun)(void *, int), *data; long evn; } arg = { 0, fun, data, evn }; 540 r = (struct QueueBlock *) rtai_lxrt(BIDX, SIZARG, RT_QDYNINIT, &arg).v[LOW]; 541 if (q) *q = r; 542 return r; 543 } 544 545 RTAI_PROTO(void, rt_qBlkWait,(struct QueueBlock *q, RTIME t)) 546 { 547 struct { struct QueueBlock *q; RTIME t; } arg = { q, t } ; 548 rtai_lxrt(BIDX, SIZARG, RT_QBLKWAIT, &arg); 549 } 550 551 RTAI_PROTO(void, rt_qBlkRepeat,(struct QueueBlock *q, RTIME t)) 552 { 553 struct { struct QueueBlock *q; RTIME t; } arg = { q, t } ; 554 rtai_lxrt(BIDX, SIZARG, RT_QBLKREPEAT, &arg); 555 } 556 557 RTAI_PROTO(void, rt_qBlkSoon,(struct QueueBlock *q)) 558 { 559 struct { struct QueueBlock *q; } arg = { q }; 560 rtai_lxrt(BIDX, SIZARG, RT_QBLKSOON, &arg); 561 } 562 563 RTAI_PROTO(void, rt_qBlkDequeue,(struct QueueBlock *q)) 564 { 565 struct { struct QueueBlock *q; } arg = { q }; 566 rtai_lxrt(BIDX, SIZARG, RT_QBLKDEQUEUE, &arg); 567 } 568 569 RTAI_PROTO(void, rt_qBlkCancel,(struct QueueBlock *q)) 570 { 571 struct { struct QueueBlock *q; } arg = { q }; 572 rtai_lxrt(BIDX, SIZARG, RT_QBLKCANCEL, &arg); 573 } 574 575 RTAI_PROTO(void, rt_qBlkBefore,(struct QueueBlock *cur, struct QueueBlock *nxt)) 576 { 577 struct { struct QueueBlock *cur, *nxt; } arg = { cur, nxt }; 578 rtai_lxrt(BIDX, SIZARG, RT_QBLKBEFORE, &arg); 579 } 580 581 RTAI_PROTO(void, rt_qBlkAfter,(struct QueueBlock *cur, struct QueueBlock *prv)) 582 { 583 struct { struct QueueBlock *cur, *prv; } arg = { cur, prv }; 584 rtai_lxrt(BIDX, SIZARG, RT_QBLKAFTER, &arg); 585 } 586 587 RTAI_PROTO(struct QueueBlock *,rt_qBlkUnhook,(struct QueueBlock *q)) 588 { 589 struct { struct QueueBlock *q; } arg = { q }; 590 return (struct QueueBlock *) rtai_lxrt(BIDX, SIZARG, RT_QBLKUNHOOK, &arg).v[LOW]; 591 } 592 593 RTAI_PROTO(void, rt_qBlkRelease,(struct QueueBlock *q)) 594 { 595 struct { struct QueueBlock *q; } arg = { q }; 596 rtai_lxrt(BIDX, SIZARG, RT_QBLKRELEASE, &arg); 597 } 598 599 RTAI_PROTO(void, rt_qBlkComplete,(struct QueueBlock *q)) 600 { 601 struct { struct QueueBlock *q; } arg = { q }; 602 rtai_lxrt(BIDX, SIZARG, RT_QBLKCOMPLETE, &arg); 603 } 604 605 RTAI_PROTO(int, rt_qSync,(void)) 606 { 607 struct { unsigned long long dummy; } arg; 608 return rtai_lxrt(BIDX, SIZARG, RT_QSYNC, &arg).i[LOW]; 609 } 610 611 RTAI_PROTO(pid_t, rt_qReceive,(pid_t target, void *buf, size_t maxlen, size_t *msglen)) 612 { 613 struct { long target; void *buf; long maxlen; size_t *msglen; } arg = { target, buf, maxlen, msglen }; 614 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_QRECEIVE, &arg).i[LOW]; 615 } 616 617 RTAI_PROTO(void, rt_qLoop,(void)) 618 { 619 struct { unsigned long dummy; } arg; 620 rtai_lxrt(BIDX, SIZARG, RT_QLOOP, &arg); 621 } 622 623 RTAI_PROTO(RTIME, rt_qStep,(void)) 624 { 625 struct { unsigned long dummy; } arg; 626 return rtai_lxrt(BIDX, SIZARG, RT_QSTEP, &arg).rt; 627 } 628 629 RTAI_PROTO(void, rt_qHookFlush,(struct QueueHook *h)) 630 { 631 struct { struct QueueHook *h; } arg = { h }; 632 rtai_lxrt(BIDX, SIZARG, RT_QHOOKFLUSH, &arg); 633 } 634 635 RTAI_PROTO(void, rt_qBlkAtHead,(struct QueueBlock *q, struct QueueHook *h)) 636 { 637 struct { struct QueueBlock *q; struct QueueHook *h; } arg = { q, h }; 638 rtai_lxrt(BIDX, SIZARG, RT_QBLKATHEAD, &arg); 639 } 640 641 RTAI_PROTO(void, rt_qBlkAtTail,(struct QueueBlock *q, struct QueueHook *h)) 642 { 643 struct { struct QueueBlock *q; struct QueueHook *h; } arg = { q, h }; 644 rtai_lxrt(BIDX, SIZARG, RT_QBLKATTAIL, &arg); 645 } 646 647 RTAI_PROTO(struct QueueHook *,rt_qHookInit,(struct QueueHook **h, void (*c)(void *, struct QueueBlock *), void *a)) 648 { 649 struct QueueHook *r; 650 struct { struct QueueHook **h; void (*c)(void *, struct QueueBlock *), *a;} arg = { 0, c, a }; 651 r = (struct QueueHook *) rtai_lxrt(BIDX, SIZARG, RT_QHOOKINIT, &arg).v[LOW]; 652 if (h) *h = r; 653 return r; 654 } 655 656 RTAI_PROTO(void, rt_qHookRelease,(struct QueueHook *h)) 657 { 658 struct { struct QueueHook *h; } arg = { h }; 659 rtai_lxrt(BIDX, SIZARG, RT_QHOOKRELEASE, &arg); 660 } 661 662 RTAI_PROTO(void, rt_qBlkSchedule,(struct QueueBlock *q, RTIME t)) 663 { 664 struct { struct QueueBlock *q; RTIME t; } arg = { q, t } ; 665 rtai_lxrt(BIDX, SIZARG, RT_QBLKSCHEDULE, &arg); 666 } 667 668 RTAI_PROTO(struct QueueHook *,rt_GetTickQueueHook,(void)) 669 { 670 struct { unsigned long dummy; } arg; 671 return (struct QueueHook *) rtai_lxrt(BIDX, SIZARG, RT_GETTICKQUEUEHOOK, &arg).v[LOW]; 672 } 673 674 RTAI_PROTO(pid_t, rt_vc_reserve,( void )) 675 { 676 struct { unsigned long dummy; } arg; 677 return (pid_t) rtai_lxrt(BIDX, SIZARG, RT_VC_RESERVE, &arg).i[LOW]; 678 } 679 680 RTAI_PROTO(int, rt_vc_attach,(pid_t pid)) 681 { 682 struct { long pid; } arg = { pid }; 683 return rtai_lxrt(BIDX, SIZARG, RT_VC_ATTACH, &arg).i[LOW]; 684 } 685 686 RTAI_PROTO(int, rt_vc_release,(pid_t pid)) 687 { 688 struct { long pid; } arg = { pid }; 689 return rtai_lxrt(BIDX, SIZARG, RT_VC_RELEASE, &arg).i[LOW]; 690 } 691 692 #ifdef __cplusplus 693 } 694 #endif /* __cplusplus */ 695 696 #endif /* __KERNEL__ */ 697 698 #if !defined(__KERNEL__) || defined(__cplusplus) 699 700 typedef struct t_msgcb { 701 int opaque; 702 } MSGCB; 703 704 #endif /* !__KERNEL__ || __cplusplus */ 705 706 #endif /* !_RTAI_MSG_H */