add sessions to history on creation

This commit is contained in:
Taner Sener 2021-08-16 22:59:56 +03:00
parent 78c4da02e8
commit d4f51ca5c0
4 changed files with 36 additions and 54 deletions

View File

@ -139,6 +139,8 @@ public abstract class AbstractSession implements Session {
this.returnCode = null;
this.failStackTrace = null;
this.logRedirectionStrategy = logRedirectionStrategy;
FFmpegKitConfig.addSession(this);
}
@Override

View File

@ -604,7 +604,6 @@ public class FFmpegKitConfig {
* @param ffmpegSession FFmpeg session which includes command options/arguments
*/
public static void ffmpegExecute(final FFmpegSession ffmpegSession) {
addSession(ffmpegSession);
ffmpegSession.startRunning();
try {
@ -622,7 +621,6 @@ public class FFmpegKitConfig {
* @param ffprobeSession FFprobe session which includes command options/arguments
*/
public static void ffprobeExecute(final FFprobeSession ffprobeSession) {
addSession(ffprobeSession);
ffprobeSession.startRunning();
try {
@ -641,7 +639,6 @@ public class FFmpegKitConfig {
* @param waitTimeout max time to wait until media information is transmitted
*/
public static void getMediaInformationExecute(final MediaInformationSession mediaInformationSession, final int waitTimeout) {
addSession(mediaInformationSession);
mediaInformationSession.startRunning();
try {
@ -664,8 +661,6 @@ public class FFmpegKitConfig {
* @param ffmpegSession FFmpeg session which includes command options/arguments
*/
public static void asyncFFmpegExecute(final FFmpegSession ffmpegSession) {
addSession(ffmpegSession);
AsyncFFmpegExecuteTask asyncFFmpegExecuteTask = new AsyncFFmpegExecuteTask(ffmpegSession);
Future<?> future = asyncExecutorService.submit(asyncFFmpegExecuteTask);
ffmpegSession.setFuture(future);
@ -678,8 +673,6 @@ public class FFmpegKitConfig {
* @param executorService executor service that will be used to run this asynchronous operation
*/
public static void asyncFFmpegExecute(final FFmpegSession ffmpegSession, final ExecutorService executorService) {
addSession(ffmpegSession);
AsyncFFmpegExecuteTask asyncFFmpegExecuteTask = new AsyncFFmpegExecuteTask(ffmpegSession);
Future<?> future = executorService.submit(asyncFFmpegExecuteTask);
ffmpegSession.setFuture(future);
@ -691,8 +684,6 @@ public class FFmpegKitConfig {
* @param ffprobeSession FFprobe session which includes command options/arguments
*/
public static void asyncFFprobeExecute(final FFprobeSession ffprobeSession) {
addSession(ffprobeSession);
AsyncFFprobeExecuteTask asyncFFmpegExecuteTask = new AsyncFFprobeExecuteTask(ffprobeSession);
Future<?> future = asyncExecutorService.submit(asyncFFmpegExecuteTask);
ffprobeSession.setFuture(future);
@ -705,8 +696,6 @@ public class FFmpegKitConfig {
* @param executorService executor service that will be used to run this asynchronous operation
*/
public static void asyncFFprobeExecute(final FFprobeSession ffprobeSession, final ExecutorService executorService) {
addSession(ffprobeSession);
AsyncFFprobeExecuteTask asyncFFmpegExecuteTask = new AsyncFFprobeExecuteTask(ffprobeSession);
Future<?> future = executorService.submit(asyncFFmpegExecuteTask);
ffprobeSession.setFuture(future);
@ -719,8 +708,6 @@ public class FFmpegKitConfig {
* @param waitTimeout max time to wait until media information is transmitted
*/
public static void asyncGetMediaInformationExecute(final MediaInformationSession mediaInformationSession, final int waitTimeout) {
addSession(mediaInformationSession);
AsyncGetMediaInformationTask asyncGetMediaInformationTask = new AsyncGetMediaInformationTask(mediaInformationSession, waitTimeout);
Future<?> future = asyncExecutorService.submit(asyncGetMediaInformationTask);
mediaInformationSession.setFuture(future);
@ -734,8 +721,6 @@ public class FFmpegKitConfig {
* @param waitTimeout max time to wait until media information is transmitted
*/
public static void asyncGetMediaInformationExecute(final MediaInformationSession mediaInformationSession, final ExecutorService executorService, final int waitTimeout) {
addSession(mediaInformationSession);
AsyncGetMediaInformationTask asyncGetMediaInformationTask = new AsyncGetMediaInformationTask(mediaInformationSession, waitTimeout);
Future<?> future = executorService.submit(asyncGetMediaInformationTask);
mediaInformationSession.setFuture(future);

View File

@ -29,6 +29,8 @@ int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit = 5000;
static AtomicLong *sessionIdGenerator = nil;
extern void addSessionToSessionHistory(id<Session> session);
@implementation AbstractSession {
long _sessionId;
ExecuteCallback _executeCallback;
@ -65,6 +67,8 @@ static AtomicLong *sessionIdGenerator = nil;
_returnCode = nil;
_failStackTrace = nil;
_logRedirectionStrategy = logRedirectionStrategy;
addSessionToSessionHistory(self);
}
return self;

View File

@ -101,6 +101,31 @@ typedef NS_ENUM(NSUInteger, CallbackType) {
StatisticsType
};
void addSessionToSessionHistory(id<Session> session) {
NSNumber* sessionIdNumber = [NSNumber numberWithLong:[session getSessionId]];
[sessionHistoryLock lock];
/*
* ASYNC SESSIONS CALL THIS METHOD TWICE
* THIS CHECK PREVENTS ADDING THE SAME SESSION TWICE
*/
if ([sessionHistoryMap objectForKey:sessionIdNumber] == nil) {
[sessionHistoryMap setObject:session forKey:sessionIdNumber];
[sessionHistoryList addObject:session];
if ([sessionHistoryList count] > sessionHistorySize) {
id<Session> first = [sessionHistoryList firstObject];
if (first != nil) {
NSNumber* key = [NSNumber numberWithLong:[first getSessionId]];
[sessionHistoryList removeObject:key];
[sessionHistoryMap removeObjectForKey:key];
}
}
}
[sessionHistoryLock unlock];
}
/**
* Callback data class.
*/
@ -278,11 +303,11 @@ CallbackData *callbackDataRemove() {
}
/**
* Adds a session id to the session map.
* Registers a session id to the session map.
*
* @param sessionId session id
*/
void addSession(long sessionId) {
void registerSessionId(long sessionId) {
atomic_store(&sessionMap[sessionId % SESSION_MAP_SIZE], 1);
}
@ -557,7 +582,7 @@ int executeFFmpeg(long sessionId, NSArray* arguments) {
// REGISTER THE ID BEFORE STARTING THE SESSION
_sessionId = sessionId;
addSession(sessionId);
registerSessionId(sessionId);
resetMessagesInTransmit(sessionId);
@ -597,7 +622,7 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
// REGISTER THE ID BEFORE STARTING THE SESSION
_sessionId = sessionId;
addSession(sessionId);
registerSessionId(sessionId);
resetMessagesInTransmit(sessionId);
@ -846,7 +871,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)ffmpegExecute:(FFmpegSession*)ffmpegSession {
[FFmpegKitConfig addSession:ffmpegSession];
[ffmpegSession startRunning];
@try {
@ -859,7 +883,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)ffprobeExecute:(FFprobeSession*)ffprobeSession {
[FFmpegKitConfig addSession:ffprobeSession];
[ffprobeSession startRunning];
@try {
@ -872,7 +895,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)getMediaInformationExecute:(MediaInformationSession*)mediaInformationSession withTimeout:(int)waitTimeout {
[FFmpegKitConfig addSession:mediaInformationSession];
[mediaInformationSession startRunning];
@try {
@ -894,8 +916,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)asyncFFmpegExecute:(FFmpegSession*)ffmpegSession onDispatchQueue:(dispatch_queue_t)queue {
[FFmpegKitConfig addSession:ffmpegSession];
dispatch_async(queue, ^{
[FFmpegKitConfig ffmpegExecute:ffmpegSession];
ExecuteCallback globalExecuteCallback = [FFmpegKitConfig getExecuteCallback];
@ -915,8 +935,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)asyncFFprobeExecute:(FFprobeSession*)ffprobeSession onDispatchQueue:(dispatch_queue_t)queue {
[FFmpegKitConfig addSession:ffprobeSession];
dispatch_async(queue, ^{
[FFmpegKitConfig ffprobeExecute:ffprobeSession];
ExecuteCallback globalExecuteCallback = [FFmpegKitConfig getExecuteCallback];
@ -936,8 +954,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
+ (void)asyncGetMediaInformationExecute:(MediaInformationSession*)mediaInformationSession onDispatchQueue:(dispatch_queue_t)queue withTimeout:(int)waitTimeout {
[FFmpegKitConfig addSession:mediaInformationSession];
dispatch_async(queue, ^{
[FFmpegKitConfig getMediaInformationExecute:mediaInformationSession withTimeout:waitTimeout];
ExecuteCallback globalExecuteCallback = [FFmpegKitConfig getExecuteCallback];
@ -1008,31 +1024,6 @@ int executeFFprobe(long sessionId, NSArray* arguments) {
}
}
+ (void)addSession:(id<Session>)session {
NSNumber* sessionIdNumber = [NSNumber numberWithLong:[session getSessionId]];
[sessionHistoryLock lock];
/*
* ASYNC SESSIONS CALL THIS METHOD TWICE
* THIS CHECK PREVENTS ADDING THE SAME SESSION TWICE
*/
if ([sessionHistoryMap objectForKey:sessionIdNumber] == nil) {
[sessionHistoryMap setObject:session forKey:sessionIdNumber];
[sessionHistoryList addObject:session];
if ([sessionHistoryList count] > sessionHistorySize) {
id<Session> first = [sessionHistoryList firstObject];
if (first != nil) {
NSNumber* key = [NSNumber numberWithLong:[first getSessionId]];
[sessionHistoryList removeObject:key];
[sessionHistoryMap removeObjectForKey:key];
}
}
}
[sessionHistoryLock unlock];
}
+ (id<Session>)getSession:(long)sessionId {
[sessionHistoryLock lock];