pipe: replace PIPE_BUF macro pa pa_pipe_buf call
authorLennart Poettering <lennart@poettering.net>
Fri, 31 Jul 2009 23:59:58 +0000 (01:59 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 31 Jul 2009 23:59:58 +0000 (01:59 +0200)
This should help portability to platforms that lack PIPE_BUF. Based on a
patch from Samuel Thibault.

See ticket #546

src/modules/module-pipe-sink.c
src/modules/module-pipe-source.c
src/pulsecore/core-util.c
src/pulsecore/core-util.h

index 8a7dc84..9c16932 100644 (file)
@@ -122,7 +122,7 @@ static int process_render(struct userdata *u) {
     pa_assert(u);
 
     if (u->memchunk.length <= 0)
-        pa_sink_render(u->sink, PIPE_BUF, &u->memchunk);
+        pa_sink_render(u->sink, pa_pipe_buf(u->fd), &u->memchunk);
 
     pa_assert(u->memchunk.length > 0);
 
@@ -299,8 +299,8 @@ int pa__init(pa_module*m) {
 
     pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
     pa_sink_set_rtpoll(u->sink, u->rtpoll);
-    pa_sink_set_max_request(u->sink, PIPE_BUF);
-    pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(PIPE_BUF, &u->sink->sample_spec));
+    pa_sink_set_max_request(u->sink, pa_pipe_buf(u->fd));
+    pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(pa_pipe_buf(u->fd), &u->sink->sample_spec));
 
     u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
     pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
index e5609fb..49104f8 100644 (file)
@@ -142,7 +142,7 @@ static void thread_func(void *userdata) {
             void *p;
 
             if (!u->memchunk.memblock) {
-                u->memchunk.memblock = pa_memblock_new(u->core->mempool, PIPE_BUF);
+                u->memchunk.memblock = pa_memblock_new(u->core->mempool, pa_pipe_buf(u->fd));
                 u->memchunk.index = u->memchunk.length = 0;
             }
 
index 5f777d5..d01efa2 100644 (file)
@@ -2779,3 +2779,19 @@ char* pa_maybe_prefix_path(const char *path, const char *prefix) {
 
     return pa_sprintf_malloc("%s" PA_PATH_SEP "%s", prefix, path);
 }
+
+size_t pa_pipe_buf(int fd) {
+
+#ifdef _PC_PIPE_BUF
+    long n;
+
+    if ((n = fpathconf(fd, _PC_PIPE_BUF)) >= 0)
+        return (size_t) n;
+#endif
+
+#ifdef PIPE_BUF
+    return PIPE_BUF;
+#else
+    return 4096;
+#endif
+}
index 96a0480..b5e8453 100644 (file)
@@ -236,4 +236,7 @@ char **pa_split_spaces_strv(const char *s);
 
 char* pa_maybe_prefix_path(const char *path, const char *prefix);
 
+/* Returns size of the specified pipe or 4096 on failure */
+size_t pa_pipe_buf(int fd);
+
 #endif