Что может вызвать тупик в ImageProviderReleaseInfoCallback / __spin_lock - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть приложение Cocoa, которое использует несколько экземпляров NSOperationQueue для обработки изображений в фоновом режиме. Каждая очередь обрабатывает операции вызова, которые по существу превращают NSImage объекты в CGImageRef экземпляры, используя:

CGImageRef ref = [image CGImageForProposedRect:NULL context:nil hints:nil];

Несколько пользователей жаловались, что приложение внезапно перестает отвечать. Я попросил их собрать образец процесса с помощью ActivityMonitor.app. Отчеты все очень похожи.

Похоже, что основной поток проходит через пул автоматического выпуска drain, тогда как очереди / потоки застряли на __spin_lock сразу после вызова ImageProviderReleaseInfoCallback.

В документах сказано, что все параметры CGImageForProposedRect: являются необязательными. Они ничего не говорят, если это можно вызвать из фонового потока. Может в этом проблема? Я сомневаюсь, потому что это работает почти во всех случаях (я запускал приложение сотни раз без проблем ...)

Есть идеи, почему очереди могут застрять?

Полный образец процесса:

OS Version:      Mac OS X 10.6.8 (10K549)
Report Version:  6

Call graph:
    1971 Thread_905   DispatchQueue_1: com.apple.main-thread  (serial)
      1971 0x2e6d
        1971 NSApplicationMain
          1971 -[NSApplication run]
            1971 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
              1971 _DPSNextEvent
                1971 AEProcessAppleEvent
                  1971 aeProcessAppleEvent
                    1971 dispatchEventAndSendReply(AEDesc const*, AEDesc*)
                      1971 aeDispatchAppleEvent(AEDesc const*, AEDesc*, unsigned long, unsigned char*)
                        1971 _NSAppleEventManagerGenericHandler
                          1971 -[NSAutoreleasePool drain]
                            1971 NSPopAutoreleasePool
                              1971 _CFAutoreleasePoolPop
                                1971 CFRelease
                                  1971 -[NSImage dealloc]
                                    1971 -[NSImage _deallocAuxiliaryStorage]
                                      1971 -[NSCGImageSnapshotRep dealloc]
                                        1971 _CFRelease
                                          1971 image_finalize
                                            1971 _CFRelease
                                              1971 image_provider_finalize
                                                1971 ImageProviderReleaseInfoCallback
                                                  1971 __spin_lock
    1971 Thread_943   DispatchQueue_2: com.apple.libdispatch-manager  (serial)
      1971 start_wqthread
        1971 _pthread_wqthread
          1971 _dispatch_worker_thread2
            1971 _dispatch_queue_invoke
              1971 _dispatch_mgr_invoke
                1971 kevent
    1971 Thread_944   DispatchQueue_6: com.apple.root.default-priority  (concurrent)
      1971 start_wqthread
        1971 _pthread_wqthread
          1971 _dispatch_worker_thread2
            1971 _dispatch_call_block_and_release
              1971 ____NSOQSchedule_block_invoke_2
                1971 -[__NSOperationInternal start]
                  1971 -[NSInvocationOperation main]
                    1971 -[NSInvocation invoke]
                      1971 __invoking___
                        1971 0x17a64
                          1971 0x244cf
                            1971 0x22a97
                              1971 -[NSImage CGImageForProposedRect:context:hints:]
                                1971 -[NSImage _usingBestRepresentationForRect:context:hints:body:]
                                  1971 __-[NSImage CGImageForProposedRect:context:hints:]_block_invoke_1
                                    1971 -[NSImage _snapshotRepForRep:rect:context:processedHints:]
                                      1971 -[NSImage _createSnapshotRepForRep:rect:context:processedHints:]
                                        1971 -[NSImageRep CGImageForProposedRect:context:hints:flipped:]
                                          1971 -[NSIconRefImageRep CGImageForProposedRect:context:hints:]
                                            1971 _ISCreateCGImageForType
                                              1971 _ISGetCGImageRefForISImageRef
                                                1971 _ISImageRefIterator(void*, unsigned char, short (*)(void*, void*), void*)
                                                  1971 _ISGoThruImageStorages
                                                    1971 _ISGoThruImageStorages
                                                      1971 MergeBestStorageIntoContext(void*, void*)
                                                        1971 _CFRelease
                                                          1971 image_finalize
                                                            1971 _CFRelease
                                                              1971 image_provider_finalize
                                                                1971 ImageProviderReleaseInfoCallback
                                                                  1971 __spin_lock
    1971 Thread_980   DispatchQueue_6: com.apple.root.default-priority  (concurrent)
      1971 start_wqthread
        1971 _pthread_wqthread
          1971 _dispatch_worker_thread2
            1971 _dispatch_call_block_and_release
              1971 ____NSOQSchedule_block_invoke_2
                1971 -[__NSOperationInternal start]
                  1971 NSPopAutoreleasePool
                    1971 _CFAutoreleasePoolPop
                      1971 CFRelease
                        1971 -[NSImage dealloc]
                          1971 -[NSImage _deallocAuxiliaryStorage]
                            1971 -[NSCGImageSnapshotRep dealloc]
                              1971 _CFRelease
                                1971 image_finalize
                                  1971 _CFRelease
                                    1971 image_provider_finalize
                                      1971 ImageProviderReleaseInfoCallback
                                        1971 glueReleaseInfo
                                          1971 JP2ReleaseInfoCallback
                                            1971 _cg_JP2TearDownDecompressor
                                              1971 _CFRelease
                                                1971 __CFBasicHashDrain
                                                  1971 __CFDictionaryCallback
                                                    1971 _CFRelease
                                                      1971 _CGImageReadSessionFinalize
                                                        1971 _CFRelease
                                                          1971 _CGImageReadFinalize
                                                            1971 _CFRelease
                                                              1971 __CFDataDeallocate
                                                                1971 _ISReleaseStorageRef
                                                                  1971 _CFRelease
                                                                    1971 __CFArrayReleaseValues
                                                                      1971 _CFRelease
                                                                        1971 image_finalize
                                                                          1971 _CFRelease
                                                                            1971 image_provider_finalize
                                                                              1971 ImageProviderReleaseInfoCallback
                                                                                1971 __spin_lock
    1971 Thread_1013   DispatchQueue_6: com.apple.root.default-priority  (concurrent)
      1971 start_wqthread
        1971 _pthread_wqthread
          1971 _dispatch_worker_thread2
            1971 _dispatch_call_block_and_release
              1971 ____NSOQSchedule_block_invoke_2
                1971 -[__NSOperationInternal start]
                  1971 -[NSInvocationOperation main]
                    1971 -[NSInvocation invoke]
                      1971 __invoking___
                        1971 0x17a64
                          1971 0x244cf
                            1971 0x22a97
                              1971 -[NSImage CGImageForProposedRect:context:hints:]
                                1971 -[NSImage _usingBestRepresentationForRect:context:hints:body:]
                                  1971 __-[NSImage CGImageForProposedRect:context:hints:]_block_invoke_1
                                    1971 -[NSImage _snapshotRepForRep:rect:context:processedHints:]
                                      1971 -[NSImage _createSnapshotRepForRep:rect:context:processedHints:]
                                        1971 -[NSImageRep CGImageForProposedRect:context:hints:flipped:]
                                          1971 -[NSIconRefImageRep CGImageForProposedRect:context:hints:]
                                            1971 _ISCreateCGImageForType
                                              1971 _ISGetCGImageRefForISImageRef
                                                1971 _ISImageRefIterator(void*, unsigned char, short (*)(void*, void*), void*)
                                                  1971 _ISGoThruImageStorages
                                                    1971 MergeBestStorageIntoContext(void*, void*)
                                                      1971 _CFRelease
                                                        1971 image_finalize
                                                          1971 _CFRelease
                                                            1971 image_provider_finalize
                                                              1971 ImageProviderReleaseInfoCallback
                                                                1971 __spin_lock
    1971 Thread_1019   DispatchQueue_6: com.apple.root.default-priority  (concurrent)
      1971 start_wqthread
        1971 _pthread_wqthread
          1971 _dispatch_worker_thread2
            1971 _dispatch_call_block_and_release
              1971 ____NSOQSchedule_block_invoke_2
                1971 -[__NSOperationInternal start]
                  1971 NSPopAutoreleasePool
                    1971 _CFAutoreleasePoolPop
                      1971 CFRelease
                        1971 -[NSImage dealloc]
                          1971 -[NSImage _deallocAuxiliaryStorage]
                            1971 -[NSCGImageSnapshotRep dealloc]
                              1971 _CFRelease
                                1971 image_finalize
                                  1971 _CFRelease
                                    1971 image_provider_finalize
                                      1971 ImageProviderReleaseInfoCallback
                                        1971 __spin_lock
    1971 Thread_1031
      1971 thread_start
        1971 _pthread_start
          1971 startIOThread(void*)
            1971 CVDisplayLink::runIOThread()
              1971 pthread_cond_wait$UNIX2003
                1971 _pthread_cond_wait
                  1971 __semwait_signal

Total number in stack (recursive counted multiple, when >=5):
        17       _CFRelease
        6       ImageProviderReleaseInfoCallback
        6       image_finalize
        6       image_provider_finalize
        5       __spin_lock
        5       _dispatch_worker_thread2
        5       _pthread_wqthread
        5       start_wqthread

Sort by top of stack, same collapsed (when >= 5):
        __spin_lock        9855
        __semwait_signal        1971
        kevent        1971
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...