Назад | Перейти на главную страницу

Любой способ отключить Grand Central Dispatch и вернуться к более старому способу работы

По вопросу о бэкэнде MythTV по адресу:

http://svn.mythtv.org/trac/ticket/7582

при запуске бэкэнда MythTV на MacOS X 10.6.2 происходит сбой:

BUG IN CLIENT OF LIBDISPATCH: Do not close random Unix descriptors

Это сообщение пришло от Grand Central Dispatch.

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Crashed Thread:  1  Dispatch queue: com.apple.libdispatch-manager

Application Specific Information:
BUG IN CLIENT OF LIBDISPATCH: Do not close random Unix descriptors

Thread 1 Crashed:  Dispatch queue: com.apple.libdispatch-manager
0   libSystem.B.dylib                   0x9481ea51 _dispatch_mgr_invoke + 804
1   libSystem.B.dylib                   0x9481dcc3 _dispatch_queue_invoke + 163
2   libSystem.B.dylib                   0x9481da68 _dispatch_worker_thread2 + 234
3   libSystem.B.dylib                   0x9481d4f1 _pthread_wqthread + 390
4   libSystem.B.dylib                   0x9481d336 start_wqthread + 30

Поскольку код в MythTV для этого находится довольно рано в main (), можно только представить, что связывание библиотек Grand Central Dispatch автоматически вызывает запуск некоторого фонового потока, который отслеживает некоторый специальный дескриптор файла. Проблема в том, что бэкэнд MythTV закрывает все файловые дескрипторы, начиная с 3 и выше, и, вероятно, закрывает и этот специальный файловый дескриптор.

Вопрос в том, есть ли способ настроить MacOS X, чтобы не использовать Grand Central Dispatch и использовать то, что когда-либо использовалось в MacOS X 10.5, чтобы попытаться избежать этой проблемы, пока люди MythTV не будут беспокоиться, глядя на это и вносящие изменения в код .

Отдельно, может ли кто-нибудь объяснить, использует ли Grand Central Dispatch какой-то специальный файловый дескриптор, как я считаю.

Ошибка находится в MythTV. Разбор аргументов командной строки, по-видимому, вызывает запуск GCD в качестве побочного эффекта. Решение простое. Переместите цикл «for ()», закрывающий все дескрипторы, в самый верх main ().