├── .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 |
--------------------------------------------------------------------------------