Date: Sun, 31 May 2009 13:20:19 GMT From: Zhao Shuai <zhaoshuai@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 163165 for review Message-ID: <200905311320.n4VDKJVU076066@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163165 Change 163165 by zhaoshuai@zhaoshuai on 2009/05/31 13:20:06 new version of subr_pipe.c and sys_pipe.c, tested Affected files ... .. //depot/projects/soc2009/fifo/sys/conf/files#3 edit .. //depot/projects/soc2009/fifo/sys/kern/subr_pipe.c#2 edit .. //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#5 edit .. //depot/projects/soc2009/fifo/sys/sys/pipe.h#4 edit Differences ... ==== //depot/projects/soc2009/fifo/sys/conf/files#3 (text+ko) ==== @@ -1988,6 +1988,7 @@ kern/subr_msgbuf.c standard kern/subr_param.c standard kern/subr_pcpu.c standard +kern/subr_pipe.c standard kern/subr_power.c standard kern/subr_prf.c standard kern/subr_prof.c standard ==== //depot/projects/soc2009/fifo/sys/kern/subr_pipe.c#2 (text+ko) ==== @@ -175,7 +175,6 @@ &piperesizeallowed, 0, "Pipe resizing allowed"); static void pipeinit(void *dummy __unused); -static void pipeclose(struct pipe *cpipe); static void pipe_free_kmem(struct pipe *cpipe); static int pipe_create(struct pipe *pipe, int backing); static __inline int pipelock(struct pipe *cpipe, int catch); @@ -446,7 +445,6 @@ return (error); } -/* ARGSUSED */ int generic_pipe_read(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) @@ -1261,7 +1259,7 @@ * We shouldn't need locks here as we're doing a read and this should * be a natural race. */ -static int +int generic_pipe_stat(struct file *fp, struct stat *ub, struct ucred *active_cred, struct thread *td) { @@ -1323,8 +1321,7 @@ * shutdown the pipe */ void -pipeclose(cpipe) - struct pipe *cpipe; +pipeclose(struct pipe *cpipe) { struct pipepair *pp; struct pipe *ppipe; @@ -1489,23 +1486,25 @@ } int -generic_pipe_create(struct pipepair **p_pp, struct thread *td) +generic_pipe_create(struct thread *td, struct pipe **p_rpipe, struct pipe **p_wpipe) { struct pipepair *pp; struct pipe *rpipe, *wpipe; + int error; pp = uma_zalloc(pipe_zone, M_WAITOK); - *p_pp = pp; rpipe = &pp->pp_rpipe; wpipe = &pp->pp_wpipe; + *p_rpipe = rpipe; + *p_wpipe = wpipe; knlist_init(&rpipe->pipe_sel.si_note, PIPE_MTX(rpipe), NULL, NULL, NULL); knlist_init(&wpipe->pipe_sel.si_note, PIPE_MTX(wpipe), NULL, NULL, NULL); - if (pipe_create(rpipe, 1) != 0 || - pipe_create(wpipe, 0) != 0) { + if ((error = pipe_create(rpipe, 1)) != 0 || + (error = pipe_create(wpipe, 0)) != 0) { pipeclose(rpipe); pipeclose(wpipe); return (error); ==== //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#5 (text+ko) ==== @@ -74,16 +74,16 @@ { struct filedesc *fdp = td->td_proc->p_fd; struct file *rf, *wf; - struct pipepair *pp; + struct pipe *rpipe, *wpipe; int fd, error; - if ((error = generic_pipe_create(&pp, td)) != 0) + if ((error = generic_pipe_create(td, &rpipe, &wpipe)) != 0) return (error); error = falloc(td, &rf, &fd); if (error) { - pipeclose(&pp->rpipe); - pipeclose(&pp->wpipe); + pipeclose(rpipe); + pipeclose(wpipe); return (error); } /* An extra reference on `rf' has been held for us by falloc(). */ @@ -95,17 +95,17 @@ * to avoid races against processes which manage to dup() the read * side while we are blocked trying to allocate the write side. */ - finit(rf, FREAD | FWRITE, DTYPE_PIPE, &pp->rpipe, &pipeops); + finit(rf, FREAD | FWRITE, DTYPE_PIPE, rpipe, &pipeops); error = falloc(td, &wf, &fd); if (error) { fdclose(fdp, rf, fildes[0], td); fdrop(rf, td); /* rpipe has been closed by fdrop(). */ - pipeclose(&pp->wpipe); + pipeclose(wpipe); return (error); } /* An extra reference on `wf' has been held for us by falloc(). */ - finit(wf, FREAD | FWRITE, DTYPE_PIPE, &pp->wpipe, &pipeops); + finit(wf, FREAD | FWRITE, DTYPE_PIPE, wpipe, &pipeops); fdrop(wf, td); fildes[1] = fd; fdrop(rf, td); @@ -175,6 +175,9 @@ return generic_pipe_stat(fp, ub, active_cred, td); } +/* + * TODO: implement generic_pipe_close() in subr_pipe.c + */ static int pipe_close(struct file *fp, struct thread *td) { ==== //depot/projects/soc2009/fifo/sys/sys/pipe.h#4 (text+ko) ==== @@ -139,13 +139,20 @@ #define PIPE_UNLOCK(pipe) mtx_unlock(PIPE_MTX(pipe)) #define PIPE_LOCK_ASSERT(pipe, type) mtx_assert(PIPE_MTX(pipe), (type)) -/* - * The following functions are used by FIFO, - * see fs/fifo_vnops.c - */ -struct pipepair *pipepair_create(void); -fo_rdwr_t pipe_read; -fo_rdwr_t pipe_write; -void pipeclose(struct pipe *); +void pipeclose(struct pipe *cpipe); +int generic_pipe_read(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td); +int generic_pipe_write(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td); +int generic_pipe_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td); +int generic_pipe_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, + struct thread *td); +int generic_pipe_poll(struct file *fp, int events, struct ucred *active_cred, + struct thread *td); +int generic_pipe_stat(struct file *fp, struct stat *ub, struct ucred *active_cred, + struct thread *td); +int generic_pipe_kqfilter(struct file *fp, struct knote *kn); +int generic_pipe_create(struct thread *td, struct pipe **p_rpipe, struct pipe **p_wpipe); #endif /* !_SYS_PIPE_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905311320.n4VDKJVU076066>