summaryrefslogtreecommitdiff
path: root/file_io/unix
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2016-03-13 15:09:03 +0000
committerGraham Leggett <minfrin@apache.org>2016-03-13 15:09:03 +0000
commit5a653c27e54468210061f5f5dab8f11aa3428f94 (patch)
treeee7cb0be2d12fb99e332ad7f4a1cc4ba67f7bb0e /file_io/unix
parent4316b99199f505ac8eb15fcebb39e54518efe521 (diff)
downloadapr-5a653c27e54468210061f5f5dab8f11aa3428f94.tar.gz
apr_file_io: Add apr_file_pipe_create_pools() allowing a pair of
pipes to be created, each in a different pool. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1734816 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io/unix')
-rw-r--r--file_io/unix/pipe.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/file_io/unix/pipe.c b/file_io/unix/pipe.c
index 571d9bcb8..7be16e5d0 100644
--- a/file_io/unix/pipe.c
+++ b/file_io/unix/pipe.c
@@ -176,7 +176,8 @@ APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file,
return apr_os_pipe_put_ex(file, thefile, 0, pool);
}
-APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, apr_pool_t *pool)
+static apr_status_t file_pipe_create(apr_file_t **in, apr_file_t **out,
+ apr_pool_t *pool_in, apr_pool_t *pool_out)
{
int filedes[2];
@@ -184,8 +185,8 @@ APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out
return errno;
}
- (*in) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t));
- (*in)->pool = pool;
+ (*in) = (apr_file_t *)apr_pcalloc(pool_in, sizeof(apr_file_t));
+ (*in)->pool = pool_in;
(*in)->filedes = filedes[0];
(*in)->is_pipe = 1;
(*in)->fname = NULL;
@@ -200,8 +201,8 @@ APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out
#ifndef WAITIO_USES_POLL
(*in)->pollset = NULL;
#endif
- (*out) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t));
- (*out)->pool = pool;
+ (*out) = (apr_file_t *)apr_pcalloc(pool_out, sizeof(apr_file_t));
+ (*out)->pool = pool_out;
(*out)->filedes = filedes[1];
(*out)->is_pipe = 1;
(*out)->fname = NULL;
@@ -222,6 +223,30 @@ APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out
return APR_SUCCESS;
}
+static void file_pipe_block(apr_file_t **in, apr_file_t **out, apr_int32_t blocking)
+{
+ switch (blocking) {
+ case APR_FULL_BLOCK:
+ break;
+ case APR_READ_BLOCK:
+ apr_file_pipe_timeout_set(*out, 0);
+ break;
+ case APR_WRITE_BLOCK:
+ apr_file_pipe_timeout_set(*in, 0);
+ break;
+ default:
+ apr_file_pipe_timeout_set(*out, 0);
+ apr_file_pipe_timeout_set(*in, 0);
+ break;
+ }
+}
+
+APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in,
+ apr_file_t **out, apr_pool_t *pool)
+{
+ return file_pipe_create(in, out, pool, pool);
+}
+
APR_DECLARE(apr_status_t) apr_file_pipe_create_ex(apr_file_t **in,
apr_file_t **out,
apr_int32_t blocking,
@@ -229,23 +254,26 @@ APR_DECLARE(apr_status_t) apr_file_pipe_create_ex(apr_file_t **in,
{
apr_status_t status;
- if ((status = apr_file_pipe_create(in, out, pool)) != APR_SUCCESS)
+ if ((status = file_pipe_create(in, out, pool, pool)) != APR_SUCCESS) {
return status;
+ }
- switch (blocking) {
- case APR_FULL_BLOCK:
- break;
- case APR_READ_BLOCK:
- apr_file_pipe_timeout_set(*out, 0);
- break;
- case APR_WRITE_BLOCK:
- apr_file_pipe_timeout_set(*in, 0);
- break;
- default:
- apr_file_pipe_timeout_set(*out, 0);
- apr_file_pipe_timeout_set(*in, 0);
+ file_pipe_block(in, out, blocking);
+
+ return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_file_pipe_create_pools(apr_file_t **in,
+ apr_file_t **out, apr_int32_t blocking, apr_pool_t *pool_in, apr_pool_t *pool_out)
+{
+ apr_status_t status;
+
+ if ((status = file_pipe_create(in, out, pool_in, pool_out)) != APR_SUCCESS) {
+ return status;
}
+ file_pipe_block(in, out, blocking);
+
return APR_SUCCESS;
}