]> code.delx.au - pulseaudio/commitdiff
* split pa_cstrerror() into its own file polypcore/core-error.[ch]
authorLennart Poettering <lennart@poettering.net>
Thu, 25 May 2006 17:16:55 +0000 (17:16 +0000)
committerLennart Poettering <lennart@poettering.net>
Thu, 25 May 2006 17:16:55 +0000 (17:16 +0000)
* fix building of padsp
* remove a warning when compiling padsp.c

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@972 fefdeb5f-60dc-0310-8127-8f9354f1896f

49 files changed:
doc/todo
src/Makefile.am
src/daemon/caps.c
src/daemon/daemon-conf.c
src/daemon/main.c
src/modules/module-alsa-source.c
src/modules/module-detect.c
src/modules/module-esound-compat-spawnfd.c
src/modules/module-esound-compat-spawnpid.c
src/modules/module-esound-sink.c
src/modules/module-jack-sink.c
src/modules/module-jack-source.c
src/modules/module-match.c
src/modules/module-mmkbd-evdev.c
src/modules/module-oss-mmap.c
src/modules/module-oss.c
src/modules/module-pipe-sink.c
src/modules/module-pipe-source.c
src/modules/module-protocol-stub.c
src/modules/module-volume-restore.c
src/modules/oss-util.c
src/modules/rtp/module-rtp-recv.c
src/modules/rtp/module-rtp-send.c
src/modules/rtp/rtp.c
src/modules/rtp/sap.c
src/polyp/client-conf.c
src/polyp/context.c
src/polyp/error.c
src/polyp/error.h
src/polyp/mainloop-signal.c
src/polyp/mainloop.c
src/polyp/util.c
src/polypcore/authkey.c
src/polypcore/cli-command.c
src/polypcore/conf-parser.c
src/polypcore/core-error.c [new file with mode: 0644]
src/polypcore/core-error.h [new file with mode: 0644]
src/polypcore/core-scache.c
src/polypcore/core-util.c
src/polypcore/iochannel.c
src/polypcore/ioline.c
src/polypcore/pid.c
src/polypcore/protocol-esound.c
src/polypcore/protocol-simple.c
src/polypcore/socket-client.c
src/polypcore/socket-server.c
src/polypcore/socket-util.c
src/utils/pacmd.c
src/utils/padsp.c

index 1d17d3cc8341a483132084329e7101c33055846f..0b78ee9351aea33d141d93b1eb9a9b4e7b0ac3aa 100644 (file)
--- a/doc/todo
+++ b/doc/todo
@@ -2,8 +2,6 @@
 
 Pre 0.9.0
 - add API to query the bufferattrs after stream creation
-- add proper padsp script that makes $PADSP_xxx env vars from the command line arguments, just like esddsp does
-- move pa_cstrerror() to polypcore/core-error.h
 
 Post 0.9.0:
 - alsa mmap driver
index 16b5e9e3195b3b9f1faa4394c648bf21bcc96303..3a8c9bba7fdf0d6dafd1c5412ec2bb8cc6013007 100644 (file)
@@ -402,6 +402,7 @@ libpolyp_la_SOURCES += \
                polypcore/strbuf.c polypcore/strbuf.h \
                polypcore/strlist.c polypcore/strlist.h \
                polypcore/tagstruct.c polypcore/tagstruct.h \
+               polypcore/core-error.c polypcore/core-error.h \
                polypcore/winsock.h
 
 if OS_IS_WIN32
@@ -574,7 +575,8 @@ libpolypcore_la_SOURCES += \
                polypcore/source-output.c polypcore/source-output.h \
                polypcore/strbuf.c polypcore/strbuf.h \
                polypcore/tokenizer.c polypcore/tokenizer.h \
-               polypcore/winsock.h
+               polypcore/winsock.h \
+               polypcore/core-error.c polypcore/core-error.h
 
 if OS_IS_WIN32
 libpolypcore_la_SOURCES += \
