#import @interface RunningThreadRunLoopPair : NSObject @property (nonatomic, readonly) NSThread *thread; @property (nonatomic, readonly) NSRunLoop *runLoop; + (RunningThreadRunLoopPair *)startNewWithThreadName:(NSString *)name; - (void)terminate; @end /** * * The thread manager is responsible for starting and exposing the low/normal/high latency threads. * * Low latency: * - Includes: Audio encoding/decoding, communicating audio data, advancing zrtp handshake, etc. * - Operations on this thread should complete at human-interaction speeds (<30ms) and avoid swamping. * - If an operation must be low latency but takes too long, split it into parts that can be interleaved. * * Normal latency: * - Includes: Registration * - Operations on this thread should complete at human-reaction speeds (<250ms). * * High latency: * - Includes: DNS CNAME lookup (due to gethostbyname blocking and being non-reentrant and non-threadsafe) * - Operations on this thread should complete at human-patience speeds (<10s). * */ @interface ThreadManager : NSObject { @private RunningThreadRunLoopPair *low; @private RunningThreadRunLoopPair *normal; @private RunningThreadRunLoopPair *high; } + (NSThread *)lowLatencyThread; + (NSRunLoop *)lowLatencyThreadRunLoop; + (NSThread *)normalLatencyThread; + (NSRunLoop *)normalLatencyThreadRunLoop; + (NSThread *)highLatencyThread; + (NSRunLoop *)highLatencyThreadRunLoop; + (void)terminate; @end