diff options
author | Lennart Poettering <lennart@poettering.net> | 2006-05-25 17:16:55 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2006-05-25 17:16:55 +0000 |
commit | 4413b89d7a45587b545a31463ad2196767f45563 (patch) | |
tree | 9ee88c2132a6940c1bc24c1e1cb0754f69337f6b /src/polyp | |
parent | f8aa55c5ac1f21fec9e1a5f0351328fb33366f2a (diff) | |
download | pulseaudio-4413b89d7a45587b545a31463ad2196767f45563.tar.gz |
* split pa_cstrerror() into its own file polypcore/core-error.[ch]
* 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
Diffstat (limited to 'src/polyp')
-rw-r--r-- | src/polyp/client-conf.c | 2 | ||||
-rw-r--r-- | src/polyp/context.c | 2 | ||||
-rw-r--r-- | src/polyp/error.c | 214 | ||||
-rw-r--r-- | src/polyp/error.h | 6 | ||||
-rw-r--r-- | src/polyp/mainloop-signal.c | 2 | ||||
-rw-r--r-- | src/polyp/mainloop.c | 2 | ||||
-rw-r--r-- | src/polyp/util.c | 3 |
7 files changed, 28 insertions, 203 deletions
diff --git a/src/polyp/client-conf.c b/src/polyp/client-conf.c index 0b3154c84..e1934ce14 100644 --- a/src/polyp/client-conf.c +++ b/src/polyp/client-conf.c @@ -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> diff --git a/src/polyp/context.c b/src/polyp/context.c index eb5638197..68fb4bf3e 100644 --- a/src/polyp/context.c +++ b/src/polyp/context.c @@ -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> diff --git a/src/polyp/error.c b/src/polyp/error.c index 0e3b506f1..27da7eae9 100644 --- a/src/polyp/error.c +++ b/src/polyp/error.c @@ -28,15 +28,6 @@ #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> @@ -44,191 +35,32 @@ #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; -} diff --git a/src/polyp/error.h b/src/polyp/error.h index 1d7b2ca64..9856c1af3 100644 --- a/src/polyp/error.h +++ b/src/polyp/error.h @@ -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 diff --git a/src/polyp/mainloop-signal.c b/src/polyp/mainloop-signal.c index c6ad431a1..927028143 100644 --- a/src/polyp/mainloop-signal.c +++ b/src/polyp/mainloop-signal.c @@ -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> diff --git a/src/polyp/mainloop.c b/src/polyp/mainloop.c index 6088fa4b3..61d8b4881 100644 --- a/src/polyp/mainloop.c +++ b/src/polyp/mainloop.c @@ -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> diff --git a/src/polyp/util.c b/src/polyp/util.c index 910544834..842b9e7f8 100644 --- a/src/polyp/util.c +++ b/src/polyp/util.c @@ -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> |