@@ -1186,3 +1188,5 @@ install-exec-hook:
        chmod u+s $(DESTDIR)$(bindir)/polypaudio
        ln -sf pacat $(DESTDIR)$(bindir)/parec
        rm -f $(DESTDIR)$(modlibexecdir)/*.a
+
+.PHONY: utils/padsp
index 4942868c1971858d24f684ab17c4e705245a5ed2..5e24da821b0bbe9ff7257bd30c869d0db95eca9a 100644 (file)
@@ -32,7 +32,7 @@
 #include <sys/capability.h>
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 
 #include <polypcore/log.h>
 
index 809769f8e8c927efc980213a2167ea31e57f04b3..2d8d9558c32fbf56224a608b3391ae4b4af7b868 100644 (file)
@@ -29,9 +29,9 @@
 #include <assert.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/strbuf.h>
 #include <polypcore/conf-parser.h>
index 2fadd496cc361873351e295be7d7dadedcab281a..b88f932c3981e95de4689e885fbe0d80d0f48f87 100644 (file)
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/mainloop.h>
 #include <polyp/mainloop-signal.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core.h>
 #include <polypcore/memblock.h>
 #include <polypcore/module.h>
index c72b0322402ee3d04901f2352a44cf0559856a1a..414efda882abd8922437d5483e72c9a958c83a9f 100644 (file)
@@ -34,9 +34,9 @@
 
 #include <asoundlib.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core.h>
 #include <polypcore/module.h>
 #include <polypcore/memchunk.h>
index e4f2e3f970bb3dd60e822933f19d1ff998c1dbdb..d0a377330b49fd9b1290d586d7bb9a3c87cc182e 100644 (file)
@@ -33,9 +33,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/modargs.h>
 #include <polypcore/log.h>
index f59e9e218a80b3d33529ef0091ce247179533e1f..861e25709be28ee649dd51380eb40e9d0965da21 100644 (file)
@@ -28,8 +28,7 @@
 #include <string.h>
 #include <errno.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/modargs.h>
 #include <polypcore/core-util.h>
index c14ce12a661411c37b1bd623f41e3792a2368e66..7b47bb0ac823b90465c100cb219bbc2de8661a66 100644 (file)
@@ -28,8 +28,7 @@
 #include <errno.h>
 #include <signal.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index 72298679e320be0d4e0d1977ca2b151c91324dcd..53a9411a48c7103179eae323268b7ee19616f320 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index db2ba0303d17d162996f08fd6f3aec656c9147c9..fc2bfc452c3ed70fdf9beb3d6b83801dfa7733a2 100644 (file)
@@ -36,9 +36,9 @@
 
 #include <jack/jack.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index 8816fb8acd4840d135b7323059bfd2e0a5a45b5f..ca9560a689ec04713f0bae957d8af4f929caeec2 100644 (file)
@@ -36,9 +36,9 @@
 
 #include <jack/jack.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/source.h>
 #include <polypcore/module.h>
index f68f0c61597ab0c32718c24bb784b2fc0df1fe62..02d75e7efb448aa5170f96ed00cb5e424bdec44e 100644 (file)
@@ -32,9 +32,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index d6c91e2e57287dc9384e9ed4c508b1091fc095ac..ee2c6bffd96f4d12fec24b37729f5f2ce43693f9 100644 (file)
@@ -33,9 +33,9 @@
 
 #include <linux/input.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/log.h>
 #include <polypcore/namereg.h>
index dac7d7f334b8a013367dc3eb9ae62e2185652d09..5cf6228f26a631f9a13bb6c9c119ed9608765d9a 100644 (file)
@@ -36,9 +36,9 @@
 #include <limits.h>
 #include <sys/mman.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/source.h>
index 8e21785559df324e8d2f0eb7b32c7dcbfa2055ec..887246733f3678da97ee0b68a0fc12525d33a9ad 100644 (file)
@@ -35,9 +35,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/source.h>
index f0569ce99500da31dc2c541e93c5b19f79f52b9d..01598e38887b8f60ea73e70c22d2600f56d514b2 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/sink.h>
 #include <polypcore/module.h>
index 77212ce59e7a8398cb39fa815b6fa89849f810ce..be2a28d5164b72c2cc99c571e44e7b770f45f87d 100644 (file)
@@ -33,9 +33,9 @@
 #include <unistd.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/iochannel.h>
 #include <polypcore/source.h>
 #include <polypcore/module.h>
index 8eba352b6ae7c75e3dbc1de965ddbb29fda6233f..2b4f303b111bff012f9b7b25490e951f31b6710d 100644 (file)
@@ -42,9 +42,9 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/socket-server.h>
 #include <polypcore/socket-util.h>
index 796e43a36886d6bd2ff40bef50cbd9bf8b1c0762..435f0c9650d182e1f888a756bc6880ec2dbbf49e 100644 (file)
@@ -32,9 +32,9 @@
 #include <stdlib.h>
 #include <ctype.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/core-util.h>
 #include <polypcore/modargs.h>
index 027921c56714c3b98788e62f1c585b22e17cf242..ff337a5cea76b98fe404aa4915435bbf0b2a1611 100644 (file)
@@ -34,8 +34,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 8d9b33c2ac2fbda9fd7977006696663324a8aced..c448502ee594d75e8789b5dfe9611dccb7f92299 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/llist.h>
 #include <polypcore/sink.h>
index c8b3899a2ae1b65694c955c32094d9e7436a2fa4..4359d00d4323b568d3b481fe0a5e75e1c26834ea 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/util.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/module.h>
 #include <polypcore/llist.h>
 #include <polypcore/source.h>
index 012d6578553573075e14c4dffff571f0952bd910..52a1819c6e0ca5ba179043c11810b04c8491dbfa 100644 (file)
@@ -36,8 +36,7 @@
 #include <sys/filio.h>
 #endif
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 
 #include "rtp.h"
index 238ee42000696b7b361aa6b1c39086ea8b97a56f..134bab095ccc5f5704cf7e7c17b1e89a261d6e07 100644 (file)
@@ -38,9 +38,9 @@
 #include <sys/filio.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 0b3154c847f665b30e4e86f62d06be404071a4c2..e1934ce141f00eac5379022ee80b69fb68ece1fa 100644 (file)
@@ -29,7 +29,7 @@
 #include <errno.h>
 #include <string.h>
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/log.h>
index eb5638197c632ff2cbdfb475b26d98ae7a9ce792..68fb4bf3e091564234294d1022a599f06a4c642c 100644 (file)
@@ -47,7 +47,7 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/version.h>
 #include <polyp/xmalloc.h>
 
index 0e3b506f19a7340f26925cc84db161e094e0298f..27da7eae96694553f27e1a2bfb88471c2e165a1a 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-#ifdef HAVE_PTHREAD
-#include <pthread.h>
-#endif
-
-#ifdef HAVE_WINDOWS_H
-#include <windows.h>
-#endif
-
-#include <polyp/utf8.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/core-util.h>
 
 #include "error.h"
 
-static const char* const errortab[PA_ERR_MAX] = {
-    [PA_OK] = "OK",
-    [PA_ERR_ACCESS] = "Access denied",
-    [PA_ERR_COMMAND] = "Unknown command",
-    [PA_ERR_INVALID] = "Invalid argument",
-    [PA_ERR_EXIST] = "Entity exists",
-    [PA_ERR_NOENTITY] = "No such entity",
-    [PA_ERR_CONNECTIONREFUSED] = "Connection refused",
-    [PA_ERR_PROTOCOL] = "Protocol error",
-    [PA_ERR_TIMEOUT] = "Timeout",
-    [PA_ERR_AUTHKEY] = "No authorization key",
-    [PA_ERR_INTERNAL] = "Internal error",
-    [PA_ERR_CONNECTIONTERMINATED] = "Connection terminated",
-    [PA_ERR_KILLED] = "Entity killed",
-    [PA_ERR_INVALIDSERVER] = "Invalid server",
-    [PA_ERR_MODINITFAILED] = "Module initalization failed",
-    [PA_ERR_BADSTATE] = "Bad state",
-    [PA_ERR_NODATA] = "No data",
-    [PA_ERR_VERSION] = "Incompatible protocol version",
-    [PA_ERR_TOOLARGE] = "Too large"
-};
-
 const char*pa_strerror(int error) {
+
+    static const char* const errortab[PA_ERR_MAX] = {
+        [PA_OK] = "OK",
+        [PA_ERR_ACCESS] = "Access denied",
+        [PA_ERR_COMMAND] = "Unknown command",
+        [PA_ERR_INVALID] = "Invalid argument",
+        [PA_ERR_EXIST] = "Entity exists",
+        [PA_ERR_NOENTITY] = "No such entity",
+        [PA_ERR_CONNECTIONREFUSED] = "Connection refused",
+        [PA_ERR_PROTOCOL] = "Protocol error",
+        [PA_ERR_TIMEOUT] = "Timeout",
+        [PA_ERR_AUTHKEY] = "No authorization key",
+        [PA_ERR_INTERNAL] = "Internal error",
+        [PA_ERR_CONNECTIONTERMINATED] = "Connection terminated",
+        [PA_ERR_KILLED] = "Entity killed",
+        [PA_ERR_INVALIDSERVER] = "Invalid server",
+        [PA_ERR_MODINITFAILED] = "Module initalization failed",
+        [PA_ERR_BADSTATE] = "Bad state",
+        [PA_ERR_NODATA] = "No data",
+        [PA_ERR_VERSION] = "Incompatible protocol version",
+        [PA_ERR_TOOLARGE] = "Too large"
+    };
+
     if (error < 0 || error >= PA_ERR_MAX)
         return NULL;
 
     return errortab[error];
 }
-
-#ifdef HAVE_PTHREAD
-
-static pthread_once_t cstrerror_once = PTHREAD_ONCE_INIT;
-static pthread_key_t tlsstr_key;
-
-static void inittls(void) {
-    int ret;
-
-    ret = pthread_key_create(&tlsstr_key, pa_xfree);
-    if (ret) {
-        fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", errno);
-        exit(-1);
-    }
-}
-
-#elif HAVE_WINDOWS_H
-
-static DWORD tlsstr_key = TLS_OUT_OF_INDEXES;
-static DWORD monitor_key = TLS_OUT_OF_INDEXES;
-
-static void inittls(void) {
-    HANDLE mutex;
-    char name[64];
-
-    sprintf(name, "polypaudio%d", (int)GetCurrentProcessId());
-
-    mutex = CreateMutex(NULL, FALSE, name);
-    if (!mutex) {
-        fprintf(stderr, __FILE__ ": CRITICAL: Unable to create named mutex (%d)\n", (int)GetLastError());
-        exit(-1);
-    }
-
-    WaitForSingleObject(mutex, INFINITE);
-
-    if (tlsstr_key == TLS_OUT_OF_INDEXES) {
-        tlsstr_key = TlsAlloc();
-        monitor_key = TlsAlloc();
-        if ((tlsstr_key == TLS_OUT_OF_INDEXES) || (monitor_key == TLS_OUT_OF_INDEXES)) {
-            fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", (int)GetLastError());
-            exit(-1);
-        }
-    }
-
-    ReleaseMutex(mutex);
-
-    CloseHandle(mutex);
-}
-
-/*
- * This is incredibly brain dead, but this is necessary when dealing with
- * the hell that is Win32.
- */
-struct monitor_data {
-    HANDLE thread;
-    void *data;
-};
-
-static DWORD WINAPI monitor_thread(LPVOID param) {
-    struct monitor_data *data;
-
-    data = (struct monitor_data*)param;
-    assert(data);
-
-    WaitForSingleObject(data->thread, INFINITE);
-
-    CloseHandle(data->thread);
-    pa_xfree(data->data);
-    pa_xfree(data);
-
-    return 0;
-}
-
-static void start_monitor(void) {
-    HANDLE thread;
-    struct monitor_data *data;
-
-    data = pa_xnew(struct monitor_data, 1);
-    assert(data);
-
-    DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
-        GetCurrentProcess(), &data->thread, 0, FALSE, DUPLICATE_SAME_ACCESS);
-
-    thread = CreateThread(NULL, 0, monitor_thread, data, 0, NULL);
-    assert(thread);
-
-    TlsSetValue(monitor_key, data);
-
-    CloseHandle(thread);
-}
-
-#else
-
-/* Unsafe, but we have no choice */
-static char *tlsstr;
-
-#endif
-
-const char* pa_cstrerror(int errnum) {
-    const char *origbuf;
-
-#ifdef HAVE_STRERROR_R
-    char errbuf[128];
-#endif
-
-#ifdef HAVE_PTHREAD
-    char *tlsstr;
-
-    pthread_once(&cstrerror_once, inittls);
-
-    tlsstr = pthread_getspecific(tlsstr_key);
-#elif defined(HAVE_WINDOWS_H)
-    char *tlsstr;
-    struct monitor_data *data;
-
-    inittls();
-
-    tlsstr = TlsGetValue(tlsstr_key);
-    if (!tlsstr)
-        start_monitor();
-    data = TlsGetValue(monitor_key);
-#endif
-
-    if (tlsstr)
-        pa_xfree(tlsstr);
-
-#ifdef HAVE_STRERROR_R
-
-#ifdef __GLIBC__
-    origbuf = strerror_r(errnum, errbuf, sizeof(errbuf));
-    if (origbuf == NULL)
-        origbuf = "";
-#else
-    if (strerror_r(errnum, errbuf, sizeof(errbuf)) == 0) {
-        origbuf = errbuf;
-        errbuf[sizeof(errbuf) - 1] = '\0';
-    } else
-        origbuf = "";
-#endif
-
-#else
-    /* This might not be thread safe, but we hope for the best */
-    origbuf = strerror(errnum);
-#endif
-
-    tlsstr = pa_locale_to_utf8(origbuf);
-    if (!tlsstr) {
-        fprintf(stderr, "Unable to convert, filtering\n");
-        tlsstr = pa_utf8_filter(origbuf);
-    }
-
-#ifdef HAVE_PTHREAD
-    pthread_setspecific(tlsstr_key, tlsstr);
-#elif defined(HAVE_WINDOWS_H)
-    TlsSetValue(tlsstr_key, tlsstr);
-    data->data = tlsstr;
-#endif
-
-    return tlsstr;
-}
index 1d7b2ca646d6bab1ab01c628d00f04e9fa63bc85..9856c1af3c766719deb20836bfe79260b93c01ad 100644 (file)
@@ -33,12 +33,6 @@ PA_C_DECL_BEGIN
 /** Return a human readable error message for the specified numeric error code */
 const char* pa_strerror(int error);
 
