// QGAnimatedImageDecodeThreadPool.m
// Tencent is pleased to support the open source community by making vap available.
//
// Copyright (C) 2020 Tencent.  All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions and
// limitations under the License.

#import "QGAnimatedImageDecodeThreadPool.h"
#import "QGAnimatedImageDecodeThread.h"
#import "QGVAPSafeMutableArray.h"

@interface QGAnimatedImageDecodeThreadPool (){

    NSMutableArray *_threads;
}

@end

@implementation QGAnimatedImageDecodeThreadPool

+ (instancetype)sharedPool {

    static QGAnimatedImageDecodeThreadPool *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[QGAnimatedImageDecodeThreadPool alloc] init];
    });
    return instance;
}

- (instancetype)init {

    if (self = [super init]) {
        _threads = [QGVAPSafeMutableArray new];
    }
    return self;
}

/**
 从池子中找出没被占用的线程，如果没有则新建一个
 
 @return 解码线程
 */
- (QGAnimatedImageDecodeThread *)getDecodeThread {

    QGAnimatedImageDecodeThread *freeThread = nil;
    for (QGAnimatedImageDecodeThread *thread in _threads) {
        if (!thread.occupied) {
            freeThread = thread;
        }
    }
    if (!freeThread) {
        freeThread = [[QGAnimatedImageDecodeThread alloc] initWithTarget:self selector:@selector(run) object:nil];
        [freeThread start];
        [_threads addObject:freeThread];
    }
    return freeThread;
}

- (void)run{
    //线程保活
    @autoreleasepool {
        [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop run];
    }
}

@end
