├── .DS_Store ├── ActorKit ├── en.lproj │ └── InfoPlist.strings ├── .DS_Store ├── ActorKit-Prefix.pch ├── NSInvocation+Copy.h ├── NSArray+Actor.h ├── NSThread+Actor.h ├── NSArray+Actor.m ├── NSObject+Actor.h ├── ActorKit.h ├── BatchProxy.h ├── Mutex.h ├── ThreadSafeProxy.h ├── NSInvocation+Copy.m ├── ActorKit-Info.plist ├── NSThread+Actor.m ├── ActorProxy.h ├── ThreadSafeProxy.m ├── FutureProxy.h ├── Mutex.m ├── NSObject+Actor.m ├── BatchProxy.m ├── FutureProxy.m └── ActorProxy.m ├── license └── bsd_license.txt ├── ActorKit.xcodeproj ├── xcuserdata │ └── steve.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── ActorKit.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── steve.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── WorkspaceSettings.xcsettings └── project.pbxproj ├── ReadMe.md └── _unused └── README.txt /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevedekorte/ActorKit/HEAD/.DS_Store -------------------------------------------------------------------------------- /ActorKit/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ActorKit/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevedekorte/ActorKit/HEAD/ActorKit/.DS_Store -------------------------------------------------------------------------------- /license/bsd_license.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevedekorte/ActorKit/HEAD/license/bsd_license.txt -------------------------------------------------------------------------------- /ActorKit.xcodeproj/xcuserdata/steve.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /ActorKit/ActorKit-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ActorKit' target in the 'ActorKit' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ActorKit/NSInvocation+Copy.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | @interface NSInvocation (NSInvocation_Copy) 9 | 10 | - (id)copy; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/project.xcworkspace/xcuserdata/steve.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevedekorte/ActorKit/HEAD/ActorKit.xcodeproj/project.xcworkspace/xcuserdata/steve.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ActorKit/NSArray+Actor.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import 9 | #import "BatchProxy.h" 10 | 11 | @interface NSArray (NSArray_Actor) 12 | 13 | - asBatch; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ActorKit/NSThread+Actor.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import 9 | 10 | @interface NSThread (NSThread_Actor) 11 | 12 | - (void)setWaitingOnFuture:(id)aFuture; 13 | - waitingOnFuture; 14 | 15 | - (NSLock *)lock; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ActorKit/NSArray+Actor.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "BatchProxy.h" 9 | #import "NSObject+Actor.h" 10 | 11 | @implementation NSArray (NSArray_Actor) 12 | 13 | - asBatch { 14 | return [self proxyForProxyClass:[BatchProxy class]]; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ActorKit/NSObject+Actor.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "ActorProxy.h" 9 | #import "ThreadSafeProxy.h" 10 | #import "BatchProxy.h" 11 | 12 | @interface NSObject (NSObject_Actor) 13 | 14 | - proxyForProxyClass:(Class)aClass; 15 | 16 | - asActor; 17 | - asThreadSafe; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ActorKit/ActorKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // ActorKit.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "ActorProxy.h" 9 | #import "BatchProxy.h" 10 | #import "ThreadSafeProxy.h" 11 | #import "NSObject+Actor.h" 12 | #import "NSArray+Actor.h" 13 | 14 | // private 15 | 16 | /* 17 | #import "FutureProxy.h" 18 | #import "Mutex.h" 19 | #import "NSThread+Actor.h" 20 | */ 21 | -------------------------------------------------------------------------------- /ActorKit/BatchProxy.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | @interface BatchProxy : NSProxy { 9 | // using the "batch" prefix to avoid name conflict with proxied object 10 | id batchTarget; 11 | } 12 | 13 | // private 14 | 15 | @property (retain, atomic) id batchTarget; 16 | 17 | - (void)setProxyTarget:anObject; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ActorKit/Mutex.h: -------------------------------------------------------------------------------- 1 | // 2 | // Mutex.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | @interface Mutex : NSObject { 9 | pthread_mutexattr_t mutexAttributes; 10 | pthread_mutex_t mutex; 11 | 12 | pthread_condattr_t conditionAttributes; 13 | pthread_cond_t condition; 14 | 15 | BOOL isPaused; 16 | } 17 | 18 | - (BOOL)isPaused; 19 | - (void)pauseThread; 20 | - (void)resumeAnyWaitingThreads; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/project.xcworkspace/xcuserdata/steve.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ActorKit/ThreadSafeProxy.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | // A simple proxy wrapper that synchronizes all messages to the target 8 | // 9 | 10 | @interface ThreadSafeProxy : NSProxy { 11 | id threadSafeProxyTarget; 12 | NSLock *threadSafeProxyLock; 13 | } 14 | 15 | // all private 16 | 17 | @property (retain, atomic) id threadSafeProxyTarget; 18 | @property (retain, atomic) NSLock *threadSafeProxyLock; 19 | 20 | - (void)setThreadSafeProxyTarget:anObject; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/xcuserdata/steve.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ActorKit.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | AABB5D94140E0C220020BA06 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ActorKit/NSInvocation+Copy.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "NSInvocation+Copy.h" 9 | 10 | @implementation NSInvocation (NSInvocation_Copy) 11 | 12 | - (id)copy { 13 | NSInvocation *copy = [NSInvocation invocationWithMethodSignature:[self methodSignature]]; 14 | NSUInteger argCount = [[self methodSignature] numberOfArguments]; 15 | 16 | for (int i = 0; i < argCount; i++) { 17 | char buffer[sizeof(intmax_t)]; 18 | [self getArgument:(void *)&buffer atIndex:i]; 19 | [copy setArgument:(void *)&buffer atIndex:i]; 20 | } 21 | 22 | return copy; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ActorKit/ActorKit-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSHumanReadableCopyright 26 | Copyright © 2011 Steve Dekorte. BSD licensed. 27 | NSPrincipalClass 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /ActorKit/NSThread+Actor.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "NSThread+Actor.h" 9 | #import "Mutex.h" 10 | 11 | @implementation NSThread (NSThread_Actor) 12 | 13 | // future 14 | 15 | - (void)setWaitingOnFuture:(id)anObject { 16 | if (anObject == nil) { 17 | [[self threadDictionary] removeObjectForKey:@"waitingOnFuture"]; 18 | } else { 19 | [[self threadDictionary] setObject:anObject forKey:@"waitingOnFuture"]; 20 | } 21 | } 22 | 23 | - waitingOnFuture { 24 | return [[self threadDictionary] objectForKey:@"waitingOnFuture"]; 25 | } 26 | 27 | // lock 28 | 29 | - (void)setLock:(id)anObject { 30 | if (anObject == nil) { 31 | [[self threadDictionary] removeObjectForKey:@"lock"]; 32 | } else { 33 | [[self threadDictionary] setObject:anObject forKey:@"lock"]; 34 | } 35 | } 36 | 37 | - (NSLock *)lock { 38 | NSLock *lock = [[self threadDictionary] objectForKey:@"lock"]; 39 | 40 | if (lock == nil) { 41 | lock = [[[NSLock alloc] init] autorelease]; 42 | [self setLock:lock]; 43 | } 44 | 45 | return lock; 46 | } 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /ActorKit/ActorProxy.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "FutureProxy.h" 9 | #import "Mutex.h" 10 | #import "NSThread+Actor.h" 11 | 12 | @interface ActorProxy : NSProxy { 13 | // using the "actor" prefix to avoid name conflict with proxied object 14 | id actorTarget; 15 | Mutex *actorMutex; 16 | FutureProxy *firstFuture; 17 | NSThread *actorThread; 18 | size_t actorQueueSize; 19 | size_t actorQueueLimit; // if zero, there is no limit 20 | } 21 | 22 | // all private 23 | 24 | @property (retain, atomic) id actorTarget; 25 | @property (retain, atomic) Mutex *actorMutex; 26 | @property (retain, atomic) FutureProxy *firstFuture; 27 | @property (retain, atomic) NSThread *actorThread; 28 | @property (assign, atomic) size_t actorQueueSize; 29 | 30 | - (void)setProxyTarget:anObject; 31 | 32 | // public 33 | 34 | @property (assign, atomic) size_t actorQueueLimit; 35 | 36 | + (ActorProxy *)currentActorProxy; 37 | 38 | - (id)pauseThread; // returns with object passed to resumeThreadWithReturnObject: 39 | - (void)resumeThread; 40 | - (void)resumeThreadWithReturnObject:(id)returnValue; 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /ActorKit/ThreadSafeProxy.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "ThreadSafeProxy.h" 9 | 10 | 11 | @implementation ThreadSafeProxy 12 | 13 | @synthesize threadSafeProxyTarget; 14 | @synthesize threadSafeProxyLock; 15 | 16 | - init { 17 | [self setThreadSafeProxyLock:[[[NSLock alloc] init] autorelease]]; 18 | return self; 19 | } 20 | 21 | - (void)dealloc { 22 | [self setThreadSafeProxyTarget:nil]; 23 | [self setThreadSafeProxyLock:nil]; 24 | [super dealloc]; 25 | } 26 | 27 | - (void)setProxyTarget:anObject { 28 | [self setThreadSafeProxyTarget:anObject]; 29 | [threadSafeProxyLock setName:[threadSafeProxyTarget description]]; 30 | } 31 | 32 | - (BOOL)respondsToSelector:(SEL)aSelector { 33 | return [threadSafeProxyLock respondsToSelector:aSelector]; 34 | } 35 | 36 | - (void)forwardInvocation:(NSInvocation *)anInvocation { 37 | // probably could have used @synchronized() {} 38 | // but access to the lock object might be useful later 39 | 40 | [threadSafeProxyLock lock]; 41 | [anInvocation invokeWithTarget:threadSafeProxyTarget]; 42 | [threadSafeProxyLock unlock]; 43 | } 44 | 45 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 46 | return [threadSafeProxyTarget methodSignatureForSelector:aSelector]; 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /ActorKit/FutureProxy.h: -------------------------------------------------------------------------------- 1 | // 2 | // Future.h 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | 7 | #import "Mutex.h" 8 | 9 | @interface FutureProxy : NSProxy { 10 | // these use the "future" prefix/suffix to avoid name collision with proxy target 11 | 12 | id futureActor; 13 | NSInvocation *futureInvocation; 14 | id futureValue; 15 | id nextFuture; 16 | BOOL done; 17 | NSMutableSet *futureWaitingThreads; 18 | NSException *futureException; 19 | Mutex *futureLock; // used to pause any threads accessing future before it is done 20 | Mutex *futureQueueLimitMutex; // used to pause the thread sending the message if the actor q limit is reached 21 | } 22 | 23 | // these are all private 24 | 25 | @property (assign, atomic) id futureActor; 26 | @property (retain, atomic) NSInvocation *futureInvocation; 27 | @property (retain, atomic) id futureValue; 28 | @property (retain, atomic) id nextFuture; 29 | @property (retain, atomic) NSMutableSet *futureWaitingThreads; 30 | @property (retain, atomic) NSException *futureException; 31 | @property (retain, atomic) Mutex *futureLock; 32 | @property (retain, atomic) Mutex *futureQueueLimitMutex; 33 | 34 | - (id)init; 35 | 36 | - (void)futureAppend:(FutureProxy *)aFuture; 37 | - (void)futureSend; 38 | 39 | - (void)setFutureResult:(id)anObject; 40 | - futureResult; 41 | 42 | - (void)pauseThreadOnQueueLimitMutex; 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /ActorKit/Mutex.m: -------------------------------------------------------------------------------- 1 | // 2 | // Mutex.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "Mutex.h" 9 | #import 10 | 11 | @implementation Mutex 12 | 13 | - (id)init { 14 | self = [super init]; 15 | 16 | if (self) 17 | { 18 | pthread_mutexattr_init(&mutexAttributes); 19 | pthread_mutexattr_settype(&mutexAttributes, PTHREAD_MUTEX_RECURSIVE); 20 | pthread_mutex_init(&mutex, &mutexAttributes); 21 | 22 | pthread_condattr_init(&conditionAttributes); 23 | pthread_cond_init(&condition, &conditionAttributes); 24 | } 25 | 26 | return self; 27 | } 28 | 29 | - (void)dealloc { 30 | pthread_mutexattr_destroy(&mutexAttributes); 31 | pthread_mutex_destroy(&mutex); 32 | pthread_cond_destroy(&condition); 33 | pthread_condattr_destroy(&conditionAttributes); 34 | [super dealloc]; 35 | } 36 | 37 | - (BOOL)isPaused { 38 | return isPaused; 39 | } 40 | 41 | - (void)pauseThread { 42 | // have do be carefull about pauses and resumes mixing... 43 | 44 | pthread_mutex_lock(&mutex); 45 | isPaused = YES; 46 | 47 | while (isPaused) { 48 | pthread_cond_wait(&condition, &mutex); 49 | } 50 | 51 | pthread_mutex_unlock(&mutex); 52 | } 53 | 54 | - (void)resumeAnyWaitingThreads { 55 | if (isPaused) { 56 | pthread_mutex_lock(&mutex); 57 | isPaused = NO; 58 | pthread_cond_broadcast(&condition); 59 | pthread_mutex_unlock(&mutex); 60 | } 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /ActorKit/NSObject+Actor.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "NSObject+Actor.h" 9 | #import 10 | 11 | @implementation NSObject (NSObject_Actor) 12 | 13 | - proxyForProxyClass:(Class)aClass { 14 | id obj = objc_getAssociatedObject(self, (void *)aClass); 15 | 16 | if (!obj) { 17 | obj = [[[aClass alloc] init] autorelease]; 18 | [obj setProxyTarget:self]; 19 | objc_setAssociatedObject(self, aClass, obj, OBJC_ASSOCIATION_ASSIGN); 20 | } 21 | 22 | return (id)obj; 23 | } 24 | 25 | - asActor { 26 | return [self proxyForProxyClass:[ActorProxy class]]; 27 | } 28 | 29 | - asThreadSafe { 30 | return [self proxyForProxyClass:[ThreadSafeProxy class]]; 31 | } 32 | 33 | /* 34 | static char *actorKey = "ActorProxy"; 35 | 36 | - asActor { 37 | ActorProxy *actor = objc_getAssociatedObject(self, actorKey); 38 | 39 | if (!actor) 40 | { 41 | actor = [[[ActorProxy alloc] init] autorelease]; 42 | [actor setActorTarget:self]; 43 | objc_setAssociatedObject(self, actorKey, actor, OBJC_ASSOCIATION_ASSIGN); 44 | } 45 | 46 | return (id)actor; 47 | } 48 | 49 | static char *synchoronousKey = "ThreadSafeProxy"; 50 | 51 | - asThreadSafe { 52 | ThreadSafeProxy *sp = objc_getAssociatedObject(self, synchoronousKey); 53 | 54 | if (!sp) 55 | { 56 | sp = [[[ThreadSafeProxy alloc] init] autorelease]; 57 | [sp setThreadSafeProxyTarget:self]; 58 | objc_setAssociatedObject(self, synchoronousKey, sp, OBJC_ASSOCIATION_ASSIGN); 59 | } 60 | 61 | return (id)sp; 62 | } 63 | */ 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/xcuserdata/steve.xcuserdatad/xcschemes/ActorKit.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /ActorKit/BatchProxy.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "BatchProxy.h" 9 | #import "NSInvocation+Copy.h" 10 | 11 | @implementation BatchProxy 12 | 13 | @synthesize batchTarget; 14 | 15 | - init { 16 | //self = [super init]; // NSProxy doesn't implement init 17 | return self; 18 | } 19 | 20 | - (void)dealloc { 21 | [self setBatchTarget:nil]; 22 | [super dealloc]; 23 | } 24 | 25 | - (void)setProxyTarget:anObject { 26 | [self setBatchTarget:anObject]; 27 | } 28 | 29 | - (BOOL)respondsToSelector:(SEL)aSelector { 30 | return YES; 31 | } 32 | 33 | - (dispatch_queue_t)batchDispatchQueue { 34 | return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 35 | } 36 | 37 | - (void)forwardInvocation:(NSInvocation *)theInvocation { 38 | __block NSInvocation *anInvocation = theInvocation; 39 | 40 | if ([[anInvocation methodSignature] methodReturnType][0] != '@') { 41 | NSString *msg = [NSString stringWithFormat:@"sent '%@' but only methods that return objects are supported", 42 | NSStringFromSelector([anInvocation selector])]; 43 | NSLog(@"BatchProxy ERROR: %@", msg); 44 | [NSException raise:@"BatchProxy" format:@"%@", msg]; 45 | } 46 | 47 | [anInvocation retain]; // uh, why? 48 | [anInvocation retainArguments]; 49 | 50 | NSInteger length = [batchTarget count]; 51 | __block id *results = calloc(0, sizeof(id) * length); 52 | 53 | // use an invocation pool? 54 | 55 | dispatch_apply(length, [self batchDispatchQueue], ^(size_t i) { 56 | //printf("start %i\n", (int)i); 57 | id item = [batchTarget objectAtIndex:i]; 58 | NSInvocation *copyInvocation = [anInvocation copy]; 59 | [copyInvocation retain]; 60 | [copyInvocation invokeWithTarget:item]; 61 | 62 | id r; 63 | [copyInvocation getReturnValue:&r]; 64 | results[i] = r; 65 | [copyInvocation release]; // ? 66 | //printf("end %i\n", (int)i); 67 | } 68 | ); 69 | 70 | NSMutableArray *resultsArray = [NSMutableArray 71 | arrayWithObjects:results count:length]; 72 | 73 | free(results); //NSArray docs don't mention who owns the memory, so assume it's a copy 74 | 75 | [anInvocation setReturnValue:(void *)&resultsArray]; 76 | } 77 | 78 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 79 | if ([batchTarget count]) { 80 | id firstObject = [batchTarget objectAtIndex:0]; 81 | NSMethodSignature *sig = [firstObject methodSignatureForSelector:aSelector]; 82 | return sig; 83 | } 84 | 85 | return nil; 86 | } 87 | 88 | @end 89 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # ActorKit Documentation 2 | 3 | ## About 4 | 5 | ActorKit is a lightweight framework (under 300 semicolons) for multithreaded actors with transparent futures in Objective-C. 6 | 7 | ## ActorProxy 8 | 9 | Sending an `asActor` message to any object returns an actor proxy for that object. 10 | 11 | Messages sent to the actor are queued and processed in first-in-first-out order by the actor's thread. Each message immediately returns a "future" object. 12 | 13 | If the message queue exceeds a given limit (set with `setActorQueueLimit:`), calling threads that exceed the limit will pause until more of the queue is processed. 14 | 15 | ## FutureProxy 16 | 17 | A future is a transparent proxy for a result. When accessed before the result is ready, it pauses any threads attempting to access it until the result becomes available. 18 | 19 | Futures automatically detect and raise exceptions in deadlock situations. 20 | 21 | ### Example 22 | 23 | ```objc 24 | // The fetch returns a future immediately 25 | NSData *aFuture = [(NSURL *)[[@"http://example.com" asURL] asActor] fetch]; 26 | 27 | // ... do other work ... 28 | 29 | // When we access the values, the thread waits if they aren't ready 30 | NSLog(@"Request returned %i bytes", (int)[aFuture length]); 31 | ``` 32 | 33 | ## ThreadSafeProxy 34 | 35 | Calling `asThreadSafe` on any object returns a proxy that ensures only one thread can access it at a time. 36 | 37 | Example: 38 | 39 | ```objc 40 | NSMutableDictionary *dict = [[NSMutableDictionary dictionary] asThreadSafe]; 41 | ``` 42 | 43 | ## BatchProxy 44 | 45 | Calling `asBatch` on an NSArray returns a BatchProxy, which can be used for parallel "map" operations using GCD (BSD worker queues). 46 | 47 | Example: 48 | 49 | ```objc 50 | NSArray *results = [[urls asBatch] fetch]; 51 | ``` 52 | 53 | This sends concurrent `fetch` messages to each element of the `urls` array and returns an array containing the results. 54 | 55 | ## Dealing with Async Callbacks 56 | 57 | To handle asynchronous callbacks within an actor's thread, use `pauseThread` and `resumeThread`. 58 | 59 | Example: 60 | 61 | ```objc 62 | __block id response = nil; 63 | __block NSError *error = nil; 64 | __block ActorProxy *actor = [ActorProxy currentActorProxy]; 65 | 66 | request = [s3Client getBucket:bucketName 67 | success:^(id responseObject) 68 | { 69 | response = responseObject; 70 | [actor resumeThread]; 71 | } 72 | failure:^(NSError *e) 73 | { 74 | error = e; 75 | [actor resumeThread]; 76 | } 77 | ]; 78 | 79 | id returnValue = [[ActorProxy currentActorProxy] pauseThread]; 80 | 81 | if (error) 82 | { 83 | [NSException raise:@"SyncKitError" format:[error description]]; 84 | } 85 | ``` 86 | 87 | If the thread is resumed using `resumeThreadWithValue:`, the `pauseThread` method will return the given value. 88 | 89 | ## Notes 90 | 91 | - Exceptions that occur while an actor processes a message are passed to the future and raised in all threads that attempt to access the future. 92 | - Multiple threads can safely access the same future. 93 | - ActorKit does not use busy waits. 94 | - Objects store their proxies as associated objects, ensuring the same proxy is returned for a given instance. 95 | 96 | ## To Do 97 | 98 | - Handle BatchProxy exceptions 99 | - Ensure all locks deal with exceptions 100 | - Implement future notifications 101 | - Add more tests 102 | - Implement auto deadlock detection for actor queue limit and batches 103 | - Add total queue and/or total actor limits 104 | - Improve `respondsToSelector` implementation 105 | - (Maybe) Implement chainable persistent batch groups with in, out, and error queues 106 | - (Maybe) Integrate with distributed objects to allow bundle and data distribution 107 | - (Maybe) Explore synchronization via ownership 108 | 109 | ## Credits 110 | 111 | Thanks to Mark Papadakis for tips on mutex conditions. 112 | 113 | The BatchProxy pattern was first observed in the Io language, implemented by quag. 114 | 115 | If you use this project, please let us know if you found it useful. Your feedback is appreciated! -------------------------------------------------------------------------------- /_unused/README.txt: -------------------------------------------------------------------------------- 1 | 2 | About 3 | 4 | ActorKit is a lightweight (under 300 semicolons) framework for multithreaded actors with transparent futures in Objective-C. 5 | 6 | 7 | ActorProxy 8 | 9 | Sending an "asActor" message to any object returns an actor proxy for the object. 10 | 11 | Sending messages to the actor will queue them to be processed in first-in-first-out order 12 | by the actor's thread and immediately returns a "future" object. 13 | 14 | If its message queue exceeds a given limit (set with setActorQueueLimit:), 15 | the calling threads that exceeded the limit will be paused until more 16 | of the queue is processed. 17 | 18 | 19 | 20 | FutureProxy 21 | 22 | A future is a transparent proxy for the result which, when accessed before the 23 | result is ready, pauses any threads attempting to access it until it is ready. 24 | 25 | Futures auto detect and raise an exception in deadlock situations. 26 | 27 | Example 28 | 29 | // the fetch return a future immediately 30 | 31 | NSData *aFuture = [(NSURL *)[[@"http://yahoo.com" asURL] asActor] fetch]; 32 | 33 | // ... do stuff ... 34 | 35 | // now when we try to access the values, 36 | // the thread waits if the values aren't ready 37 | 38 | NSLog(@"request returned %i bytes", (int)[aFuture length]); 39 | 40 | 41 | 42 | ThreadSafeProxy 43 | 44 | Calling asThreadSafe on any object returns a proxy that ensures only one thread 45 | can access it at a time. Example: 46 | 47 | NSMutableDictionary *dict = [[NSMutableDictionary dictionary] asThreadSafe]; 48 | 49 | 50 | 51 | 52 | BatchProxy 53 | 54 | Calling asBatch on an NSArray returns a BatchProxy which can be used to do 55 | a parallel "map" using GCD (BSD workerqueues). Example: 56 | 57 | NSArray *results = [[urls asBatch] fetch]; 58 | 59 | Sends concurrent fetch messages to each element of the urls array and returns 60 | an array containing the results. 61 | 62 | 63 | 64 | 65 | Dealing with Async Callbacks 66 | 67 | To deal with async callbacks within an actor's thread, pauseThread and resumeThread can be used. Example: 68 | 69 | 70 | __block id response = nil; 71 | __block NSError *error = nil; 72 | __block ActorProxy *actor = [ActorProxy currentActorProxy]; 73 | 74 | _request = [s3Client getBucket:_bucketName 75 | success:^(id responseObject) 76 | { 77 | response = responseObject; 78 | [actor resumeThread]; 79 | } 80 | failure:^(NSError *e) 81 | { 82 | error = e; 83 | [actor resumeThread]; 84 | } 85 | ]; 86 | 87 | id returnValue = [[ActorProxy currentActorProxy] pauseThread]; 88 | 89 | if(error) 90 | { 91 | [NSException raise:@"SyncKitError" format:[error description]]; 92 | } 93 | 94 | Also, if the thread is resumed using resumeThreadWithValue:, the pauseThread method will return the given value. 95 | 96 | Notes 97 | 98 | Exceptions that occur while an actor processes a message will be 99 | passed to the future and raised in all the threads that attempt 100 | to access the future. 101 | 102 | It's ok for multiple threads to look at the same future. 103 | 104 | ActorKit does no busy waits. 105 | 106 | Objects store their proxies as an associated objects so the same 107 | proxy is returned for a given instance. 108 | 109 | 110 | 111 | 112 | To Do 113 | 114 | - handle BatchProxy exceptions 115 | 116 | - make sure all locks deal with exceptions 117 | 118 | - future notifications of some kind 119 | 120 | - more tests 121 | 122 | - auto deadlock detection for actor queue limit and batches 123 | 124 | - add a total queue and/or total actor limits 125 | 126 | - better respondsToSelector implementation 127 | 128 | - (maybe) chainable persistent batch groups with in, out, and error queues 129 | 130 | - (maybe) integrate with distibuted objects to allow bundles and data to 131 | be distributed... 132 | 133 | - (maybe) explore synchronization via ownership 134 | 135 | Credits 136 | 137 | Thanks to Mark Papadakis for tips on mutex conditions. 138 | IIRC I saw the BatchProxy pattern first used in Io by quag. 139 | 140 | If you use this project, please drop me a line and let me 141 | know if you found it useful. Thanks. 142 | 143 | 144 | -------------------------------------------------------------------------------- /ActorKit/FutureProxy.m: -------------------------------------------------------------------------------- 1 | // 2 | // Future.m 3 | // ActorKit 4 | // 5 | // Copyright 2011 Steve Dekorte. BSD licensed. 6 | // 7 | 8 | #import "ActorProxy.h" 9 | #import "FutureProxy.h" 10 | #import "NSThread+Actor.h" 11 | 12 | @implementation FutureProxy 13 | 14 | @synthesize futureActor; 15 | @synthesize futureInvocation; 16 | @synthesize futureValue; 17 | @synthesize nextFuture; 18 | @synthesize futureWaitingThreads; 19 | @synthesize futureException; 20 | @synthesize futureLock; 21 | @synthesize futureQueueLimitMutex; 22 | 23 | - (id)init { 24 | //self = [super init]; // NSProxy doesn't implement init 25 | 26 | if (self) 27 | { 28 | done = NO; 29 | [self setFutureWaitingThreads:[NSMutableSet set]]; 30 | [self setFutureLock:[[[Mutex alloc] init] autorelease]]; 31 | [self setFutureQueueLimitMutex:[[[Mutex alloc] init] autorelease]]; 32 | } 33 | 34 | return self; 35 | } 36 | 37 | - (void)dealloc { 38 | [self setFutureActor:nil]; 39 | [self setFutureInvocation:nil]; 40 | [self setFutureValue:nil]; 41 | [self setNextFuture:nil]; 42 | [self setFutureWaitingThreads:nil]; 43 | [self setFutureException:nil]; 44 | [self setFutureLock:nil]; 45 | [self setFutureQueueLimitMutex:nil]; 46 | [super dealloc]; 47 | } 48 | 49 | - (void)futureAppend:(FutureProxy *)aFuture { 50 | if (nextFuture) { 51 | [nextFuture futureAppend:aFuture]; 52 | } else { 53 | [self setNextFuture:aFuture]; 54 | } 55 | } 56 | 57 | - (void)futureShowSend { 58 | NSLog(@"FutureProxy send [%@ %@]\n", 59 | [[futureActor actorTarget] className], 60 | NSStringFromSelector([futureInvocation selector])); 61 | } 62 | 63 | - (void)pauseThreadOnQueueLimitMutex { 64 | [futureQueueLimitMutex pauseThread]; 65 | } 66 | 67 | - (void)futureSend { 68 | [futureQueueLimitMutex resumeAnyWaitingThreads]; 69 | 70 | @try { 71 | //[self futureShowSend]; 72 | [futureInvocation invokeWithTarget:[futureActor actorTarget]]; 73 | 74 | id r; 75 | [futureInvocation getReturnValue:(void *)&r]; 76 | [self setFutureResult:r]; 77 | } @catch (NSException *e) { 78 | [self setFutureException:e]; 79 | [self setFutureResult:nil]; 80 | } 81 | 82 | for (NSThread *waitingThread in futureWaitingThreads) { 83 | [waitingThread setWaitingOnFuture:nil]; 84 | } 85 | 86 | [futureWaitingThreads removeAllObjects]; 87 | [futureLock resumeAnyWaitingThreads]; 88 | } 89 | 90 | - (void)setFutureResult:(id)anObject { 91 | if (done) { 92 | return; 93 | } 94 | 95 | done = YES; 96 | 97 | [self setFutureValue:anObject]; 98 | } 99 | 100 | - (BOOL)isWaitingOnCurrentThread { 101 | // the recursion should avoid loop since the deadlock detection prevents loops 102 | 103 | for (NSThread *waitingThread in futureWaitingThreads) { 104 | if ([[waitingThread waitingOnFuture] isWaitingOnCurrentThread]) { 105 | return YES; 106 | } 107 | } 108 | 109 | return NO; 110 | } 111 | 112 | - (void)futurePassExceptionIfNeeded { 113 | if (futureException) { 114 | // guessing we have to wrap the exception so the stack info of original will be available 115 | NSMutableDictionary *info = [NSMutableDictionary dictionary]; 116 | [info setObject:futureException forKey:@"exception"]; 117 | [info setObject:self forKey:@"future"]; 118 | 119 | NSException *e = [[NSException alloc] initWithName:@"Future" 120 | reason:@"exception during send" 121 | userInfo:info]; 122 | [e raise]; 123 | } 124 | } 125 | 126 | - (void)futureRaiseExceptionIfDeadlock { 127 | if ([self isWaitingOnCurrentThread]) { 128 | [NSException raise:@"Future" format:@"waiting for result on this coroutine would cause a deadlock"]; 129 | } 130 | } 131 | 132 | - futureResult { 133 | if (done) { 134 | [self futurePassExceptionIfNeeded]; 135 | return futureValue; 136 | } 137 | 138 | [futureWaitingThreads addObject:[NSThread currentThread]]; 139 | [self futureRaiseExceptionIfDeadlock]; 140 | [futureLock pauseThread]; 141 | [self futureRaiseExceptionIfDeadlock]; 142 | 143 | return futureValue; 144 | } 145 | 146 | 147 | - (void)forwardInvocation:(NSInvocation *)anInvocation { 148 | [anInvocation invokeWithTarget:[self futureResult]]; 149 | } 150 | 151 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 152 | return [[self futureResult] methodSignatureForSelector:aSelector]; 153 | } 154 | 155 | @end 156 | -------------------------------------------------------------------------------- /ActorKit/ActorProxy.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Actor.m 3 | // ActorKit 4 | // 5 | // Created by Steve Dekorte on 20110831. 6 | // Copyright 2011 Steve Dekorte. BSD licensed. 7 | // 8 | 9 | #import "ActorProxy.h" 10 | #import "FutureProxy.h" 11 | 12 | @implementation ActorProxy 13 | 14 | @synthesize actorTarget; 15 | @synthesize actorMutex; 16 | @synthesize firstFuture; 17 | @synthesize actorThread; 18 | @synthesize actorQueueSize; 19 | @synthesize actorQueueLimit; 20 | 21 | - init { 22 | //self = [super init]; // NSProxy doesn't implement init 23 | return self; 24 | } 25 | 26 | - (void)setProxyTarget:anObject { 27 | [self setActorTarget:anObject]; 28 | } 29 | 30 | - (NSThread *)actorThreadCreateOrResumeIfNeeded { 31 | NSThread *thread = [self actorThread]; 32 | 33 | if (!thread) { 34 | [self setActorMutex:[[[Mutex alloc] init] autorelease]]; 35 | thread = [[[NSThread alloc] initWithTarget:self selector:@selector(actorRunLoop:) object:nil] autorelease]; 36 | [self setActorThread:thread]; 37 | [thread setName:[NSString stringWithFormat:@"%@", [actorTarget className]]]; 38 | 39 | [[thread threadDictionary] setObject:self forKey:@"actorProxy"]; 40 | [thread start]; 41 | } else { 42 | [actorMutex resumeAnyWaitingThreads]; 43 | } 44 | 45 | return thread; 46 | } 47 | 48 | - (void)dealloc { 49 | // threads retain the Future's they are waiting on, which retains the actor 50 | // so dealloc should only occur when it's safe of dependencies 51 | 52 | if ([self actorThread]) { 53 | [[self actorThread] cancel]; 54 | } 55 | 56 | [super dealloc]; 57 | } 58 | 59 | - (FutureProxy *)futurePerformInvocation:(NSInvocation *)anInvocation { 60 | BOOL willPauseCaller = NO; 61 | NSLock *lock = [[self actorThread] lock]; 62 | 63 | [lock lock]; 64 | 65 | FutureProxy *future = [[[FutureProxy alloc] init] autorelease]; 66 | 67 | [future setFutureActor:self]; 68 | [future setFutureInvocation:anInvocation]; 69 | [anInvocation retainArguments]; 70 | 71 | if ([self firstFuture]) { 72 | [[self firstFuture] futureAppend:future]; 73 | } else { 74 | [self setFirstFuture:future]; 75 | } 76 | 77 | actorQueueSize ++; 78 | 79 | [self actorThreadCreateOrResumeIfNeeded]; 80 | 81 | willPauseCaller = (actorQueueLimit && actorQueueLimit == actorQueueSize); 82 | [lock unlock]; 83 | 84 | if (willPauseCaller) { 85 | [future pauseThreadOnQueueLimitMutex]; 86 | } 87 | 88 | return future; 89 | } 90 | 91 | - (void)actorRunLoop:sender { 92 | NSLock *lock = [[self actorThread] lock]; 93 | 94 | if ([NSThread currentThread] != [self actorThread]) { 95 | [NSException raise:@"Actor" format:@"attempt to start actor loop from another thread"]; 96 | } 97 | 98 | while(![[NSThread currentThread] isCancelled]) { 99 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 100 | 101 | while([self firstFuture]) { 102 | FutureProxy *f = [self firstFuture]; 103 | [f futureSend]; // exceptions are caught within the futureSend method 104 | [lock lock]; 105 | [self setFirstFuture:[f nextFuture]]; 106 | actorQueueSize --; 107 | [lock unlock]; 108 | } 109 | 110 | [pool release]; 111 | 112 | [actorMutex pauseThread]; 113 | } 114 | 115 | // do these here so they aren't freed before the thread is done 116 | [self setFirstFuture:nil]; 117 | [self setActorThread:nil]; 118 | [self setActorMutex:nil]; 119 | } 120 | 121 | - (BOOL)respondsToSelector:(SEL)aSelector { 122 | return YES; 123 | } 124 | 125 | - (void)forwardInvocation:(NSInvocation *)anInvocation { 126 | if ([[anInvocation methodSignature] methodReturnType][0] != '@') { 127 | NSString *msg = [NSString stringWithFormat:@"sent '%@' but only methods that return objects are supported", 128 | NSStringFromSelector([anInvocation selector])]; 129 | NSLog(@"ActorProxy ERROR: %@", msg); 130 | [NSException raise:@"ActorProxy" format:@"%@", msg]; 131 | } 132 | 133 | FutureProxy *f = [self futurePerformInvocation:anInvocation]; 134 | [anInvocation setReturnValue:(void *)&f]; 135 | } 136 | 137 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 138 | return [actorTarget methodSignatureForSelector:aSelector]; 139 | } 140 | 141 | // --- pausing and resuming --- 142 | // 143 | // for use from within an actor method executing in order to 144 | // pause actor thread while waiting on async ops or other callbacks 145 | 146 | + (ActorProxy *)currentActorProxy { 147 | return [[[NSThread currentThread] threadDictionary] objectForKey:@"actorProxy"]; 148 | } 149 | 150 | - (id)pauseThread { 151 | [actorMutex pauseThread]; 152 | id returnValue = [[[NSThread currentThread] threadDictionary] objectForKey:@"returnValue"]; 153 | [[[NSThread currentThread] threadDictionary] removeObjectForKey:@"returnValue"]; 154 | return returnValue; 155 | } 156 | 157 | - (void)resumeThread { 158 | [actorMutex resumeAnyWaitingThreads]; 159 | } 160 | 161 | - (void)resumeThreadWithReturnObject:(id)returnValue { 162 | // might move returnValue to ivar 163 | [[[NSThread currentThread] threadDictionary] setObject:returnValue forKey:@"returnValue"]; 164 | [self resumeThread]; 165 | } 166 | 167 | @end 168 | -------------------------------------------------------------------------------- /ActorKit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | AA2726621411886500FE0A43 /* ActorKit.h in Headers */ = {isa = PBXBuildFile; fileRef = AABB5DA5140E0C220020BA06 /* ActorKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | AA2FB4A2141F533C00E57E01 /* ActorProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2FB49E141F533C00E57E01 /* ActorProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | AA2FB4A3141F533C00E57E01 /* ActorProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA2FB49F141F533C00E57E01 /* ActorProxy.m */; }; 13 | AA2FB4A4141F533C00E57E01 /* FutureProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2FB4A0141F533C00E57E01 /* FutureProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | AA2FB4A5141F533C00E57E01 /* FutureProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA2FB4A1141F533C00E57E01 /* FutureProxy.m */; }; 15 | AA2FB4A9141F5EB700E57E01 /* NSObject+Actor.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2FB4A7141F5EB700E57E01 /* NSObject+Actor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | AA2FB4AA141F5EB700E57E01 /* NSObject+Actor.m in Sources */ = {isa = PBXBuildFile; fileRef = AA2FB4A8141F5EB700E57E01 /* NSObject+Actor.m */; }; 17 | AA2FB4AC141FF34200E57E01 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = AA2FB4AB141FF34200E57E01 /* README.txt */; }; 18 | AA300E071420649100A63289 /* ThreadSafeProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA300E051420649100A63289 /* ThreadSafeProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | AA300E081420649100A63289 /* ThreadSafeProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA300E061420649100A63289 /* ThreadSafeProxy.m */; }; 20 | AA38C81B142162020081CA9C /* NSArray+Actor.h in Headers */ = {isa = PBXBuildFile; fileRef = AA38C819142162020081CA9C /* NSArray+Actor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | AA38C81C142162020081CA9C /* NSArray+Actor.m in Sources */ = {isa = PBXBuildFile; fileRef = AA38C81A142162020081CA9C /* NSArray+Actor.m */; }; 22 | AA38C820142163F60081CA9C /* BatchProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA38C81E142163F60081CA9C /* BatchProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | AA38C821142163F60081CA9C /* BatchProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA38C81F142163F60081CA9C /* BatchProxy.m */; }; 24 | AA38C824142178190081CA9C /* NSInvocation+Copy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA38C822142178190081CA9C /* NSInvocation+Copy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | AA38C825142178190081CA9C /* NSInvocation+Copy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA38C823142178190081CA9C /* NSInvocation+Copy.m */; }; 26 | AA9A97881419785000A2994E /* NSThread+Actor.h in Headers */ = {isa = PBXBuildFile; fileRef = AA9A97861419785000A2994E /* NSThread+Actor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | AA9A97891419785000A2994E /* NSThread+Actor.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9A97871419785000A2994E /* NSThread+Actor.m */; }; 28 | AABB5D99140E0C220020BA06 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AABB5D98140E0C220020BA06 /* Cocoa.framework */; }; 29 | AABB5DA3140E0C220020BA06 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AABB5DA1140E0C220020BA06 /* InfoPlist.strings */; }; 30 | AABB5DE2140EF4090020BA06 /* bsd_license.txt in Resources */ = {isa = PBXBuildFile; fileRef = AABB5DE1140EF4090020BA06 /* bsd_license.txt */; }; 31 | AABB5DF2140F196E0020BA06 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AABB5DF1140F196E0020BA06 /* IOKit.framework */; }; 32 | AAD00991141F0ED200566C36 /* Mutex.h in Headers */ = {isa = PBXBuildFile; fileRef = AAD0098F141F0ED200566C36 /* Mutex.h */; settings = {ATTRIBUTES = (Public, ); }; }; 33 | AAD00992141F0ED200566C36 /* Mutex.m in Sources */ = {isa = PBXBuildFile; fileRef = AAD00990141F0ED200566C36 /* Mutex.m */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | AA2FB49E141F533C00E57E01 /* ActorProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActorProxy.h; sourceTree = ""; }; 38 | AA2FB49F141F533C00E57E01 /* ActorProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ActorProxy.m; sourceTree = ""; }; 39 | AA2FB4A0141F533C00E57E01 /* FutureProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FutureProxy.h; sourceTree = ""; }; 40 | AA2FB4A1141F533C00E57E01 /* FutureProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FutureProxy.m; sourceTree = ""; }; 41 | AA2FB4A7141F5EB700E57E01 /* NSObject+Actor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+Actor.h"; sourceTree = ""; }; 42 | AA2FB4A8141F5EB700E57E01 /* NSObject+Actor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Actor.m"; sourceTree = ""; }; 43 | AA2FB4AB141FF34200E57E01 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = SOURCE_ROOT; }; 44 | AA300E051420649100A63289 /* ThreadSafeProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadSafeProxy.h; sourceTree = ""; }; 45 | AA300E061420649100A63289 /* ThreadSafeProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeProxy.m; sourceTree = ""; }; 46 | AA38C819142162020081CA9C /* NSArray+Actor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Actor.h"; sourceTree = ""; }; 47 | AA38C81A142162020081CA9C /* NSArray+Actor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Actor.m"; sourceTree = ""; }; 48 | AA38C81E142163F60081CA9C /* BatchProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BatchProxy.h; sourceTree = ""; }; 49 | AA38C81F142163F60081CA9C /* BatchProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BatchProxy.m; sourceTree = ""; }; 50 | AA38C822142178190081CA9C /* NSInvocation+Copy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSInvocation+Copy.h"; sourceTree = ""; }; 51 | AA38C823142178190081CA9C /* NSInvocation+Copy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSInvocation+Copy.m"; sourceTree = ""; }; 52 | AA9A97861419785000A2994E /* NSThread+Actor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSThread+Actor.h"; sourceTree = ""; }; 53 | AA9A97871419785000A2994E /* NSThread+Actor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSThread+Actor.m"; sourceTree = ""; }; 54 | AABB5D95140E0C220020BA06 /* ActorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ActorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | AABB5D98140E0C220020BA06 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 56 | AABB5D9B140E0C220020BA06 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 57 | AABB5D9C140E0C220020BA06 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 58 | AABB5D9D140E0C220020BA06 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 59 | AABB5DA0140E0C220020BA06 /* ActorKit-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ActorKit-Info.plist"; sourceTree = ""; }; 60 | AABB5DA2140E0C220020BA06 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 61 | AABB5DA4140E0C220020BA06 /* ActorKit-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ActorKit-Prefix.pch"; sourceTree = ""; }; 62 | AABB5DA5140E0C220020BA06 /* ActorKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ActorKit.h; sourceTree = ""; }; 63 | AABB5DE1140EF4090020BA06 /* bsd_license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = bsd_license.txt; path = license/bsd_license.txt; sourceTree = SOURCE_ROOT; }; 64 | AABB5DF1140F196E0020BA06 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 65 | AAD0098F141F0ED200566C36 /* Mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mutex.h; sourceTree = ""; }; 66 | AAD00990141F0ED200566C36 /* Mutex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Mutex.m; sourceTree = ""; }; 67 | /* End PBXFileReference section */ 68 | 69 | /* Begin PBXFrameworksBuildPhase section */ 70 | AABB5D91140E0C220020BA06 /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | AABB5DF2140F196E0020BA06 /* IOKit.framework in Frameworks */, 75 | AABB5D99140E0C220020BA06 /* Cocoa.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | /* End PBXFrameworksBuildPhase section */ 80 | 81 | /* Begin PBXGroup section */ 82 | AABB5D89140E0C220020BA06 = { 83 | isa = PBXGroup; 84 | children = ( 85 | AABB5DF1140F196E0020BA06 /* IOKit.framework */, 86 | AABB5D9E140E0C220020BA06 /* ActorKit */, 87 | AABB5D97140E0C220020BA06 /* Frameworks */, 88 | AABB5D96140E0C220020BA06 /* Products */, 89 | ); 90 | sourceTree = ""; 91 | }; 92 | AABB5D96140E0C220020BA06 /* Products */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | AABB5D95140E0C220020BA06 /* ActorKit.framework */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | AABB5D97140E0C220020BA06 /* Frameworks */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | AABB5D98140E0C220020BA06 /* Cocoa.framework */, 104 | AABB5D9A140E0C220020BA06 /* Other Frameworks */, 105 | ); 106 | name = Frameworks; 107 | sourceTree = ""; 108 | }; 109 | AABB5D9A140E0C220020BA06 /* Other Frameworks */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | AABB5D9B140E0C220020BA06 /* AppKit.framework */, 113 | AABB5D9C140E0C220020BA06 /* CoreData.framework */, 114 | AABB5D9D140E0C220020BA06 /* Foundation.framework */, 115 | ); 116 | name = "Other Frameworks"; 117 | sourceTree = ""; 118 | }; 119 | AABB5D9E140E0C220020BA06 /* ActorKit */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | AA38C822142178190081CA9C /* NSInvocation+Copy.h */, 123 | AA38C823142178190081CA9C /* NSInvocation+Copy.m */, 124 | AA38C81E142163F60081CA9C /* BatchProxy.h */, 125 | AA38C81F142163F60081CA9C /* BatchProxy.m */, 126 | AA38C819142162020081CA9C /* NSArray+Actor.h */, 127 | AA38C81A142162020081CA9C /* NSArray+Actor.m */, 128 | AABB5DA5140E0C220020BA06 /* ActorKit.h */, 129 | AA2FB49E141F533C00E57E01 /* ActorProxy.h */, 130 | AA2FB49F141F533C00E57E01 /* ActorProxy.m */, 131 | AA2FB4A0141F533C00E57E01 /* FutureProxy.h */, 132 | AA2FB4A1141F533C00E57E01 /* FutureProxy.m */, 133 | AAD0098F141F0ED200566C36 /* Mutex.h */, 134 | AAD00990141F0ED200566C36 /* Mutex.m */, 135 | AA2FB4A7141F5EB700E57E01 /* NSObject+Actor.h */, 136 | AA2FB4A8141F5EB700E57E01 /* NSObject+Actor.m */, 137 | AA9A97861419785000A2994E /* NSThread+Actor.h */, 138 | AA9A97871419785000A2994E /* NSThread+Actor.m */, 139 | AA300E051420649100A63289 /* ThreadSafeProxy.h */, 140 | AA300E061420649100A63289 /* ThreadSafeProxy.m */, 141 | AABB5D9F140E0C220020BA06 /* Supporting Files */, 142 | ); 143 | path = ActorKit; 144 | sourceTree = ""; 145 | }; 146 | AABB5D9F140E0C220020BA06 /* Supporting Files */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | AA2FB4AB141FF34200E57E01 /* README.txt */, 150 | AABB5DE1140EF4090020BA06 /* bsd_license.txt */, 151 | AABB5DA0140E0C220020BA06 /* ActorKit-Info.plist */, 152 | AABB5DA1140E0C220020BA06 /* InfoPlist.strings */, 153 | AABB5DA4140E0C220020BA06 /* ActorKit-Prefix.pch */, 154 | ); 155 | name = "Supporting Files"; 156 | sourceTree = ""; 157 | }; 158 | /* End PBXGroup section */ 159 | 160 | /* Begin PBXHeadersBuildPhase section */ 161 | AABB5D92140E0C220020BA06 /* Headers */ = { 162 | isa = PBXHeadersBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | AA2726621411886500FE0A43 /* ActorKit.h in Headers */, 166 | AAD00991141F0ED200566C36 /* Mutex.h in Headers */, 167 | AA2FB4A2141F533C00E57E01 /* ActorProxy.h in Headers */, 168 | AA2FB4A4141F533C00E57E01 /* FutureProxy.h in Headers */, 169 | AA2FB4A9141F5EB700E57E01 /* NSObject+Actor.h in Headers */, 170 | AA9A97881419785000A2994E /* NSThread+Actor.h in Headers */, 171 | AA300E071420649100A63289 /* ThreadSafeProxy.h in Headers */, 172 | AA38C81B142162020081CA9C /* NSArray+Actor.h in Headers */, 173 | AA38C820142163F60081CA9C /* BatchProxy.h in Headers */, 174 | AA38C824142178190081CA9C /* NSInvocation+Copy.h in Headers */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | /* End PBXHeadersBuildPhase section */ 179 | 180 | /* Begin PBXNativeTarget section */ 181 | AABB5D94140E0C220020BA06 /* ActorKit */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = AABB5DAA140E0C220020BA06 /* Build configuration list for PBXNativeTarget "ActorKit" */; 184 | buildPhases = ( 185 | AABB5D90140E0C220020BA06 /* Sources */, 186 | AABB5D91140E0C220020BA06 /* Frameworks */, 187 | AABB5D92140E0C220020BA06 /* Headers */, 188 | AABB5D93140E0C220020BA06 /* Resources */, 189 | ); 190 | buildRules = ( 191 | ); 192 | dependencies = ( 193 | ); 194 | name = ActorKit; 195 | productName = ActorKit; 196 | productReference = AABB5D95140E0C220020BA06 /* ActorKit.framework */; 197 | productType = "com.apple.product-type.framework"; 198 | }; 199 | /* End PBXNativeTarget section */ 200 | 201 | /* Begin PBXProject section */ 202 | AABB5D8B140E0C220020BA06 /* Project object */ = { 203 | isa = PBXProject; 204 | attributes = { 205 | LastUpgradeCheck = 1320; 206 | }; 207 | buildConfigurationList = AABB5D8E140E0C220020BA06 /* Build configuration list for PBXProject "ActorKit" */; 208 | compatibilityVersion = "Xcode 3.2"; 209 | developmentRegion = en; 210 | hasScannedForEncodings = 0; 211 | knownRegions = ( 212 | en, 213 | Base, 214 | ); 215 | mainGroup = AABB5D89140E0C220020BA06; 216 | productRefGroup = AABB5D96140E0C220020BA06 /* Products */; 217 | projectDirPath = ""; 218 | projectRoot = ""; 219 | targets = ( 220 | AABB5D94140E0C220020BA06 /* ActorKit */, 221 | ); 222 | }; 223 | /* End PBXProject section */ 224 | 225 | /* Begin PBXResourcesBuildPhase section */ 226 | AABB5D93140E0C220020BA06 /* Resources */ = { 227 | isa = PBXResourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | AABB5DA3140E0C220020BA06 /* InfoPlist.strings in Resources */, 231 | AABB5DE2140EF4090020BA06 /* bsd_license.txt in Resources */, 232 | AA2FB4AC141FF34200E57E01 /* README.txt in Resources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | /* End PBXResourcesBuildPhase section */ 237 | 238 | /* Begin PBXSourcesBuildPhase section */ 239 | AABB5D90140E0C220020BA06 /* Sources */ = { 240 | isa = PBXSourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | AA9A97891419785000A2994E /* NSThread+Actor.m in Sources */, 244 | AAD00992141F0ED200566C36 /* Mutex.m in Sources */, 245 | AA2FB4A3141F533C00E57E01 /* ActorProxy.m in Sources */, 246 | AA2FB4A5141F533C00E57E01 /* FutureProxy.m in Sources */, 247 | AA2FB4AA141F5EB700E57E01 /* NSObject+Actor.m in Sources */, 248 | AA300E081420649100A63289 /* ThreadSafeProxy.m in Sources */, 249 | AA38C81C142162020081CA9C /* NSArray+Actor.m in Sources */, 250 | AA38C821142163F60081CA9C /* BatchProxy.m in Sources */, 251 | AA38C825142178190081CA9C /* NSInvocation+Copy.m in Sources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | /* End PBXSourcesBuildPhase section */ 256 | 257 | /* Begin PBXVariantGroup section */ 258 | AABB5DA1140E0C220020BA06 /* InfoPlist.strings */ = { 259 | isa = PBXVariantGroup; 260 | children = ( 261 | AABB5DA2140E0C220020BA06 /* en */, 262 | ); 263 | name = InfoPlist.strings; 264 | sourceTree = ""; 265 | }; 266 | /* End PBXVariantGroup section */ 267 | 268 | /* Begin XCBuildConfiguration section */ 269 | AABB5DA8140E0C220020BA06 /* Debug */ = { 270 | isa = XCBuildConfiguration; 271 | buildSettings = { 272 | ALWAYS_SEARCH_USER_PATHS = NO; 273 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 274 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 275 | CLANG_WARN_BOOL_CONVERSION = YES; 276 | CLANG_WARN_COMMA = YES; 277 | CLANG_WARN_CONSTANT_CONVERSION = YES; 278 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 279 | CLANG_WARN_EMPTY_BODY = YES; 280 | CLANG_WARN_ENUM_CONVERSION = YES; 281 | CLANG_WARN_INFINITE_RECURSION = YES; 282 | CLANG_WARN_INT_CONVERSION = YES; 283 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 284 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 285 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 286 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 287 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 288 | CLANG_WARN_STRICT_PROTOTYPES = YES; 289 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 290 | CLANG_WARN_UNREACHABLE_CODE = YES; 291 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 292 | COPY_PHASE_STRIP = NO; 293 | ENABLE_STRICT_OBJC_MSGSEND = YES; 294 | ENABLE_TESTABILITY = YES; 295 | GCC_C_LANGUAGE_STANDARD = gnu99; 296 | GCC_DYNAMIC_NO_PIC = NO; 297 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 298 | GCC_NO_COMMON_BLOCKS = YES; 299 | GCC_OPTIMIZATION_LEVEL = 0; 300 | GCC_PREPROCESSOR_DEFINITIONS = ( 301 | "DEBUG=1", 302 | "$(inherited)", 303 | ); 304 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 305 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 306 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 307 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 308 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 309 | GCC_WARN_UNDECLARED_SELECTOR = YES; 310 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 311 | GCC_WARN_UNUSED_FUNCTION = YES; 312 | GCC_WARN_UNUSED_VARIABLE = YES; 313 | MACOSX_DEPLOYMENT_TARGET = 10.7; 314 | ONLY_ACTIVE_ARCH = YES; 315 | SDKROOT = macosx; 316 | }; 317 | name = Debug; 318 | }; 319 | AABB5DA9140E0C220020BA06 /* Release */ = { 320 | isa = XCBuildConfiguration; 321 | buildSettings = { 322 | ALWAYS_SEARCH_USER_PATHS = NO; 323 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 324 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 325 | CLANG_WARN_BOOL_CONVERSION = YES; 326 | CLANG_WARN_COMMA = YES; 327 | CLANG_WARN_CONSTANT_CONVERSION = YES; 328 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 329 | CLANG_WARN_EMPTY_BODY = YES; 330 | CLANG_WARN_ENUM_CONVERSION = YES; 331 | CLANG_WARN_INFINITE_RECURSION = YES; 332 | CLANG_WARN_INT_CONVERSION = YES; 333 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 334 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 335 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 336 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 337 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 338 | CLANG_WARN_STRICT_PROTOTYPES = YES; 339 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 340 | CLANG_WARN_UNREACHABLE_CODE = YES; 341 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 342 | COPY_PHASE_STRIP = YES; 343 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 344 | ENABLE_STRICT_OBJC_MSGSEND = YES; 345 | GCC_C_LANGUAGE_STANDARD = gnu99; 346 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 347 | GCC_NO_COMMON_BLOCKS = YES; 348 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 349 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 350 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 351 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 352 | GCC_WARN_UNDECLARED_SELECTOR = YES; 353 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 354 | GCC_WARN_UNUSED_FUNCTION = YES; 355 | GCC_WARN_UNUSED_VARIABLE = YES; 356 | MACOSX_DEPLOYMENT_TARGET = 10.7; 357 | SDKROOT = macosx; 358 | }; 359 | name = Release; 360 | }; 361 | AABB5DAB140E0C220020BA06 /* Debug */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | CLANG_ENABLE_OBJC_WEAK = YES; 365 | COMBINE_HIDPI_IMAGES = YES; 366 | DYLIB_COMPATIBILITY_VERSION = 1; 367 | DYLIB_CURRENT_VERSION = 1; 368 | FRAMEWORK_VERSION = A; 369 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 370 | GCC_PREFIX_HEADER = "ActorKit/ActorKit-Prefix.pch"; 371 | INFOPLIST_FILE = "ActorKit/ActorKit-Info.plist"; 372 | MACOSX_DEPLOYMENT_TARGET = 12.2; 373 | PRODUCT_BUNDLE_IDENTIFIER = "com.dekorte.${PRODUCT_NAME:rfc1034identifier}"; 374 | PRODUCT_NAME = "$(TARGET_NAME)"; 375 | WRAPPER_EXTENSION = framework; 376 | }; 377 | name = Debug; 378 | }; 379 | AABB5DAC140E0C220020BA06 /* Release */ = { 380 | isa = XCBuildConfiguration; 381 | buildSettings = { 382 | CLANG_ENABLE_OBJC_WEAK = YES; 383 | COMBINE_HIDPI_IMAGES = YES; 384 | DYLIB_COMPATIBILITY_VERSION = 1; 385 | DYLIB_CURRENT_VERSION = 1; 386 | FRAMEWORK_VERSION = A; 387 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 388 | GCC_PREFIX_HEADER = "ActorKit/ActorKit-Prefix.pch"; 389 | INFOPLIST_FILE = "ActorKit/ActorKit-Info.plist"; 390 | MACOSX_DEPLOYMENT_TARGET = 12.2; 391 | PRODUCT_BUNDLE_IDENTIFIER = "com.dekorte.${PRODUCT_NAME:rfc1034identifier}"; 392 | PRODUCT_NAME = "$(TARGET_NAME)"; 393 | WRAPPER_EXTENSION = framework; 394 | }; 395 | name = Release; 396 | }; 397 | /* End XCBuildConfiguration section */ 398 | 399 | /* Begin XCConfigurationList section */ 400 | AABB5D8E140E0C220020BA06 /* Build configuration list for PBXProject "ActorKit" */ = { 401 | isa = XCConfigurationList; 402 | buildConfigurations = ( 403 | AABB5DA8140E0C220020BA06 /* Debug */, 404 | AABB5DA9140E0C220020BA06 /* Release */, 405 | ); 406 | defaultConfigurationIsVisible = 0; 407 | defaultConfigurationName = Release; 408 | }; 409 | AABB5DAA140E0C220020BA06 /* Build configuration list for PBXNativeTarget "ActorKit" */ = { 410 | isa = XCConfigurationList; 411 | buildConfigurations = ( 412 | AABB5DAB140E0C220020BA06 /* Debug */, 413 | AABB5DAC140E0C220020BA06 /* Release */, 414 | ); 415 | defaultConfigurationIsVisible = 0; 416 | defaultConfigurationName = Release; 417 | }; 418 | /* End XCConfigurationList section */ 419 | }; 420 | rootObject = AABB5D8B140E0C220020BA06 /* Project object */; 421 | } 422 | --------------------------------------------------------------------------------