-/** A wrapper around the standard strerror() function that converts the
- * string to UTF-8. The function is thread safe but the returned string is
- * only guaranteed to exist until the thread exits or pa_cstrerror() is
- * called again from the same thread. */
-const char* pa_cstrerror(int errnum);
-
 PA_C_DECL_END
 
 #endif
index c6ad431a102455d13ec7604bc5e0a04f11a78dc5..927028143d8f4b05d0cee3cffae49ebd6fa0d1a8 100644 (file)
@@ -36,7 +36,7 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/core-util.h>
index 6088fa4b3025fa88f9e172badca8b20a651c9682..61d8b4881093164244401b5634dfbc60e5c0bd16 100644 (file)
@@ -44,7 +44,7 @@
 #include "../polypcore/pipe.h"
 #endif
 
-#include <polyp/error.h>
+#include <polypcore/core-error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
index 910544834b880ced341105d64c85abc6d87419c4..842b9e7f8cf2a4d81a0ec3cbccf1ca004db843f5 100644 (file)
@@ -51,8 +51,7 @@
 
 #include "../polypcore/winsock.h"
 
-#include <polyp/error.h>
-
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
 
index 6b462a23b84bc80aa22ac49001b566296f329aa5..54f4dd868bc60ed04d97e499311cd556c5779165 100644 (file)
@@ -35,8 +35,8 @@
 #include <limits.h>
 #include <sys/stat.h>
 
