pipe - Make pipe r/w MPSAFE, add kern.pipe.mpsafe (disabled by default)
[dragonfly.git] / sys / sys / pipe.h
1 /*
2  * Copyright (c) 1996 John S. Dyson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice immediately at the beginning of the file, without modification,
10  *    this list of conditions, and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. Absolutely no warranty of function or purpose is made by the author
15  *    John S. Dyson.
16  * 4. This work was done expressly for inclusion into FreeBSD.  Other use
17  *    is allowed if this notation is included.
18  * 5. Modifications may be freely made to this file if the above conditions
19  *    are met.
20  *
21  * $FreeBSD: src/sys/sys/pipe.h,v 1.16 1999/12/29 04:24:45 peter Exp $
22  * $DragonFly: src/sys/sys/pipe.h,v 1.10 2006/06/10 20:00:17 dillon Exp $
23  */
24
25 #ifndef _SYS_PIPE_H_
26 #define _SYS_PIPE_H_
27
28 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
29
30 #ifndef _SYS_TYPES_H_
31 #include <sys/types.h>
32 #endif
33 #ifndef _SYS_TIME_H_
34 #include <sys/time.h>                   /* for struct timespec */
35 #endif
36 #ifndef _SYS_SELINFO_H_
37 #include <sys/selinfo.h>                /* for struct selinfo */
38 #endif
39 #ifndef _SYS_XIO_H_
40 #include <sys/xio.h>                    /* for struct xio */
41 #endif
42 #ifndef _SYS_THREAD_H_
43 #include <sys/thread.h>                 /* for struct lwkt_token */
44 #endif
45 #ifndef _MACHINE_PARAM_H_
46 #include <machine/param.h>              /* for PAGE_SIZE */
47 #endif
48
49 /*
50  * Pipe buffer size, keep moderate in value, pipes take kva space.
51  * Must be a multiple of PAGE_SIZE.
52  */
53 #ifndef PIPE_SIZE
54 #define PIPE_SIZE       16384
55 #endif
56
57 #ifndef BIG_PIPE_SIZE
58 #define BIG_PIPE_SIZE   (64*1024)
59 #endif
60
61 #if PIPE_SIZE < PAGE_SIZE
62 #error "PIPE_SIZE is too small for this architecture"
63 #endif
64
65 /*
66  * Pipe buffer information.
67  * Separate in, out, cnt are used to simplify calculations.
68  * Buffered write is active when the buffer.cnt field is set.
69  */
70 struct pipebuf {
71         u_int   rindex;         /* FIFO read index */
72         u_int   dummy1[3];      /* cache-align */
73         u_int   windex;         /* FIFO write index */
74         u_int   dummy2[3];      /* cache-align */
75         u_int   size;           /* size of buffer */
76         caddr_t buffer;         /* kva of buffer */
77         struct  vm_object *object;      /* VM object containing buffer */
78 };
79
80 /*
81  * Bits in pipe_state.
82  */
83 #define PIPE_ASYNC      0x0004  /* Async? I/O */
84 #define PIPE_WANTR      0x0008  /* Reader wants some characters */
85 #define PIPE_WANTW      0x0010  /* Writer wants space to put characters */
86 #define PIPE_SEL        0x0020  /* Pipe has a select active */
87 #define PIPE_REOF       0x0040  /* Pipe is in EOF condition (read EOF) */
88 #define PIPE_WEOF       0x0080  /* Pipe is in EOF condition (write shutdown) */
89 #define PIPE_CLOSED     0x1000  /* Pipe has been closed */
90
91 /*
92  * Per-pipe data structure.
93  * Two of these are linked together to produce bi-directional pipes.
94  */
95 struct pipe {
96         struct  pipebuf pipe_buffer;    /* data storage */
97         struct  selinfo pipe_sel;       /* for compat with select */
98         struct  timespec pipe_atime;    /* time of last access */
99         struct  timespec pipe_mtime;    /* time of last modify */
100         struct  timespec pipe_ctime;    /* time of status change */
101         struct  sigio *pipe_sigio;      /* information for async I/O */
102         struct  pipe *pipe_peer;        /* link with other direction */
103         u_int   pipe_state;             /* pipe status info */
104         u_int   pipe_rip;               /* read uio in-progress */
105         u_int   pipe_wip;               /* write uio in-progress */
106         u_int   pipe_wantwcnt;          /* for resize */
107         struct  lwkt_token pipe_rlock;  /* rindex locked */
108         struct  lwkt_token pipe_wlock;  /* windex locked */
109         struct  lock *pipe_slock;       /* state locked (shared w/peer) */
110 };
111
112 #endif  /* _KERNEL || _KERNEL_STRUCTURES */
113 #endif /* !_SYS_PIPE_H_ */