ChangbaDevs / KTVHTTPCache

A powerful media cache framework.
MIT License
2.35k stars 435 forks source link

KTVHCLog crash in multi thread #96

Closed rhythmkay closed 5 years ago

rhythmkay commented 5 years ago

The operations of internalErrors is unsafe for multithreading.

Thread 7 Crashed: 
0  libsystem_kernel.dylib         0x000000018f92f104 __pthread_kill + 4
1  libsystem_c.dylib              0x000000018f886d78 abort + 132
2  libsystem_malloc.dylib         0x000000018f983768 __malloc_put
3  libsystem_malloc.dylib         0x000000018f983924 _malloc_report +  64
4  libsystem_malloc.dylib         0x000000018f9762d4 free + 372
5  CoreFoundation                 0x000000018fc7f5a8 -[__NSArrayM insertObject:atIndex:] +  372
6  mttlite                        0x00000001023c85ac -[KTVHCLog addError:] (KTVHCLog.m:119)
7  mttlite                        0x00000001023acd9c -[KTVHCDataReader sourceManager:didFailed:] (KTVHCDataReader.m:246)
8  mttlite                        0x00000001023b2400 __44-[KTVHCDataSourceManager callbackForFailed:]_block_invoke (KTVHCDataSourceManager.m:248)
9  libdispatch.dylib              0x000000018f7d16c8 __dispatch_call_block_and_release +  24
10 libdispatch.dylib              0x000000018f7d2484 __dispatch_client_callout +  16
11 libdispatch.dylib              0x000000018f7acfa0 __dispatch_lane_serial_drain$VARIANT$armv81 +  548
12 libdispatch.dylib              0x000000018f7adae4 __dispatch_lane_invoke$VARIANT$armv81 +  412
13 libdispatch.dylib              0x000000018f7b5f04 __dispatch_workloop_worker_thread +  584
14 libsystem_pthread.dylib        0x000000018f9b50dc _pthread_wqthread + 300
1  libsystem_pthread.dylib        0x000000018f9b7cec _start_wqthread +  4
- (NSError *)lastError
{
    if (self.internalErrors.count > 0)
    {
        return self.internalErrors.lastObject;
    }
    return nil;
}

- (NSArray<NSError *> *)allErrors
{
    if (self.internalErrors.count > 0)
    {
        return [self.internalErrors copy];
    }
    return nil;
}

- (void)addError:(NSError *)error
{
    if (error && [error isKindOfClass:[NSError class]])
    {
        if (self.internalErrors.count >= 20)
        {
            [self.internalErrors removeObjectAtIndex:0];
        }
        [self.internalErrors addObject:error];
    }
}
libobjc commented 5 years ago

Fixed in 2.0.