-#include <polyp/error.h>
 #include <polyp/util.h>
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 #include <polypcore/random.h>
index 039aa9579e91bb595196331bc9b658fa0f692f36..e25e464ce76a2ce7b8551b348d26ef2ee7a54ee3 100644 (file)
@@ -29,7 +29,6 @@
 #include <stdlib.h>
 #include <errno.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/module.h>
@@ -50,6 +49,7 @@
 #include <polypcore/sound-file-stream.h>
 #include <polypcore/props.h>
 #include <polypcore/core-util.h>
+#include <polypcore/core-error.h>
 
 #include "cli-command.h"
 
index 4bcb83ddb1a168d2d48df3b2ae0c71a599b18410..d59bc55568b74f5d101dbd391b8e4e7cad809322 100644 (file)
@@ -28,9 +28,9 @@
 #include <stdio.h>
 #include <errno.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
 
diff --git a/src/polypcore/core-error.c b/src/polypcore/core-error.c
new file mode 100644 (file)
index 0000000..f2240a9
--- /dev/null
@@ -0,0 +1,205 @@
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+  You should have received a copy of the GNU Lesser General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#include <polyp/utf8.h>
+#include <polyp/xmalloc.h>
+
+#include <polypcore/core-util.h>
+#include <polypcore/native-common.h>
+
+#include "core-error.h"
+
+#ifdef HAVE_PTHREAD
+
+static pthread_once_t cstrerror_once = PTHREAD_ONCE_INIT;
+static pthread_key_t tlsstr_key;
+
+static void inittls(void) {
+    int ret;
+
+    ret = pthread_key_create(&tlsstr_key, pa_xfree);
+    if (ret) {
+        fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", errno);
+        exit(-1);
+    }
+}
+
+#elif HAVE_WINDOWS_H
+
+static DWORD tlsstr_key = TLS_OUT_OF_INDEXES;
+static DWORD monitor_key = TLS_OUT_OF_INDEXES;
+
+static void inittls(void) {
+    HANDLE mutex;
+    char name[64];
+
+    sprintf(name, "polypaudio%d", (int)GetCurrentProcessId());
+
+    mutex = CreateMutex(NULL, FALSE, name);
+    if (!mutex) {
+        fprintf(stderr, __FILE__ ": CRITICAL: Unable to create named mutex (%d)\n", (int)GetLastError());
+        exit(-1);
+    }
+
+    WaitForSingleObject(mutex, INFINITE);
+
+    if (tlsstr_key == TLS_OUT_OF_INDEXES) {
+        tlsstr_key = TlsAlloc();
+        monitor_key = TlsAlloc();
+        if ((tlsstr_key == TLS_OUT_OF_INDEXES) || (monitor_key == TLS_OUT_OF_INDEXES)) {
+            fprintf(stderr, __FILE__ ": CRITICAL: Unable to allocate TLS key (%d)\n", (int)GetLastError());
+            exit(-1);
+        }
+    }
+
+    ReleaseMutex(mutex);
+
+    CloseHandle(mutex);
+}
+
+/*
+ * This is incredibly brain dead, but this is necessary when dealing with
+ * the hell that is Win32.
+ */
+struct monitor_data {
+    HANDLE thread;
+    void *data;
+};
+
+static DWORD WINAPI monitor_thread(LPVOID param) {
+    struct monitor_data *data;
+
+    data = (struct monitor_data*)param;
+    assert(data);
+
+    WaitForSingleObject(data->thread, INFINITE);
+
+    CloseHandle(data->thread);
+    pa_xfree(data->data);
+    pa_xfree(data);
+
+    return 0;
+}
+
+static void start_monitor(void) {
+    HANDLE thread;
+    struct monitor_data *data;
+
+    data = pa_xnew(struct monitor_data, 1);
+    assert(data);
+
+    DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
+        GetCurrentProcess(), &data->thread, 0, FALSE, DUPLICATE_SAME_ACCESS);
+
+    thread = CreateThread(NULL, 0, monitor_thread, data, 0, NULL);
+    assert(thread);
+
+    TlsSetValue(monitor_key, data);
+
+    CloseHandle(thread);
+}
+
+#else
+
+/* Unsafe, but we have no choice */
+static char *tlsstr;
+
+#endif
+
+const char* pa_cstrerror(int errnum) {
+    const char *origbuf;
+
+#ifdef HAVE_STRERROR_R
+    char errbuf[128];
+#endif
+
+#ifdef HAVE_PTHREAD
+    char *tlsstr;
+
+    pthread_once(&cstrerror_once, inittls);
+
+    tlsstr = pthread_getspecific(tlsstr_key);
+#elif defined(HAVE_WINDOWS_H)
+    char *tlsstr;
+    struct monitor_data *data;
+
+    inittls();
+
+    tlsstr = TlsGetValue(tlsstr_key);
+    if (!tlsstr)
+        start_monitor();
+    data = TlsGetValue(monitor_key);
+#endif
+
+    if (tlsstr)
+        pa_xfree(tlsstr);
+
+#ifdef HAVE_STRERROR_R
+
+#ifdef __GLIBC__
+    origbuf = strerror_r(errnum, errbuf, sizeof(errbuf));
+    if (origbuf == NULL)
+        origbuf = "";
+#else
+    if (strerror_r(errnum, errbuf, sizeof(errbuf)) == 0) {
+        origbuf = errbuf;
+        errbuf[sizeof(errbuf) - 1] = '\0';
+    } else
+        origbuf = "";
+#endif
+
+#else
+    /* This might not be thread safe, but we hope for the best */
+    origbuf = strerror(errnum);
+#endif
+
+    tlsstr = pa_locale_to_utf8(origbuf);
+    if (!tlsstr) {
+        fprintf(stderr, "Unable to convert, filtering\n");
+        tlsstr = pa_utf8_filter(origbuf);
+    }
+
+#ifdef HAVE_PTHREAD
+    pthread_setspecific(tlsstr_key, tlsstr);
+#elif defined(HAVE_WINDOWS_H)
+    TlsSetValue(tlsstr_key, tlsstr);
+    data->data = tlsstr;
+#endif
+
+    return tlsstr;
+}
diff --git a/src/polypcore/core-error.h b/src/polypcore/core-error.h
new file mode 100644 (file)
index 0000000..17595c9
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef foocoreerrorhfoo
+#define foocoreerrorhfoo
+
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+  You should have received a copy of the GNU Lesser General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#include <inttypes.h>
+#include <polyp/cdecl.h>
+
+/** \file
+ * Error management */
+
+PA_C_DECL_BEGIN
+
+/** A wrapper around the standard strerror() function that converts the
+ * string to UTF-8. The function is thread safe but the returned string is
+ * only guaranteed to exist until the thread exits or pa_cstrerror() is
+ * called again from the same thread. */
+const char* pa_cstrerror(int errnum);
+
+PA_C_DECL_END
+
+#endif
index 1d60a910d6df0202e024a888b34bf75ff6625855..b44a7e198018fee7d5c89a1f5754742e719d67ac 100644 (file)
@@ -41,7 +41,6 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/mainloop.h>
 #include <polyp/channelmap.h>
 #include <polyp/timeval.h>
