Loading...
--- dyld/dyld-360.22/src/threadLocalVariables.c
+++ dyld/dyld-210.2.3/src/threadLocalVariables.c
@@ -73,12 +73,7 @@
#define MH_HAS_TLV_DESCRIPTORS 0x800000
#endif
-
-typedef void (*TermFunc)(void*);
-
-
-
-#if __has_feature(tls) || __arm64__ || __arm__
+#if __i386__ || __x86_64__
typedef struct TLVHandler {
struct TLVHandler *next;
@@ -170,12 +165,9 @@
void* tlv_allocate_and_initialize_for_key(pthread_key_t key)
{
const struct mach_header* mh = tlv_get_image_for_key(key);
- if ( mh == NULL )
- return NULL; // if data structures are screwed up, don't crash
-
// first pass, find size and template
uint8_t* start = NULL;
- unsigned long size = 0;
+ unsigned long size;
intptr_t slide = 0;
bool slideComputed = false;
bool hasInitializers = false;
@@ -237,8 +229,8 @@
if ( (sect->flags & SECTION_TYPE) == S_THREAD_LOCAL_INIT_FUNCTION_POINTERS ) {
typedef void (*InitFunc)(void);
InitFunc* funcs = (InitFunc*)(sect->addr + slide);
- const size_t count = sect->size / sizeof(uintptr_t);
- for (size_t i=count; i > 0; --i) {
+ const uint32_t count = sect->size / sizeof(uintptr_t);
+ for (uint32_t i=count; i > 0; --i) {
InitFunc func = funcs[i-1];
func();
}
@@ -368,6 +360,7 @@
// destructor key to come before the deallocation key.
//
+typedef void (*TermFunc)(void*);
struct TLVTerminatorListEntry
{
TermFunc termFunc;
@@ -401,7 +394,7 @@
if ( list->allocCount == list->allocCount ) {
// handle resizing allocation
uint32_t newAllocCount = list->allocCount * 2;
- size_t newAllocSize = offsetof(struct TLVTerminatorList, entries[newAllocCount]);
+ uint32_t newAllocSize = offsetof(struct TLVTerminatorList, entries[newAllocCount]);
struct TLVTerminatorList* newlist = (struct TLVTerminatorList*)malloc(newAllocSize);
newlist->allocCount = newAllocCount;
newlist->useCount = list->useCount;
@@ -418,29 +411,18 @@
}
}
-// called by pthreads when the current thread is going away and
+// called by pthreads when the current thread is going way and
// _tlv_atexit() has been called on the thread.
static void tlv_finalize(void* storage)
{
struct TLVTerminatorList* list = (struct TLVTerminatorList*)storage;
- // destroy in reverse order of construction
- for(uint32_t i=list->useCount; i > 0 ; --i) {
- struct TLVTerminatorListEntry* entry = &list->entries[i-1];
+ for(uint32_t i=0; i < list->useCount; ++i) {
+ struct TLVTerminatorListEntry* entry = &list->entries[i];
if ( entry->termFunc != NULL ) {
(*entry->termFunc)(entry->objAddr);
}
}
free(storage);
-}
-
-// <rdar://problem/13741816>
-// called by exit() before it calls cxa_finalize() so that thread_local
-// objects are destroyed before global objects.
-void _tlv_exit()
-{
- void* termFuncs = pthread_getspecific(tlv_terminators_key);
- if ( termFuncs != NULL )
- tlv_finalize(termFuncs);
}
@@ -464,9 +446,9 @@
}
-
+// __i386__ || __x86_64__
#else
-
+// !(__i386__ || __x86_64__)
void dyld_register_tlv_state_change_handler(enum dyld_tlv_states state, dyld_tlv_state_change_handler handler)
@@ -474,14 +456,6 @@
}
void dyld_enumerate_tlv_storage(dyld_tlv_state_change_handler handler)
-{
-}
-
-void _tlv_exit()
-{
-}
-
-void _tlv_atexit(TermFunc func, void* objAddr)
{
}
@@ -491,7 +465,7 @@
}
-
-#endif // __has_feature(tls)
-
-
+// !(__i386__ || __x86_64__)
+#endif
+
+