52 - (instancetype)init:(NSArray*)arguments withExecuteCallback:(
ExecuteCallback)executeCallback withLogCallback:(
LogCallback)logCallback withLogRedirectionStrategy:(LogRedirectionStrategy)logRedirectionStrategy {
62 _logs = [[NSMutableArray alloc] init];
63 _logsLock = [[NSRecursiveLock alloc] init];
64 _state = SessionStateCreated;
81 - (long)getSessionId {
85 - (NSDate*)getCreateTime {
89 - (NSDate*)getStartTime {
93 - (NSDate*)getEndTime {
100 if (startTime != nil && endTime != nil) {
101 return [[NSNumber numberWithDouble:([endTime timeIntervalSinceDate:startTime]*1000)] longValue];
107 - (NSArray*)getArguments {
111 - (NSString*)getCommand {
115 - (void)waitForAsynchronousMessagesInTransmit:(
int)timeout {
116 NSDate* expireDate = [[NSDate date] dateByAddingTimeInterval:((double)timeout)/1000];
117 dispatch_semaphore_t
semaphore = dispatch_semaphore_create(0);
119 while ([
self thereAreAsynchronousMessagesInTransmit] && ([[NSDate date] timeIntervalSinceDate:expireDate] < 0)) {
120 dispatch_semaphore_wait(
semaphore, dispatch_time(DISPATCH_TIME_NOW, 100 * NSEC_PER_MSEC));
124 - (NSArray*)getAllLogsWithTimeout:(
int)waitTimeout {
125 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
127 if ([
self thereAreAsynchronousMessagesInTransmit]) {
128 NSLog(
@"getAllLogsWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
131 return [
self getLogs];
134 - (NSArray*)getAllLogs {
135 return [
self getAllLogsWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
138 - (NSArray*)getLogs {
140 NSArray* logsCopy = [_logs copy];
146 - (NSString*)getAllLogsAsStringWithTimeout:(
int)waitTimeout {
147 [
self waitForAsynchronousMessagesInTransmit:waitTimeout];
149 if ([
self thereAreAsynchronousMessagesInTransmit]) {
150 NSLog(
@"getAllLogsAsStringWithTimeout was called to return all logs but there are still logs being transmitted for session id %ld.",
_sessionId);
153 return [
self getLogsAsString];
156 - (NSString*)getAllLogsAsString {
157 return [
self getAllLogsAsStringWithTimeout:AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit];
160 - (NSString*)getLogsAsString {
161 NSMutableString* concatenatedString = [[NSMutableString alloc] init];
164 for (
int i=0; i < [_logs count]; i++) {
165 [concatenatedString appendString:[[_logs objectAtIndex:i] getMessage]];
169 return concatenatedString;
172 - (NSString*)getOutput {
173 return [
self getAllLogsAsString];
176 - (SessionState)getState {
184 - (NSString*)getFailStackTrace {
188 - (LogRedirectionStrategy)getLogRedirectionStrategy {
192 - (BOOL)thereAreAsynchronousMessagesInTransmit {
196 - (void)addLog:(
Log*)log {
198 [_logs addObject:log];
202 - (void)startRunning {
203 _state = SessionStateRunning;
209 _state = SessionStateCompleted;
213 - (void)fail:(NSException*)exception {
214 _failStackTrace = [NSString stringWithFormat:@"%@", [exception callStackSymbols]];
215 _state = SessionStateFailed;
230 if (
_state == SessionStateRunning) {
ExecuteCallback _executeCallback
NSString * _failStackTrace
NSRecursiveLock * _logsLock
LogRedirectionStrategy _logRedirectionStrategy
int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit
static AtomicLong * sessionIdGenerator
void(^ ExecuteCallback)(id< Session > session)
static LogCallback logCallback
__thread volatile long _sessionId
static ExecuteCallback executeCallback
static dispatch_semaphore_t semaphore
void(^ LogCallback)(Log *log)
void cancel:(long sessionId)
NSString * argumentsToString:(NSArray *arguments)