@@ -57,6 +56,7 @@
 #include <polypcore/sound-file.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "core-scache.h"
 
index bb6a3d85f413ae149370dfcc61338708510d50db..6cf281c5f284add86b8ec49569aac724c0d598a9 100644 (file)
 
 #include <samplerate.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 #include <polyp/util.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/winsock.h>
 #include <polypcore/log.h>
 
index 8af6a36bfe43e9ab6610e4dc6ac84b5a2a8ff261..106c413ec4b0d58922b3d8bd1a47165e2232ab45 100644 (file)
@@ -38,9 +38,9 @@
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/socket-util.h>
 #include <polypcore/log.h>
index 2e0a3e1af9477445fb3c37da0c0c89dce6578ddc..6a2ef338959bf500ed8af75053cdd4a46a07c8c9 100644 (file)
@@ -29,9 +29,9 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/log.h>
 
 #include "ioline.h"
index b8f53955d1541b2296f0c51e9b18d0c4e837af94..a5c0ef0b153501a7e11fedb66414f0691dc64306 100644 (file)
@@ -39,9 +39,9 @@
 #include <windows.h>
 #endif
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index d7c9475a528bea41047794fcbdff8b590a6db485..02e140b953f05a939739aa907efa577db5a482f2 100644 (file)
@@ -30,7 +30,6 @@
 #include <stdlib.h>
 #include <limits.h>
 
