summaryrefslogtreecommitdiff
path: root/sys/kern/sys_pipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/sys_pipe.c')
-rw-r--r--sys/kern/sys_pipe.c100
1 files changed, 52 insertions, 48 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 5397009835e..2f3a9a045e2 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_pipe.c,v 1.94 2019/07/15 09:05:46 semarie Exp $ */
+/* $OpenBSD: sys_pipe.c,v 1.95 2019/07/16 12:16:58 semarie Exp $ */
/*
* Copyright (c) 1996 John S. Dyson
@@ -97,12 +97,12 @@ static unsigned int amountpipekva;
struct pool pipe_pool;
int dopipe(struct proc *, int *, int);
-void pipeclose(struct pipe *);
-int pipe_create(struct pipe *);
int pipelock(struct pipe *);
void pipeunlock(struct pipe *);
void pipeselwakeup(struct pipe *);
+struct pipe *pipe_create(void);
+void pipe_destroy(struct pipe *);
int pipe_buffer_realloc(struct pipe *, u_int);
void pipe_buffer_free(struct pipe *);
@@ -144,14 +144,11 @@ dopipe(struct proc *p, int *ufds, int flags)
cloexec = (flags & O_CLOEXEC) ? UF_EXCLOSE : 0;
- rpipe = pool_get(&pipe_pool, PR_WAITOK | PR_ZERO);
- error = pipe_create(rpipe);
- if (error != 0)
- goto free1;
- wpipe = pool_get(&pipe_pool, PR_WAITOK | PR_ZERO);
- error = pipe_create(wpipe);
- if (error != 0)
+ if (((rpipe = pipe_create()) == NULL) ||
+ ((wpipe = pipe_create()) == NULL)) {
+ error = ENOMEM;
goto free1;
+ }
fdplock(fdp);
@@ -202,8 +199,8 @@ free3:
free2:
fdpunlock(fdp);
free1:
- pipeclose(wpipe);
- pipeclose(rpipe);
+ pipe_destroy(wpipe);
+ pipe_destroy(rpipe);
return (error);
}
@@ -247,22 +244,27 @@ pipe_buffer_realloc(struct pipe *cpipe, u_int size)
/*
* initialize and allocate VM and memory for pipe
*/
-int
-pipe_create(struct pipe *cpipe)
+struct pipe *
+pipe_create(void)
{
+ struct pipe *cpipe;
int error;
- sigio_init(&cpipe->pipe_sigio);
+ cpipe = pool_get(&pipe_pool, PR_WAITOK | PR_ZERO);
error = pipe_buffer_realloc(cpipe, PIPE_SIZE);
- if (error != 0)
- return (error);
+ if (error != 0) {
+ pool_put(&pipe_pool, cpipe);
+ return (NULL);
+ }
+
+ sigio_init(&cpipe->pipe_sigio);
getnanotime(&cpipe->pipe_ctime);
cpipe->pipe_atime = cpipe->pipe_ctime;
cpipe->pipe_mtime = cpipe->pipe_ctime;
- return (0);
+ return (cpipe);
}
@@ -768,7 +770,7 @@ pipe_close(struct file *fp, struct proc *p)
fp->f_ops = NULL;
fp->f_data = NULL;
KERNEL_LOCK();
- pipeclose(cpipe);
+ pipe_destroy(cpipe);
KERNEL_UNLOCK();
return (0);
}
@@ -799,44 +801,46 @@ pipe_buffer_free(struct pipe *cpipe)
}
/*
- * shutdown the pipe
+ * shutdown the pipe, and free resources.
*/
void
-pipeclose(struct pipe *cpipe)
+pipe_destroy(struct pipe *cpipe)
{
struct pipe *ppipe;
- if (cpipe) {
- pipeselwakeup(cpipe);
- sigio_free(&cpipe->pipe_sigio);
- /*
- * If the other side is blocked, wake it up saying that
- * we want to close it down.
- */
- cpipe->pipe_state |= PIPE_EOF;
- while (cpipe->pipe_busy) {
- wakeup(cpipe);
- cpipe->pipe_state |= PIPE_WANTD;
- tsleep(cpipe, PRIBIO, "pipecl", 0);
- }
+ if (cpipe == NULL)
+ return;
- /*
- * Disconnect from peer
- */
- if ((ppipe = cpipe->pipe_peer) != NULL) {
- pipeselwakeup(ppipe);
+ pipeselwakeup(cpipe);
+ sigio_free(&cpipe->pipe_sigio);
- ppipe->pipe_state |= PIPE_EOF;
- wakeup(ppipe);
- ppipe->pipe_peer = NULL;
- }
+ /*
+ * If the other side is blocked, wake it up saying that
+ * we want to close it down.
+ */
+ cpipe->pipe_state |= PIPE_EOF;
+ while (cpipe->pipe_busy) {
+ wakeup(cpipe);
+ cpipe->pipe_state |= PIPE_WANTD;
+ tsleep(cpipe, PRIBIO, "pipecl", 0);
+ }
- /*
- * free resources
- */
- pipe_buffer_free(cpipe);
- pool_put(&pipe_pool, cpipe);
+ /*
+ * Disconnect from peer
+ */
+ if ((ppipe = cpipe->pipe_peer) != NULL) {
+ pipeselwakeup(ppipe);
+
+ ppipe->pipe_state |= PIPE_EOF;
+ wakeup(ppipe);
+ ppipe->pipe_peer = NULL;
}
+
+ /*
+ * free resources
+ */
+ pipe_buffer_free(cpipe);
+ pool_put(&pipe_pool, cpipe);
}
int