diff options
author | David Chisnall <dchisnall@pathscale.com> | 2011-11-25 09:14:05 +0000 |
---|---|---|
committer | David Chisnall <dchisnall@pathscale.com> | 2011-11-25 09:14:05 +0000 |
commit | ed2ad4589fe2dbf5bd560de64b68e8609ab1a42b (patch) | |
tree | 40dcadee9522152e40c6e714f65c0c756aa11ef6 /src | |
parent | 8931d9e5180830a5433d16ae6b3ad8dd9e629512 (diff) | |
download | libcxxrt-ed2ad4589fe2dbf5bd560de64b68e8609ab1a42b.tar.gz libcxxrt-ed2ad4589fe2dbf5bd560de64b68e8609ab1a42b.tar.bz2 libcxxrt-ed2ad4589fe2dbf5bd560de64b68e8609ab1a42b.tar.xz |
Simplify the weak symbol tests so that they're only done for things that we don't expect any OS (even the silly one) to have stubs for.
Diffstat (limited to 'src')
-rw-r--r-- | src/exception.cc | 44 |
1 files changed, 6 insertions, 38 deletions
diff --git a/src/exception.cc b/src/exception.cc index 2da7454..43a9e2f 100644 --- a/src/exception.cc +++ b/src/exception.cc @@ -12,12 +12,6 @@ #pragma weak pthread_setspecific #pragma weak pthread_getspecific #pragma weak pthread_once -#pragma weak pthread_once -#pragma weak pthread_cond_signal -#pragma weak pthread_cond_wait -#pragma weak pthread_mutex_lock -#pragma weak pthread_mutex_unlock - using namespace ABI_NAMESPACE; @@ -403,10 +397,7 @@ static char *emergency_malloc(size_t size) // Only 4 emergency buffers allowed per thread! if (info->emergencyBuffersHeld > 3) { return 0; } - if (pthread_mutex_lock) - { - pthread_mutex_lock(&emergency_malloc_lock); - } + pthread_mutex_lock(&emergency_malloc_lock); int buffer = -1; while (buffer < 0) { @@ -417,10 +408,7 @@ static char *emergency_malloc(size_t size) void *m = calloc(1, size); if (0 != m) { - if (pthread_mutex_unlock) - { - pthread_mutex_unlock(&emergency_malloc_lock); - } + pthread_mutex_unlock(&emergency_malloc_lock); return (char*)m; } for (int i=0 ; i<16 ; i++) @@ -437,24 +425,10 @@ static char *emergency_malloc(size_t size) // of the emergency buffers. if (buffer < 0) { - // If we don't have pthread_cond_wait, then there is only one - // thread and it's already used all of the emergency buffers, so we - // have no alternative but to die. Calling abort() instead of - // terminate, because terminate can throw exceptions, which can - // bring us back here and infinite loop. - if (!pthread_cond_wait) - { - fputs("Terminating while out of memory trying to throw an exception", - stderr); - abort(); - } pthread_cond_wait(&emergency_malloc_wait, &emergency_malloc_lock); } } - if (pthread_mutex_unlock) - { - pthread_mutex_unlock(&emergency_malloc_lock); - } + pthread_mutex_unlock(&emergency_malloc_lock); info->emergencyBuffersHeld++; return emergency_buffer + (1024 * buffer); } @@ -487,19 +461,13 @@ static void emergency_malloc_free(char *ptr) memset((void*)ptr, 0, 1024); // Signal the condition variable to wake up any threads that are blocking // waiting for some space in the emergency buffer - if (pthread_mutex_lock) - { - pthread_mutex_lock(&emergency_malloc_lock); - } + pthread_mutex_lock(&emergency_malloc_lock); // In theory, we don't need to do this with the lock held. In practice, // our array of bools will probably be updated using 32-bit or 64-bit // memory operations, so this update may clobber adjacent values. buffer_allocated[buffer] = false; - if (pthread_cond_signal && pthread_mutex_unlock) - { - pthread_cond_signal(&emergency_malloc_wait); - pthread_mutex_unlock(&emergency_malloc_lock); - } + pthread_cond_signal(&emergency_malloc_wait); + pthread_mutex_unlock(&emergency_malloc_lock); } static char *alloc_or_die(size_t size) |