-#include <polyp/error.h>
 #include <polyp/sample.h>
 #include <polyp/timeval.h>
 #include <polyp/utf8.h>
@@ -49,6 +48,7 @@
 #include <polypcore/namereg.h>
 #include <polypcore/log.h>
 #include <polypcore/core-util.h>
+#include <polypcore/core-error.h>
 
 #include "endianmacros.h"
 
index f15f882ab986e34b887c7c6a66f29c2c8616622c..8b319d70fa7dc6bac9e233b5cfe61372b7e8c592 100644 (file)
@@ -30,7 +30,6 @@
 #include <errno.h>
 #include <string.h>
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
 #include <polypcore/sink-input.h>
@@ -39,6 +38,7 @@
 #include <polypcore/sample-util.h>
 #include <polypcore/namereg.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "protocol-simple.h"
 
index aa885759e3c1534fc7bc73f0bc41c02949b66fd1..fd840ab5b61fce0e1b80bd5f37df64b541444220 100644 (file)
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/timeval.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/socket-util.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
index 871fac11513bf289eccf4eb7b8d78f07487c62f6..17071ec27ce1100fdf6d5b787f0ea3133468d979 100644 (file)
 
 #include <polyp/xmalloc.h>
 #include <polyp/util.h>
-#include <polyp/error.h>
 
 #include <polypcore/socket-util.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
