Index: src/OFAutoreleasePool.m ================================================================== --- src/OFAutoreleasePool.m +++ src/OFAutoreleasePool.m @@ -11,33 +11,17 @@ #import "config.h" #include -#ifndef _WIN32 -#include -#endif - #import "OFAutoreleasePool.h" +#import "OFList.h" +#import "OFThread.h" #import "OFExceptions.h" -#import "OFList.h" - -#ifdef _WIN32 -#include -#endif - -#ifndef _WIN32 -#define get_tls(t) pthread_getspecific(pool_list_key) -#define set_tls(t, v) pthread_setspecific(t, v) -static pthread_key_t pool_list_key; -#else -#define get_tls(t) TlsGetValue(t) -#define set_tls(t, v) TlsSetValue(t, v) -static DWORD pool_list_key; -#endif - -#ifndef _WIN32 + +static OFTLSKey *pool_list_key; + static void release_list(void *list) { of_list_object_t *first, *iter; IMP release; @@ -48,37 +32,35 @@ for (iter = first; iter != NULL; iter = iter->next) release(iter->object, @selector(release)); [(OFList*)list release]; } -#endif @implementation OFAutoreleasePool + initialize { -#ifndef _WIN32 - if (pthread_key_create(&pool_list_key, release_list)) - @throw [OFInitializationFailedException newWithClass: self]; -#else - /* FIXME: Free stuff when thread is terminated! */ - if ((pool_list_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) - @throw [OFInitializationFailedException newWithClass: self]; -#endif + pool_list_key = [[OFTLSKey alloc] initWithDestructor: release_list]; return self; } + (void)addToPool: (OFObject*)obj { - OFList *pool_list = get_tls(pool_list_key); + OFList *pool_list; - if (pool_list == nil || [pool_list last] == NULL) { + @try { + pool_list = [OFThread objectForTLSKey: pool_list_key]; + } @catch (OFNotInSetException *e) { + [e free]; [[self alloc] init]; - pool_list = get_tls(pool_list_key); + pool_list = [OFThread objectForTLSKey: pool_list_key]; } - if (pool_list == nil || [pool_list last] == NULL) + if ([pool_list last] == NULL) + [[self alloc] init]; + + if ([pool_list last] == NULL) @throw [OFInitializationFailedException newWithClass: self]; [[pool_list last]->object addToPool: obj]; } @@ -87,25 +69,29 @@ OFList *pool_list; self = [super init]; objects = nil; - pool_list = get_tls(pool_list_key); - if (pool_list == nil) { + @try { + pool_list = [OFThread objectForTLSKey: pool_list_key]; + } @catch (OFNotInSetException *e) { + [e free]; pool_list = [[OFList alloc] initWithoutRetainAndRelease]; - set_tls(pool_list_key, pool_list); + [OFThread setObject: pool_list + forTLSKey: pool_list_key]; + [pool_list release]; } listobj = [pool_list append: self]; return self; } - free { - [(OFList*)get_tls(pool_list_key) remove: listobj]; + [[OFThread objectForTLSKey: pool_list_key] remove: listobj]; return [super free]; } - addToPool: (OFObject*)obj Index: tests/OFAutoreleasePool/OFAutoreleasePool.m ================================================================== --- tests/OFAutoreleasePool/OFAutoreleasePool.m +++ tests/OFAutoreleasePool/OFAutoreleasePool.m @@ -100,7 +100,7 @@ [pool1 retain]; [pool1 release]; [pool1 release]; [o3 free]; - return (inits == 12 && retains == 1 && releases == 6 ? 0 : 1); + return (inits == 16 && retains == 2 && releases == 7 ? 0 : 1); }