Xenomai 3.3.2
Loading...
Searching...
No Matches
pipe.h
1/*
2 * Copyright (C) 2001,2002,2003 Philippe Gerum.
3 *
4 * Xenomai is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA
7 * 02139, USA; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * Xenomai is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * 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#ifndef _COBALT_KERNEL_PIPE_H
20#define _COBALT_KERNEL_PIPE_H
21
22#include <linux/types.h>
23#include <linux/poll.h>
24#include <cobalt/kernel/synch.h>
25#include <cobalt/kernel/thread.h>
26#include <cobalt/uapi/kernel/pipe.h>
27
28#define XNPIPE_NDEVS CONFIG_XENO_OPT_PIPE_NRDEV
29#define XNPIPE_DEV_MAJOR 150
30
31#define XNPIPE_KERN_CONN 0x1
32#define XNPIPE_KERN_LCLOSE 0x2
33#define XNPIPE_USER_CONN 0x4
34#define XNPIPE_USER_SIGIO 0x8
35#define XNPIPE_USER_WREAD 0x10
36#define XNPIPE_USER_WREAD_READY 0x20
37#define XNPIPE_USER_WSYNC 0x40
38#define XNPIPE_USER_WSYNC_READY 0x80
39#define XNPIPE_USER_LCONN 0x100
40
41#define XNPIPE_USER_ALL_WAIT \
42(XNPIPE_USER_WREAD|XNPIPE_USER_WSYNC)
43
44#define XNPIPE_USER_ALL_READY \
45(XNPIPE_USER_WREAD_READY|XNPIPE_USER_WSYNC_READY)
46
47struct xnpipe_mh {
48 size_t size;
49 size_t rdoff;
50 struct list_head link;
51};
52
53struct xnpipe_state;
54
55struct xnpipe_operations {
56 void (*output)(struct xnpipe_mh *mh, void *xstate);
57 int (*input)(struct xnpipe_mh *mh, int retval, void *xstate);
58 void *(*alloc_ibuf)(size_t size, void *xstate);
59 void (*free_ibuf)(void *buf, void *xstate);
60 void (*free_obuf)(void *buf, void *xstate);
61 void (*release)(void *xstate);
62};
63
64struct xnpipe_state {
65 struct list_head slink; /* Link on sleep queue */
66 struct list_head alink; /* Link on async queue */
67
68 struct list_head inq; /* From user-space to kernel */
69 int nrinq;
70 struct list_head outq; /* From kernel to user-space */
71 int nroutq;
72 struct xnsynch synchbase;
73 struct xnpipe_operations ops;
74 void *xstate; /* Extra state managed by caller */
75
76 /* Linux kernel part */
77 unsigned long status;
78 struct fasync_struct *asyncq;
79 wait_queue_head_t readq; /* open/read/poll waiters */
80 wait_queue_head_t syncq; /* sync waiters */
81 int wcount; /* number of waiters on this minor */
82 size_t ionrd;
83};
84
85extern struct xnpipe_state xnpipe_states[];
86
87#define xnminor_from_state(s) (s - xnpipe_states)
88
89#ifdef CONFIG_XENO_OPT_PIPE
90int xnpipe_mount(void);
91void xnpipe_umount(void);
92#else /* !CONFIG_XENO_OPT_PIPE */
93static inline int xnpipe_mount(void) { return 0; }
94static inline void xnpipe_umount(void) { }
95#endif /* !CONFIG_XENO_OPT_PIPE */
96
97/* Entry points of the kernel interface. */
98
99int xnpipe_connect(int minor,
100 struct xnpipe_operations *ops, void *xstate);
101
102int xnpipe_disconnect(int minor);
103
104ssize_t xnpipe_send(int minor,
105 struct xnpipe_mh *mh, size_t size, int flags);
106
107ssize_t xnpipe_mfixup(int minor, struct xnpipe_mh *mh, ssize_t size);
108
109ssize_t xnpipe_recv(int minor,
110 struct xnpipe_mh **pmh, xnticks_t timeout);
111
112int xnpipe_flush(int minor, int mode);
113
114int xnpipe_pollstate(int minor, unsigned int *mask_r);
115
116static inline unsigned int __xnpipe_pollstate(int minor)
117{
118 struct xnpipe_state *state = xnpipe_states + minor;
119 unsigned int mask = POLLOUT;
120
121 if (!list_empty(&state->inq))
122 mask |= POLLIN;
123
124 return mask;
125}
126
127static inline char *xnpipe_m_data(struct xnpipe_mh *mh)
128{
129 return (char *)(mh + 1);
130}
131
132#define xnpipe_m_size(mh) ((mh)->size)
133
134#define xnpipe_m_rdoff(mh) ((mh)->rdoff)
135
136#endif /* !_COBALT_KERNEL_PIPE_H */