+#include <polypcore/core-error.h>
 
 #include "socket-server.h"
 
index 06cdc6253e816b342ed9f4dc264502a01457eb62..aefcb5eff073aa43feec3c5d35a8489b07cb21fb 100644 (file)
@@ -59,9 +59,9 @@
 
 #include "winsock.h"
 
-#include <polyp/error.h>
 #include <polyp/xmalloc.h>
 
+#include <polypcore/core-error.h>
 #include <polypcore/core-util.h>
 #include <polypcore/log.h>
 
index 351d79da77b5763314273298194840fa0bc273eb..ad50c77c7d41882b551ab4e73fca2ebdf96d37f3 100644 (file)
@@ -54,7 +54,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
     }
 
     if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-        pa_log(__FILE__": socket(PF_UNIX, SOCK_STREAM, 0): %s", pa_cstrerror(errno));
+        pa_log(__FILE__": socket(PF_UNIX, SOCK_STREAM, 0): %s", strerror(errno));
         goto fail;
     }
 
@@ -66,7 +66,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
         int r;
         
         if ((r = connect(fd, (struct sockaddr*) &sa, sizeof(sa))) < 0 && (errno != ECONNREFUSED && errno != ENOENT)) {
-            pa_log(__FILE__": connect(): %s", pa_cstrerror(errno));
+            pa_log(__FILE__": connect(): %s", strerror(errno));
             goto fail;
         }
             
