/ base / include / rtai_msg.h
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 */