diff options
Diffstat (limited to 'src/polypcore')
-rw-r--r-- | src/polypcore/authkey.c | 2 | ||||
-rw-r--r-- | src/polypcore/cli-command.c | 2 | ||||
-rw-r--r-- | src/polypcore/conf-parser.c | 2 | ||||
-rw-r--r-- | src/polypcore/core-error.c | 205 | ||||
-rw-r--r-- | src/polypcore/core-error.h | 41 | ||||
-rw-r--r-- | src/polypcore/core-scache.c | 2 | ||||
-rw-r--r-- | src/polypcore/core-util.c | 2 | ||||
-rw-r--r-- | src/polypcore/iochannel.c | 2 | ||||
-rw-r--r-- | src/polypcore/ioline.c | 2 | ||||
-rw-r--r-- | src/polypcore/pid.c | 2 | ||||
-rw-r--r-- | src/polypcore/protocol-esound.c | 2 | ||||
-rw-r--r-- | src/polypcore/protocol-simple.c | 2 | ||||
-rw-r--r-- | src/polypcore/socket-client.c | 2 | ||||
-rw-r--r-- | src/polypcore/socket-server.c | 2 | ||||
-rw-r--r-- | src/polypcore/socket-util.c | 2 |
15 files changed, 259 insertions, 13 deletions
diff --git a/src/polypcore/authkey.c b/src/polypcore/authkey.c index 6b462a23..54f4dd86 100644 --- a/src/polypcore/authkey.c +++ b/src/polypcore/authkey.c @@ -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> diff --git a/src/polypcore/cli-command.c b/src/polypcore/cli-command.c index 039aa957..e25e464c 100644 --- a/src/polypcore/cli-command.c +++ b/src/polypcore/cli-command.c @@ -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" diff --git a/src/polypcore/conf-parser.c b/src/polypcore/conf-parser.c index 4bcb83dd..d59bc555 100644 --- a/src/polypcore/conf-parser.c +++ b/src/polypcore/conf-parser.c @@ -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 index 00000000..f2240a9f --- /dev/null +++ b/src/polypcore/core-error.c @@ -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 index 00000000..17595c98 --- /dev/null +++ b/src/polypcore/core-error.h @@ -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 diff --git a/src/polypcore/core-scache.c b/src/polypcore/core-scache.c index 1d60a910..b44a7e19 100644 --- a/src/polypcore/core-scache.c +++ b/src/polypcore/core-scache.c @@ -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" diff --git a/src/polypcore/core-util.c b/src/polypcore/core-util.c index bb6a3d85..6cf281c5 100644 --- a/src/polypcore/core-util.c +++ b/src/polypcore/core-util.c @@ -69,10 +69,10 @@ #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> diff --git a/src/polypcore/iochannel.c b/src/polypcore/iochannel.c index 8af6a36b..106c413e 100644 --- a/src/polypcore/iochannel.c +++ b/src/polypcore/iochannel.c @@ -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> diff --git a/src/polypcore/ioline.c b/src/polypcore/ioline.c index 2e0a3e1a..6a2ef338 100644 --- a/src/polypcore/ioline.c +++ b/src/polypcore/ioline.c @@ -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" diff --git a/src/polypcore/pid.c b/src/polypcore/pid.c index b8f53955..a5c0ef0b 100644 --- a/src/polypcore/pid.c +++ b/src/polypcore/pid.c @@ -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> diff --git a/src/polypcore/protocol-esound.c b/src/polypcore/protocol-esound.c index d7c9475a..02e140b9 100644 --- a/src/polypcore/protocol-esound.c +++ b/src/polypcore/protocol-esound.c @@ -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" diff --git a/src/polypcore/protocol-simple.c b/src/polypcore/protocol-simple.c index f15f882a..8b319d70 100644 --- a/src/polypcore/protocol-simple.c +++ b/src/polypcore/protocol-simple.c @@ -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" diff --git a/src/polypcore/socket-client.c b/src/polypcore/socket-client.c index aa885759..fd840ab5 100644 --- a/src/polypcore/socket-client.c +++ b/src/polypcore/socket-client.c @@ -54,10 +54,10 @@ #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> diff --git a/src/polypcore/socket-server.c b/src/polypcore/socket-server.c index 871fac11..17071ec2 100644 --- a/src/polypcore/socket-server.c +++ b/src/polypcore/socket-server.c @@ -64,11 +64,11 @@ #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" diff --git a/src/polypcore/socket-util.c b/src/polypcore/socket-util.c index 06cdc625..aefcb5ef 100644 --- a/src/polypcore/socket-util.c +++ b/src/polypcore/socket-util.c @@ -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> |