-
Notifications
You must be signed in to change notification settings - Fork 24
/
pipe.h
146 lines (130 loc) · 4.69 KB
/
pipe.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* $NetBSD: pipe.h,v 1.13.2.6 2005/11/10 14:12:12 skrll Exp $ */
/*
* Copyright (c) 1996 John S. Dyson
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice immediately at the beginning of the file, without modification,
* this list of conditions, and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Absolutely no warranty of function or purpose is made by the author
* John S. Dyson.
* 4. This work was done expressly for inclusion into FreeBSD. Other use
* is allowed if this notation is included.
* 5. Modifications may be freely made to this file if the above conditions
* are met.
*
* $FreeBSD: src/sys/sys/pipe.h,v 1.18 2002/02/27 07:35:59 alfred Exp $
*/
#ifndef _SYS_PIPE_H_
#define _SYS_PIPE_H_
#ifndef _KERNEL
#include <sys/selinfo.h> /* for struct selinfo */
#endif
/*
* Pipe buffer size, keep moderate in value, pipes take kva space.
*/
#ifndef PIPE_SIZE
#define PIPE_SIZE 16384
#endif
#ifndef BIG_PIPE_SIZE
#define BIG_PIPE_SIZE (4*PIPE_SIZE)
#endif
/*
* Maximum size of kva for direct write transfer. If the amount
* of data in buffer is larger, it would be transferred in chunks of this
* size. This kva memory is freed after use if amount of pipe kva memory
* is bigger than limitpipekva.
*/
#ifndef PIPE_DIRECT_CHUNK
#define PIPE_DIRECT_CHUNK (1*1024*1024)
#endif
/*
* PIPE_MINDIRECT MUST be smaller than PIPE_SIZE and MUST be bigger
* than PIPE_BUF.
*/
#ifndef PIPE_MINDIRECT
#define PIPE_MINDIRECT 8192
#endif
/*
* Pipe buffer information.
* Separate in, out, cnt are used to simplify calculations.
* Buffered write is active when the buffer.cnt field is set.
*/
struct pipebuf {
size_t cnt; /* number of chars currently in buffer */
u_int in; /* in pointer */
u_int out; /* out pointer */
size_t size; /* size of buffer */
caddr_t buffer; /* kva of buffer */
};
/*
* Information to support direct transfers between processes for pipes.
*/
struct pipemapping {
vaddr_t kva; /* kernel virtual address */
vsize_t cnt; /* number of chars in buffer */
voff_t pos; /* current position within page */
int npages; /* how many pages allocated */
struct vm_page **pgs; /* pointers to the pages */
};
/*
* Bits in pipe_state.
*/
#define PIPE_ASYNC 0x001 /* Async I/O */
#define PIPE_WANTR 0x002 /* Reader wants some characters */
#define PIPE_WANTW 0x004 /* Writer wants space to put characters */
#define PIPE_WANTCLOSE 0x008 /* Pipe is wanted to be run-down */
#define PIPE_EOF 0x010 /* Pipe is in EOF condition */
#define PIPE_SIGNALR 0x020 /* Do selwakeup() on read(2) */
#define PIPE_DIRECTW 0x040 /* Pipe in direct write mode setup */
#define PIPE_DIRECTR 0x080 /* Pipe direct read request (setup complete) */
#define PIPE_LOCKFL 0x100 /* Process has exclusive access to
pointers/data. */
#define PIPE_LWANT 0x200 /* Process wants exclusive access to
pointers/data. */
/*
* Per-pipe data structure.
* Two of these are linked together to produce bi-directional pipes.
*/
struct pipe {
struct simplelock pipe_slock; /* pipe mutex */
struct pipebuf pipe_buffer; /* data storage */
struct pipemapping pipe_map; /* pipe mapping for direct I/O */
struct selinfo pipe_sel; /* for compat with select */
struct timeval pipe_atime; /* time of last access */
struct timeval pipe_mtime; /* time of last modify */
struct timeval pipe_ctime; /* time of status change */
pid_t pipe_pgid; /* process group for sigio */
struct pipe *pipe_peer; /* link with other direction */
u_int pipe_state; /* pipe status info */
int pipe_busy; /* busy flag, mostly to handle rundown sanely */
};
/*
* KERN_PIPE subtypes
*/
#define KERN_PIPE_MAXKVASZ 1 /* maximum kva size */
#define KERN_PIPE_LIMITKVA 2 /* */
#define KERN_PIPE_MAXBIGPIPES 3 /* maximum # of "big" pipes */
#define KERN_PIPE_NBIGPIPES 4 /* current number of "big" p. */
#define KERN_PIPE_KVASIZE 5 /* current pipe kva size */
#define KERN_PIPE_MAXID 6
#define CTL_PIPE_NAMES { \
{ 0, 0 }, \
{ "maxkvasz", CTLTYPE_INT }, \
{ "maxloankvasz", CTLTYPE_INT }, \
{ "maxbigpipes", CTLTYPE_INT }, \
{ "nbigpipes", CTLTYPE_INT }, \
{ "kvasize", CTLTYPE_INT }, \
}
#ifdef _KERNEL
int sysctl_dopipe(int *, u_int, void *, size_t *, void *, size_t);
#define PIPE_LOCK(pipe) simple_lock(&(pipe)->pipe_slock);
#define PIPE_UNLOCK(pipe) simple_unlock(&(pipe)->pipe_slock);
#endif /* _KERNEL */
#endif /* !_SYS_PIPE_H_ */