@@ -97,7 +97,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
     
     for (;;) {
         if (select(FD_SETSIZE, &ifds, &ofds, NULL, NULL) < 0) {
-            pa_log(__FILE__": select(): %s", pa_cstrerror(errno));
+            pa_log(__FILE__": select(): %s", strerror(errno));
             goto fail;
         }
 
@@ -109,7 +109,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
                 if (r == 0)
                     break;
                 
-                pa_log(__FILE__": read(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": read(): %s", strerror(errno));
                 goto fail;
             }
             
@@ -125,7 +125,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
                 if (r == 0)
                     break;
                 
-                pa_log(__FILE__": read(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": read(): %s", strerror(errno));
                 goto fail;
             }
 
@@ -138,7 +138,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
             assert(obuf_length);
             
             if ((r = write(1, obuf + obuf_index, obuf_length)) < 0) {
-                pa_log(__FILE__": write(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": write(): %s", strerror(errno));
                 goto fail;
             }
             
@@ -152,7 +152,7 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char*argv[]) {
             assert(ibuf_length);
             
             if ((r = write(fd, ibuf + ibuf_index, ibuf_length)) < 0) {
-                pa_log(__FILE__": write(): %s", pa_cstrerror(errno));
+                pa_log(__FILE__": write(): %s", strerror(errno));
                 goto fail;
             }
             
index 5987ec5fae0e520c011b39af4992a36afbb69472..c1cc9c92cd179f0b7263046c4220fd0a659ae1bb 100644 (file)
@@ -361,7 +361,7 @@ static void reset_params(fd_info *i) {
     i->n_fragments = 0;
 }
 
-static char *client_name(char *buf, size_t n) {
+static const char *client_name(char *buf, size_t n) {
     char p[PATH_MAX];
     const char *e;
 
@@ -376,7 +376,7 @@ static char *client_name(char *buf, size_t n) {
     return buf;
 }
 
-static char *stream_name(void) {
+static const char *stream_name(void) {
     const char *e;
 
     if ((e = getenv("PADSP_STREAM_NAME")))