summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Chisnall <dchisnall@pathscale.com>2011-11-25 09:14:05 +0000
committerDavid Chisnall <dchisnall@pathscale.com>2011-11-25 09:14:05 +0000
commited2ad4589fe2dbf5bd560de64b68e8609ab1a42b (patch)
tree40dcadee9522152e40c6e714f65c0c756aa11ef6 /src
parent8931d9e5180830a5433d16ae6b3ad8dd9e629512 (diff)
downloadlibcxxrt-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.cc44
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)