Blame


1 cfa37a7b 2004-04-10 devnull .TH IOPROC 3
2 b2cfc4e2 2003-09-30 devnull .SH NAME
3 b2cfc4e2 2003-09-30 devnull closeioproc,
4 b2cfc4e2 2003-09-30 devnull iocall,
5 b2cfc4e2 2003-09-30 devnull ioclose,
6 b2cfc4e2 2003-09-30 devnull iointerrupt,
7 b2cfc4e2 2003-09-30 devnull iodial,
8 b2cfc4e2 2003-09-30 devnull ioopen,
9 b2cfc4e2 2003-09-30 devnull ioproc,
10 b2cfc4e2 2003-09-30 devnull ioread,
11 058b0118 2005-01-03 devnull ioread9pmsg,
12 b2cfc4e2 2003-09-30 devnull ioreadn,
13 058b0118 2005-01-03 devnull iorecvfd,
14 058b0118 2005-01-03 devnull iosendfd,
15 058b0118 2005-01-03 devnull iosleep,
16 b2cfc4e2 2003-09-30 devnull iowrite \- slave I/O processes for threaded programs
17 b2cfc4e2 2003-09-30 devnull .SH SYNOPSIS
18 b2cfc4e2 2003-09-30 devnull .PP
19 b2cfc4e2 2003-09-30 devnull .de XX
20 b2cfc4e2 2003-09-30 devnull .ift .sp 0.5
21 b2cfc4e2 2003-09-30 devnull .ifn .sp
22 b2cfc4e2 2003-09-30 devnull ..
23 b2cfc4e2 2003-09-30 devnull .EX
24 b2cfc4e2 2003-09-30 devnull .ta \w'Ioproc* 'u
25 b2cfc4e2 2003-09-30 devnull #include <u.h>
26 b2cfc4e2 2003-09-30 devnull #include <libc.h>
27 b2cfc4e2 2003-09-30 devnull #include <thread.h>
28 b2cfc4e2 2003-09-30 devnull .sp
29 b2cfc4e2 2003-09-30 devnull typedef struct Ioproc Ioproc;
30 b2cfc4e2 2003-09-30 devnull .sp
31 b2cfc4e2 2003-09-30 devnull Ioproc* ioproc(void);
32 b2cfc4e2 2003-09-30 devnull .XX
33 b2cfc4e2 2003-09-30 devnull int ioclose(Ioproc *io, int fd);
34 058b0118 2005-01-03 devnull int iodial(Ioproc *io, char *addr, char *local, char *dir, char *cdfp);
35 058b0118 2005-01-03 devnull int ioopen(Ioproc *io, char *file, int omode);
36 b2cfc4e2 2003-09-30 devnull long ioread(Ioproc *io, int fd, void *a, long n);
37 058b0118 2005-01-03 devnull int ioread9pmsg(Ioproc *io, int fd, void *a, uint n);
38 b2cfc4e2 2003-09-30 devnull long ioreadn(Ioproc *io, int fd, void *a, long n);
39 9a201244 2012-01-16 rsc int iorecvfd(Ioproc *io, int socket);
40 9a201244 2012-01-16 rsc int iosendfd(Ioproc *io, int socket, int fd);
41 9a201244 2012-01-16 rsc int iosleep(Ioproc *io, long milli);
42 b2cfc4e2 2003-09-30 devnull long iowrite(Ioproc *io, int fd, void *a, long n);
43 b2cfc4e2 2003-09-30 devnull .XX
44 b2cfc4e2 2003-09-30 devnull void iointerrupt(Ioproc *io);
45 b2cfc4e2 2003-09-30 devnull void closeioproc(Ioproc *io);
46 b2cfc4e2 2003-09-30 devnull .XX
47 b2cfc4e2 2003-09-30 devnull long iocall(Ioproc *io, long (*op)(va_list *arg), ...);
48 b2cfc4e2 2003-09-30 devnull .EE
49 b2cfc4e2 2003-09-30 devnull .SH DESCRIPTION
50 b2cfc4e2 2003-09-30 devnull .PP
51 b2cfc4e2 2003-09-30 devnull These routines provide access to I/O in slave procs.
52 b2cfc4e2 2003-09-30 devnull Since the I/O itself is done in a slave proc, other threads
53 b2cfc4e2 2003-09-30 devnull in the calling proc can run while the calling thread
54 b2cfc4e2 2003-09-30 devnull waits for the I/O to complete.
55 b2cfc4e2 2003-09-30 devnull .PP
56 b2cfc4e2 2003-09-30 devnull .I Ioproc
57 b2cfc4e2 2003-09-30 devnull forks a new slave proc and returns a pointer to the
58 b2cfc4e2 2003-09-30 devnull .B Ioproc
59 b2cfc4e2 2003-09-30 devnull associated with it.
60 b2cfc4e2 2003-09-30 devnull .I Ioproc
61 b2cfc4e2 2003-09-30 devnull uses
62 b2cfc4e2 2003-09-30 devnull .I mallocz
63 b2cfc4e2 2003-09-30 devnull and
64 b2cfc4e2 2003-09-30 devnull .IR proccreate ;
65 b2cfc4e2 2003-09-30 devnull if either fails, it calls
66 b2cfc4e2 2003-09-30 devnull .I sysfatal
67 b2cfc4e2 2003-09-30 devnull rather than return an error.
68 b2cfc4e2 2003-09-30 devnull .PP
69 058b0118 2005-01-03 devnull .IR Ioclose ,
70 058b0118 2005-01-03 devnull .IR iodial ,
71 058b0118 2005-01-03 devnull .IR ioopen ,
72 b2cfc4e2 2003-09-30 devnull .IR ioread ,
73 058b0118 2005-01-03 devnull .IR ioread9pmsg ,
74 b2cfc4e2 2003-09-30 devnull .IR ioreadn ,
75 058b0118 2005-01-03 devnull .IR iorecvfd ,
76 058b0118 2005-01-03 devnull .IR iosendfd ,
77 058b0118 2005-01-03 devnull .IR iosleep ,
78 b2cfc4e2 2003-09-30 devnull and
79 058b0118 2005-01-03 devnull .I iowrite
80 058b0118 2005-01-03 devnull execute the
81 b2cfc4e2 2003-09-30 devnull similarly named library or system calls
82 b2cfc4e2 2003-09-30 devnull (see
83 d32deab1 2020-08-16 rsc .MR close (2) ,
84 d32deab1 2020-08-16 rsc .MR dial (3) ,
85 d32deab1 2020-08-16 rsc .MR open (3) ,
86 d32deab1 2020-08-16 rsc .MR read (3) ,
87 d32deab1 2020-08-16 rsc .MR fcall (3) ,
88 d32deab1 2020-08-16 rsc .MR sendfd (3) ,
89 b2cfc4e2 2003-09-30 devnull and
90 d32deab1 2020-08-16 rsc .MR sleep (3) )
91 b2cfc4e2 2003-09-30 devnull in the slave process associated with
92 b2cfc4e2 2003-09-30 devnull .IR io .
93 b2cfc4e2 2003-09-30 devnull It is an error to execute more than one call
94 b2cfc4e2 2003-09-30 devnull at a time in an I/O proc.
95 b2cfc4e2 2003-09-30 devnull .PP
96 b2cfc4e2 2003-09-30 devnull .I Iointerrupt
97 b2cfc4e2 2003-09-30 devnull interrupts the call currently executing in the I/O proc.
98 b2cfc4e2 2003-09-30 devnull If no call is executing,
99 b2cfc4e2 2003-09-30 devnull .IR iointerrupt
100 b2cfc4e2 2003-09-30 devnull is a no-op.
101 b2cfc4e2 2003-09-30 devnull .PP
102 b2cfc4e2 2003-09-30 devnull .I Closeioproc
103 b2cfc4e2 2003-09-30 devnull terminates the I/O proc and frees the associated
104 b2cfc4e2 2003-09-30 devnull .B Ioproc .
105 b2cfc4e2 2003-09-30 devnull .PP
106 b2cfc4e2 2003-09-30 devnull .I Iocall
107 b2cfc4e2 2003-09-30 devnull is a primitive that may be used to implement
108 b2cfc4e2 2003-09-30 devnull more slave I/O routines.
109 b2cfc4e2 2003-09-30 devnull .I Iocall
110 b2cfc4e2 2003-09-30 devnull arranges for
111 b2cfc4e2 2003-09-30 devnull .I op
112 b2cfc4e2 2003-09-30 devnull to be called in
113 b2cfc4e2 2003-09-30 devnull .IR io 's
114 b2cfc4e2 2003-09-30 devnull proc, with
115 b2cfc4e2 2003-09-30 devnull .I arg
116 b2cfc4e2 2003-09-30 devnull set to the variable parameter list,
117 b2cfc4e2 2003-09-30 devnull returning the value that
118 b2cfc4e2 2003-09-30 devnull .I op
119 b2cfc4e2 2003-09-30 devnull returns.
120 b2cfc4e2 2003-09-30 devnull .SH EXAMPLE
121 b2cfc4e2 2003-09-30 devnull Relay messages between two file descriptors,
122 b2cfc4e2 2003-09-30 devnull counting the total number of bytes seen:
123 b2cfc4e2 2003-09-30 devnull .IP
124 b2cfc4e2 2003-09-30 devnull .EX
125 b2cfc4e2 2003-09-30 devnull .ta +\w'xxxx'u +\w'xxxx'u +\w'xxxx'u
126 b2cfc4e2 2003-09-30 devnull int tot;
127 b2cfc4e2 2003-09-30 devnull
128 b2cfc4e2 2003-09-30 devnull void
129 b2cfc4e2 2003-09-30 devnull relaythread(void *v)
130 b2cfc4e2 2003-09-30 devnull {
131 b2cfc4e2 2003-09-30 devnull int *fd, n;
132 b2cfc4e2 2003-09-30 devnull char buf[1024];
133 b2cfc4e2 2003-09-30 devnull Ioproc *io;
134 b2cfc4e2 2003-09-30 devnull
135 b2cfc4e2 2003-09-30 devnull fd = v;
136 b2cfc4e2 2003-09-30 devnull io = ioproc();
137 b2cfc4e2 2003-09-30 devnull while((n = ioread(io, fd[0], buf, sizeof buf)) > 0){
138 b2cfc4e2 2003-09-30 devnull if(iowrite(io, fd[1], buf, n) != n)
139 b2cfc4e2 2003-09-30 devnull sysfatal("iowrite: %r");
140 b2cfc4e2 2003-09-30 devnull tot += n;
141 b2cfc4e2 2003-09-30 devnull }
142 b2cfc4e2 2003-09-30 devnull closeioproc(io);
143 b2cfc4e2 2003-09-30 devnull }
144 b2cfc4e2 2003-09-30 devnull
145 b2cfc4e2 2003-09-30 devnull void
146 b2cfc4e2 2003-09-30 devnull relay(int fd0, int fd1)
147 b2cfc4e2 2003-09-30 devnull {
148 b2cfc4e2 2003-09-30 devnull int fd[4];
149 b2cfc4e2 2003-09-30 devnull
150 b2cfc4e2 2003-09-30 devnull fd[0] = fd[3] = fd0;
151 b2cfc4e2 2003-09-30 devnull fd[1] = fd[2] = fd1;
152 b2cfc4e2 2003-09-30 devnull threadcreate(relaythread, fd, 8192);
153 b2cfc4e2 2003-09-30 devnull threadcreate(relaythread, fd+2, 8192);
154 b2cfc4e2 2003-09-30 devnull }
155 b2cfc4e2 2003-09-30 devnull .EE
156 b2cfc4e2 2003-09-30 devnull .LP
157 881e5d1e 2008-07-21 t.lainson The two
158 b2cfc4e2 2003-09-30 devnull .I relaythread
159 881e5d1e 2008-07-21 t.lainson instances are running in the same proc, so the
160 b2cfc4e2 2003-09-30 devnull common access to
161 b2cfc4e2 2003-09-30 devnull .I tot
162 881e5d1e 2008-07-21 t.lainson is safe.
163 b2cfc4e2 2003-09-30 devnull .PP
164 b2cfc4e2 2003-09-30 devnull Implement
165 b2cfc4e2 2003-09-30 devnull .IR ioread :
166 b2cfc4e2 2003-09-30 devnull .IP
167 b2cfc4e2 2003-09-30 devnull .EX
168 b2cfc4e2 2003-09-30 devnull static long
169 b2cfc4e2 2003-09-30 devnull _ioread(va_list *arg)
170 b2cfc4e2 2003-09-30 devnull {
171 b2cfc4e2 2003-09-30 devnull int fd;
172 b2cfc4e2 2003-09-30 devnull void *a;
173 b2cfc4e2 2003-09-30 devnull long n;
174 b2cfc4e2 2003-09-30 devnull
175 b2cfc4e2 2003-09-30 devnull fd = va_arg(*arg, int);
176 b2cfc4e2 2003-09-30 devnull a = va_arg(*arg, void*);
177 b2cfc4e2 2003-09-30 devnull n = va_arg(*arg, long);
178 b2cfc4e2 2003-09-30 devnull return read(fd, a, n);
179 b2cfc4e2 2003-09-30 devnull }
180 b2cfc4e2 2003-09-30 devnull
181 b2cfc4e2 2003-09-30 devnull long
182 b2cfc4e2 2003-09-30 devnull ioread(Ioproc *io, int fd, void *a, long n)
183 b2cfc4e2 2003-09-30 devnull {
184 b2cfc4e2 2003-09-30 devnull return iocall(io, _ioread, fd, a, n);
185 b2cfc4e2 2003-09-30 devnull }
186 b2cfc4e2 2003-09-30 devnull .EE
187 b2cfc4e2 2003-09-30 devnull .SH SOURCE
188 c3674de4 2005-01-11 devnull .B \*9/src/libthread
189 b2cfc4e2 2003-09-30 devnull .SH SEE ALSO
190 d32deab1 2020-08-16 rsc .MR dial (3) ,
191 d32deab1 2020-08-16 rsc .MR open (3) ,
192 d32deab1 2020-08-16 rsc .MR read (3) ,
193 d32deab1 2020-08-16 rsc .MR thread (3)
194 058b0118 2005-01-03 devnull .SH BUGS
195 058b0118 2005-01-03 devnull .I Iointerrupt
196 058b0118 2005-01-03 devnull is currently unimplemented.
197 973131ad 2006-02-14 devnull .PP
198 973131ad 2006-02-14 devnull C99 disallows the use of pointers to
199 973131ad 2006-02-14 devnull .BR va_list .
200 973131ad 2006-02-14 devnull This interface will have to change to
201 973131ad 2006-02-14 devnull use pointers to a structure containing a
202 973131ad 2006-02-14 devnull .BR va_list .