Перейти к содержанию

Операции плагина, тайм-ауты и php_server

Черновик (2026-10-29). Как оболочка вызывает PHP-плагин: очередь операций, тайм-аут, прогресс-диалог, жизнь процесса php_server. Основа: код оболочки tv188b r24 (единица …plugin-loader--php-runtime--opexec, листинги libduneshell.so; уровень code) и наблюдения на одном устройстве tv188b с прошивкой 261021_0117_r25 (несколько серий прогонов; уровень device); ожидание индекса mc (§2.3) — по коду оболочки r25. Код r24 и наблюдения r25 относятся к разным сборкам оболочки, поэтому одно на другое не переносится. Каждое фактическое предложение ссылается на claim id.

Дополнение (2026-11-03): код оболочки r25 о тайм-ауте без operation_timeout (единица …plugin-loader--native-contracts-2, code) и наблюдения проверки на устройстве (tv188b 261021_0117_r25, тестовые плагины test_plugin13 и test_plugin13t, каждый случай — один прогон, device): тайм-аут по операциям — §2.4, ряды view_rows и get_folder_rows — §1.3.

Коротко: вопрос → ответ

Вопрос Ответ Где
Могут ли две операции одного плагина идти одновременно? r24, code: нет, у плагина активна одна операция, остальные ждут в его очереди (код r24)1; r25, device: второй запуск ждёт конца первого (устройство r25)2 §1
В чём задаётся operation_timeout? r25, device: в манифесте — секунды (устройство r25)3, в данных действия — миллисекунды (устройство r25)4 §2.1
Какой тайм-аут у handle_user_input без operation_timeout? r25, device: 60 с (устройство r25)5; SDK пишет 10 с — см. «Расхождения» §2.1, §6
Отменит ли оболочка по сроку get_folder_view, get_regular_folder_items, get_folder_rows плагина без operation_timeout? r25, по одному прогону: get_folder_view — да, через 60 с, с диалогом «Превышено время операции» (устройство r25)6 (код r25: 60 с (код r25)7); get_regular_folder_items (устройство r25)8 и get_folder_rows (устройство r25)9 за 75 с сна не отменены §2.4
Можно ли вернуть пустой ответ на get_folder_rows? лучше не надо: r25, один прогон — оболочка повторяла запрос без паузы, 7977 вызовов за ~45 с (устройство r25)10; повтор row_dup с "ld" — тоже цикл (устройство r25)11; пустой row_regular (устройство r25)12 или row_vgap (устройство r25)13 с тем же id — повторов не было §1.3
Отменит ли ENTER медленный get_folder_rows? r25, один прогон: задача оболочки завершилась canceled, но сон PHP не прервался, и handle_user_input пришёл только после возврата (устройство r25)14; переходы фокуса его не отменили (устройство r25)15 §1.3
Что будет с PHP-кодом по тайм-ауту? r25, device: оболочка останавливает php_server, вызов не дорабатывает (устройство r25)16, пользователь видит «Превышено время операции» (устройство r25)17 §2.2
Входит ли ожидание индекса mc в тайм-аут? код r25: нет, предварительное ожидание идёт до вычисления дедлайна timeout_us (код r25)18 §2.3
Ждёт ли следующий вызов отменённый? r25, device: нет, он сразу идёт в новом php_server (устройство r25)19 §2.2
Мешает ли долгая операция IP Control? r25, device: да, команды IP Control ждут её конца (устройство r25)20 §1.2
Прервёт ли клавиша или STOP долгий обработчик таймера? r25, device: нет — PROG_BLUE дошла до плагина после конца операции (устройство r25)21, STOP не прервал спящий обработчик, ev_playback_stop обработан после него (устройство r25)22 §1.2
Когда перезапускается php_server? r25, device: при смене mtime main.php (устройство r25)23, после сбоя вызова (устройство r25)24, после остановки по тайм-ауту (устройство r25)19 §3

1. Очередь операций

1.1. Как устроено в коде r24

Исполнитель операций собран из plugin_operation.c, plugin_operation_common.c и plugin_operation_executor.c (код r24)25. Типы операций: get_folder_view, get_next_folder_view, get_regular_folder_items, handle_user_input, get_tv_info, get_day_epg, get_tv_playback_url, get_tv_stream_url, change_tv_favorites, get_vod_info, get_vod_stream_url, get_vod_stream_info (код r24)26.

  • Запрос получает 64-битный id, флаг «отменяемый», имя плагина, тип, входные данные и обратный вызов; после постановки печатается «[plugin_opexec] queued %s» (код r24)27.
  • Очередь своя у каждого плагина, а активные операции — отдельный список с набором «занятых» плагинов (код r24)28.
  • У плагина работает не больше одной операции; если активная уже есть, новый запрос ждёт, и печатается «postponed since %s currently active» (код r24)1. SDK говорит то же: вызовы из GUI сериализуются (SDK)29.
  • Новый запрос отменяет текущую операцию того же плагина, если та помечена отменяемой («canceling active cancelable», fast = 0) (код r24)30.
  • Активная запись снимается, только когда операция уже не выполняется («can't a-remove still running»); после этого у плагина может стартовать следующий запрос (код r24)31.
  • Синхронный прогон (nav_plugin_perform_operation_blocked) ставит неотменяемый запрос и опрашивает исполнитель каждые 50 мс до результата (код r24)32.
  • Статусы: 1 — Succeeded, 2 — Failed, 3 — Cancelled, 4 — API Error; 4 заменяется на 2 с текстом «ошибка приложения» (код r24)33. Если плагин не найден или старт не удался, запрос сразу получает статус 2 (код r24)34.

Особые случаи:

Событие Что делает исполнитель r24 Claim
Остановка воспроизведения из очереди удаляются get_day_epg, get_tv_playback_url, get_tv_stream_url, такие же активные отменяются с fast = 1 (код r24)35
Деактивация плагина очередь плагина чистится, работающая операция помечается отменённой со статусом 3, отмена у самого плагина не вызывается (код r24)36
Повтор get_day_epg тот же день, уже загружаемый, не запрашивается повторно; лишние запросы удаляются (код r24)37

1.2. Что видно на r25

  • Запуск по IP Control точки входа плагина, пока у того же плагина идёт 20-секундный handle_user_input, исполнился только после конца первого вызова и в том же php_server; строк «postponed» и «canceling active cancelable» не было (устройство r25)2.
  • cmd=main_screen и запуск другого плагина по IP Control долгую операцию не отменили: она доработала до конца (устройство r25)38.
  • Сами команды IP Control (launch_media_url для того же и для другого плагина) получили ответ только после конца операции (устройство r25)20.

Операция по таймеру (r25, device, проверка на устройстве; обработчик timer спит 3 или 10 с):

  • Клавиша PROG_BLUE, нажатая во время операции, дошла до плагина через 4 мс после «timer end», то есть ждала конца операции (устройство r25)21.
  • cmd=main_screen, отправленный во время спящего обработчика, вернул ответ только после «timer end»; player_state в ответе — navigator (устройство r25)39. После такого main_screen главный экран оболочки был чёрным, и вернул его только keyevent HOME; причина не установлена (устройство r25)40.
  • STOP во время спящего обработчика его не прервал: обработчик продолжал «still working» и вернул результат, а ev_playback_stop обработан после этого (устройство r25)22.

Какой механизм задерживает клавишу, main_screen и STOP (очередь исполнителя или иное), claims проверки на устройстве не говорят.

Итог для плагина: долгая операция держит не только свой плагин, но и IP Control; при проверке на устройстве клавиша и STOP тоже ждали её конца. Почему второй запрос на r25 не дошёл до очереди исполнителя, claims не объясняют.

1.3. Ряды view_rows: операция get_folder_rows на r25

Папка вида view_rows получает содержимое рядов отдельной операцией get_folder_rows: в коде r25 это native kind=3 (код r25)41. Её ставит загрузчик рядов оболочки rows_loader: при отсутствии текущего запроса он берёт у источника пакет row_ids и ставит его как get_folder_rows, и так по кругу, пока есть готовые пакеты и нет текущей задачи (код r25)42. Какие строки попадают в пакет, вход и ответ вызова — в api-reference.md §2.5. Ниже — что делала оболочка tv188b 261021_0117_r25 при проверке на устройстве (device, тестовые плагины test_plugin13 и test_plugin13t, каждый случай — один прогон); тайм-аут get_folder_rows — §2.4.

Обычная подгрузка. При открытии рядов, где r1–r3 помечены LOADING через row_dup, оболочка сама, без нажатий, запросила get_folder_rows сначала для ["r1","r2"], затем для ["r3"]; после ответов фокус кнопкой вниз переходил на r1.0, r2.0, r3.0 (устройство r25)43.

Неполный ответ. Когда на запрос r1, r2 тестовый плагин вернул только r1, оболочка сразу запросила недостающий ["r2"], затем ["r3"], и на этом повторы кончились — три вызова за случай (устройство r25)44.

Предупреждение: пустой ответ. На пустой ответ get_folder_rows оболочка повторяла запрос без паузы: за ~45 с случая пришло 7977 вызовов (741 — с ["r1","r2"], затем после кнопки вниз 7234 — с ["r1"]), и повторы шли до конца случая (устройство r25)10. Такой цикл нагружает PHP-сервер плагина, а намеренное ли это поведение, по коду не видно (устройство r25)10. Отвечайте строками на все запрошенные id: после неполного ответа, дополненного недостающим, повторов не было (см. выше) (устройство r25)44.

Чем ответить за ряд без данных. Три варианта ответа за ряд r2 испытаны при проверке на устройстве (tv188b 261101_0347_r25, по одному прогону каждого). Пустой обычный ряд — row_regular с тем же id и пустым items — повторов не вызвал: за ~45 с случая было два вызова get_folder_rows, ["r1","r2"] и ["r3"] (устройство r25)12. row_vgap с тем же id вместо ряда тоже повторов не вызвал, два вызова за ~45 с (устройство r25)13. А снова row_dup с data "ld", как у ряда в состоянии LOADING, дал цикл повторов без паузы: 18602 вызова за ~41 с, от ~190 до ~710 в секунду (устройство r25)11. Значит, ряд, которому нечего показать, отдавайте пустым row_regular или row_vgap, а не пустым ответом и не повтором LOADING (устройство r25)45.

Медленный get_folder_rows и клавиши. Тестовый плагин спал в get_folder_rows 20 с (устройство r25)46.

  • ENTER поставил handle_user_input(rows_enter) и вызвал «canceling active cancelable», но rows_enter дошёл до плагина только после возврата get_folder_rows через 20 с; задача rows_loader завершилась со статусом canceled, и ряды были запрошены заново (["r1"]): отмена на стороне оболочки сон PHP не прервала (устройство r25)14.
  • Переходы фокуса вниз и вправо его не отменили: задача завершилась succeeded через 20 с, строки «canceling» нет, и rows_info для новых пунктов до её завершения не отправлялись (устройство r25)15.
  • При сне 75 с rows_info первого пункта ждал те же 75 с (устройство r25)9.

plugin_invalidate_folders своей папки рядов. Вызов из таймера при фокусе на r1.2 привёл к новому get_folder_view с sel_state, где были r1 и r1.2, и оболочка вернула фокус на r1.2 (устройство r25)47. Таймер нового вида сработал ещё раз через 8 с (второй handle_user_input(rows_timer), ответ null); всего за случай — два вызова таймера (устройство r25)48.

2. Тайм-аут операции

2.1. Единицы и умолчания

  • В коде r24 исполнитель получает тайм-аут в микросекундах и печатает его как «start (timeout=%.1fs)» (код r24)49.
  • r25, device: ключи манифеста operation_timeout/default и operation_timeout/<тип операции> — в секундах: <default>5</default> дало «timeout=5.0s», <handle_user_input>7</handle_user_input> — «timeout=7.0s» (устройство r25)3.
  • r25, device: ключ operation_timeout в данных действия plugin_handle_user_input — в миллисекундах: 3000 → 3,0 с, 3 → «timeout=0.0s» и отмена через 0,36 с, 60000 → 60,0 с; значение из действия перекрывает манифест (устройство r25)4.
  • Код r24: положительное значение operation_timeout в данных действия plugin_handle_user_input задаёт миллисекунды (перед исполнителем умножается на 1000), а operation_timeout из манифеста — секунды (plugin_get_operation_timeout_us умножает его на 1 000 000) (код r24)50.
  • Код r25, откуда берётся значение без operation_timeout. Конструктор структуры плагина записывает в поле общего тайм-аута 60 (0x3c) секунд, и parse_plugin_manifest затем использует это поле как общий тайм-аут операций (код r25)51. При первом распознанном дочернем элементе operation_timeout, кроме default, создаётся таблица из 13 значений, заполненная общим тайм-аутом; в ячейку операции пишется только положительное число из текста элемента, а операции без своего элемента получают общее значение (код r25)52. plugin_get_operation_timeout_us для типа 0–12 возвращает ячейку таблицы, а без таблицы — общий тайм-аут, умноженный на 1 000 000 (код r25)53. Сам operation_timeout/default parse_plugin_manifest читает в поле +0x2c (при отсутствии −1) и значение меньше 1 заменяет на 60 (0x3c); строку «default operation timeout is %d sec» пишет только для положительного значения (код r25)54. Ветку значения меньше 1 прогоны не проверяли (код r25)54. Какие операции этот срок на самом деле отменяет, — §2.4.
  • r25, device: handle_user_input без operation_timeout в манифесте стартует с тайм-аутом 60 с (устройство r25)5. Если вызов уложился в срок, отмены нет: sleep(15) при 60 с доработал, и следующий вызов исполнил тот же php_server (устройство r25)55.

2.2. Что происходит по истечении

Код r24:

  • По истечении срока синхронный прогон печатает «cancelling by timeout (%.1fs)», отменяет запрос с fast = 1 и продолжает ждать результата (код r24)56.
  • Отмена активной операции у PHP-плагина (php_plugin.c) только ставит флаг отмены в дескрипторе операции (код r24)57; пришедший потом результат не разбирается («Received result for cancelled operation.») (код r24)58.
  • Если результат-действие не задано, оболочка подставляет ошибку с переводом plugin_operation_timed_out, печатает «canceled in %.3fs» и возвращает статус 2 (код r24)59; по-английски этот перевод — «Operation time exceeded» (код r24)60.

r25, device:

  • За «cancelling by timeout» идут «FATAL ERROR detected (msg = operation timed out)», «killing PHP-server process...», «PHP-FW was shut down. The operation fails.» и «canceled in N s»: php_server остановлен, PHP-код вызова не доработал (устройство r25)16.
  • На экране — диалог «Превышено время операции» с кнопкой OK (устройство r25)17.
  • Следующий вызов не ждёт отменённого: он сразу выполняется в новом php_server (устройство r25)19. Статические переменные при этом начинаются заново, как после любого перезапуска процесса (устройство r25)61.
  • /tmp/run/<плагин>.pid после такой остановки в двух случаях из трёх исчез, а в третьем остался с pid убитого процесса (устройство r25)62.

Чем путь r25 отличается от кода r24, — в «Расхождениях».

2.3. Ожидание индекса mc, отсчёт timeout_us и отмена по дедлайну (код r25)

Тайм-аут из §2.1 отсчитывается не всегда с момента вызова: перед операцией оболочка может ждать проверки индекса mc (код r25)18. Ниже — код оболочки tv188b 261021_0117_r25 (уровень code).

  • В nav_plugin_perform_operation_blocked предварительное ожидание проверки индекса mc идёт до снятия начального времени и вычисления дедлайна timeout_us, поэтому длительность этого ожидания в timeout_us операции не входит (код r25)18.
  • Незавершённый активный запрос plugin_opexec откладывает запуск операции, пока у него установлено ожидание проверки mc (байт +0x20) (код r25)63. Проверка — это FS_read_int('/tmp/plugins/shell_ext/mc_index_valid.txt', -1), и запуск продолжается только при результате 1 (код r25)64: тогда обработчик пишет mc index now valid, сбрасывает байт и переходит к запуску (код r25)63.
  • По достижении дедлайна timeout_us блокирующий цикл отменяет поставленный запрос по id с fast=1, но после этого продолжает обрабатывать запросы и ждать ненулевого статуса результата (код r25)65. Так же, с fast = 1 и дальнейшим ожиданием результата, отменяет запрос по сроку код r24 (код r24)56; что затем видно на устройстве r25 — §2.2.
  • На устройстве (один прогон) перед plugin_installer:// файл /tmp/plugins/shell_ext/mc_index_valid.txt содержал 1, и установка test_plugin13z прошла за ~2 с без видимого ожидания индекса mc; ветвь ожидания при значении, отличном от 1, прогон не проверял (устройство r25)66.

2.4. Тайм-аут по операциям без operation_timeout (r25)

Код r25 возвращает срок для любого типа операции 0–12 (§2.1) (код r25)53, но при проверке на устройстве по сроку отменялись не все операции (устройство r25)67. Таблица — tv188b 261021_0117_r25, манифест тестового плагина без operation_timeout, если не сказано иное; каждая строка устройства — один прогон.

Операция (native kind) Код r25 Устройство r25 Claim
get_folder_view (0) нативный вызов передаёт исполнителю timeout_us = 60 000 000 (60 с) из plugin_get_operation_timeout_us(plugin,0) проверка на устройстве: сон 75 с отменён через 60 с — «cancelling by timeout (60.0s)», php_server остановлен, диалог «Превышено время операции» (устройство r25, код r25)68
get_regular_folder_items (2) — проверка на устройстве: сон 75 с (from=2) не отменён — range_loader завершил задачу succeeded, затем пришёл запрос from=4 (устройство r25)8
get_folder_rows (3) ставится загрузчиком rows_loader (§1.3) проверка на устройстве: сон 75 с не отменён — rows_loader завершил задачу succeeded, сразу пришёл запрос для r3 (устройство r25, код r25)69
get_folder_rows (3), манифест operation_timeout/default = 30 — проверка на устройстве: сон 40 с не отменён на 30 с — задача succeeded через 40 с, затем запрос ["r3"] (устройство r25)70
handle_user_input (4) — две проверки на устройстве: старт с timeout=60.0s (§2.1) (устройство r25)5

Соответствие kind и имени операции — по коду r25 (код r25)41. Для get_regular_folder_items и get_folder_rows прогон ограничен 75 с сна: есть ли у них предел дольше, он не показал (устройство r25)67. Что из этого следует для плагина: долгий get_folder_view в этом прогоне упёрся в 60 с и закрылся диалогом ошибки, а долгий get_regular_folder_items или get_folder_rows в этих прогонах не прерывался и дорабатывал до конца сна (устройство r25)71. В одном прогоне у плагина без элемента operation_timeout get_folder_view отменён по 60 с, а get_regular_folder_items того же плагина за 75 с — нет (устройство r25)72.

3. Процесс php_server

Что Наблюдение Claim
Сколько процессов r24, device: по php_server на плагин, все — дочерние com.dunehd.app (устройство r24)73
Когда стартует r25, device: при первом вызове плагина, а не при регистрации (устройство r25)74
Перезапуск по правке r25, device: при смене mtime main.php, но не подключаемых файлов (устройство r25)75
Статические переменные r25, device: живут, пока жив процесс, и обнуляются при перезапуске (устройство r25)76
Fatal error или exit() в вызове r25, device: «treating empty result as failure and stopping server», PHP_CALL_FAILED, «Ошибка приложения»; следующий вызов — новый процесс (устройство r25)77
call_plugin вернул null r25, device: то же — пустой ответ считается сбоем, PHP_CALL_FAILED, на экране «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» (устройство r25)78
Внешний kill -9 r25, device: замечается только при следующем вызове («child N exited, signal 9»), затем новый процесс и успешный вызов (устройство r25)79
/tmp/run/<плагин>.pid r25, device: pid текущего php_server; в r25 путь .pid есть в strings php_server, в r24 — нет (устройство r25, код r25)80
uid r25, device: 1000 (устройство r25)81

Диалог «Ошибка приложения» записан целиком при проверке на tv188b r25 (device, один прогон, запуск тестового плагина KB11 reg): текст «Произошла ошибка. Приложение будет закрыто.», кнопка OK, закрыт клавишей BACK; причина сбоя в этом прогоне не установлена (устройство r25)82.

Код r24 (PhpDriver::start_call): при неудаче передачи вызова PHP-клиент останавливает php_server и делает ещё одну попытку с запуском сервера заново — всего не больше двух передач; вторая неудача возвращает 0, а неудачный запуск сервера завершает вызов сразу (код r24)83.

SDK предупреждает, что экземпляр PHP-движка может быть пересоздан в любой момент и полагаться на глобальные переменные нельзя (SDK)84.

4. Прогресс-диалог

По коду r24:

  • Задержка показа берётся из аргумента операции, иначе из записи плагина (поле манифеста), иначе — 1 000 000 мкс (1 с) (код r24)85.
  • Заголовок — из аргумента операции, иначе заголовок плагина, иначе перевод plugin_connecting («Connecting...») (код r24)86.
  • Пока GUI не инициализирован, диалог отключён (код r24)87.

В манифесте задержка задаётся ключом operation_progress_dialog_show_delay, а оболочка печатает её в микросекундах («default operation progress dialog show delay: %d microseconds») (код r24)88; встроенные ext_epg и ktv_start пишут туда 20000 (код r24)89. В каких единицах значение манифеста, код не показывает: см. «Не проверено».

5. Отладочные флаги

  • В коде r24 сообщения исполнителя закрыты флагами /config/hd_debug/PLUGIN_OPEXEC.txt (0), PLUGIN_OPEXEC_SIZE.txt (0), PLUGIN_OP.txt (0) и PLUGIN_OP_HUI.txt (1) (код r24)90.
  • Код r25 — те же умолчания для печати «start (timeout=…)»: /config/hd_debug/PLUGIN_OP.txt читается с default=0 (код r25)91, /config/hd_debug/PLUGIN_OP_HUI.txt — с default=1 (код r25)92. Для handle_user_input (тип 4) сначала проверяется PLUGIN_OP_HUI, а при значении <=0 — общая проверка PLUGIN_OP, куда остальные типы попадают сразу (код r25)93. Поэтому строку «start (timeout=…)» по умолчанию ждите у handle_user_input, а у других операций — после PLUGIN_OP.txt = 1; это выбор проверки, а не достаточное условие каждой печати (код r25)94.
  • Код r24: сообщения [php] start_call(): call_id и [php] [call: N]: starting... печатаются при уровне PHP_CLIENT >= 2; уровень читает помощник FUN_00148a34 из /config/hd_debug/PHP_CLIENT.txt (код r24)95.
  • На r25 (device) при старте оболочка печатает их значения (устройство r25)96. $FS_PREFIX/config/hd_debug/PLUGIN_OPEXEC.txt = 1, созданный до старта оболочки, включил сообщения «plugin_opexec D: …» (устройство r25)97. PLUGIN_UPDATE.txt = 1 строки «using PLUGIN_UPDATE» при старте не дал (устройство r25)98.
  • «still working...» печатается не чаще раза в секунду (код r24)99; подряд идущие handle_user_input по таймеру логируются не все (код r24)100.
  • В r25 набор сообщений исполнителя тот же, добавлены сообщения о проверке индекса mc и новый формат «%s->%s(%s.%s)» (код r25)101.

6. Расхождения

  • Умолчание тайм-аута. SDK: 10 с (SDK)102; r25 (device): handle_user_input без operation_timeout — 60 с (устройство r25)5. Стороны связаны conflicts_with. Ключ operation_timeout/default манифеста на r25 при этом работает (устройство r25)3. get_folder_view без operation_timeout при проверке на устройстве тоже отменён через 60 с, а не 10 с из SDK (устройство r25)103; с SDK эти claims conflicts_with не связаны.
  • Срок в коде и асинхронные загрузчики r25. По коду срок есть у любого типа операции 0–12, а операции без своего элемента получают общее значение (код r25)104. На устройстве get_folder_rows при operation_timeout/default = 30 в манифесте не отменён на 30 с (устройство r25)70, а без operation_timeout — за 75 с (устройство r25)9. Это не прямое противоречие: claims кода говорят о вычисленном значении, а применяют ли его rows_loader и range_loader, ни один claim не говорит; conflicts_with нет.
  • Отмена по тайм-ауту: r24 (код) и r25 (устройство). В коде r24 отмена у PHP-плагина только ставит флаг, а поздний результат отбрасывается (код r24)105. На r25 оболочка по тайм-ауту убивает php_server (устройство r25)16. Сборки разные, а какая ветка кода останавливает процесс, claims не говорят. Гипотеза r24 «PHP-вызов не прерывается» (disputed, см. «Не проверено») с наблюдением r25 conflicts_with не связана.
  • Очередь на r25. Код r24 описывает ожидание в очереди плагина с сообщением «postponed» (код r24)1, а на r25 второй запрос до исполнителя не дошёл вовсе, пока шла первая операция (устройство r25)2. Итог для плагина тот же: операции не пересекаются.

7. Не проверено

Гипотезы (inference) и disputed; кандидаты на проверку на устройстве.

Утверждение Статус Claim
r24: тайм-аут отсчитывает оболочка, PHP-вызов не прерывается, поздний результат отбрасывается inference, disputed (вывод r24)106
Пустой ответ php_server останавливает процесс, и следующий вызов теряет статические переменные (r25 — §3) inference, disputed (вывод r24)107
r24: оболочка проверяет php_server через waitpid при следующем вызове и после внешнего убийства запускает новый (r25 — §3) inference (вывод r24)108
r24: php_server берёт результат из $out, при неудаче пишет «php-call failed» / «can not retrieve 'out'», а оболочка трактует пустой ответ как PHP_CALL_FAILED inference (вывод r24)109
php_server живёт между вызовами, статические переменные переживают вызов (r25 — §3) inference (вывод r24)110
Ответ с чужим номером вызова логируется и отбрасывается inference (вывод r24)111
Закрытие каналов оболочкой служит php_server сигналом остановки inference (вывод r24)112
Единица operation_progress_dialog_show_delay в манифесте (мс с пересчётом или мкс) из строк не следует inference, disputed (вывод r24)113
r24: целочисленные /config/hd_debug/<KEY>.txt перечитываются при смене mtime inference (вывод r24)114

  1. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c042 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Очередь операций устроена так, что у плагина одновременно работает не больше одной операции: plugin_opexec_try_activate_requests пропускает плагины, уже попавшие в набор занятых, а при постановке запроса, если у плагина уже есть активная запись, активация не вызывается, а при PLUGIN_OPEXEC = 1 печатается «plugin_opexec I: postponed since %s currently active». ↩↩↩

  2. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запуск по IP Control точки входа плагина, пока у того же плагина идёт 20-секундный handle_user_input, исполняется только после конца первого вызова (через ~0,04 с после его результата) и в том же php_server; строк «postponed since … currently active» и «canceling active cancelable» нет — второй запрос попадает в исполнитель операций уже после конца первого. ↩↩↩

  3. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключи манифеста operation_timeout/default и operation_timeout/<тип операции> задаются в секундах и работают: 5 дало handle_user_input «start (timeout=5.0s)» и отмену на 5 с, 7 — «timeout=7.0s» и отмену на 7 с. ↩↩↩

  4. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключ operation_timeout в данных действия plugin_handle_user_input задаётся в миллисекундах: 3000 дало «start (timeout=3.0s)» и отмену через 3,3 с, 3 — «timeout=0.0s» и отмену через 0,36 с, 60000 — «timeout=60.0s»; значение из данных действия перекрывает operation_timeout/default манифеста (5). ↩↩

  5. fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (test_plugin5, test_plugin6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». ↩↩↩↩

  6. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_view тестового плагина test_plugin13t без operation_timeout, спавший 75 с, оболочка отменила через 60 с: в shell.log «cancelling by timeout (60.0s)», PHP-сервер плагина остановлен, затем show_error «Превышено время операции». ↩

  7. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при нативном вызове get_folder_view через 0x00257500 без operation_timeout в манифесте nav_plugin_perform_operation_blocked получает timeout_us=60000000 (60 с): четвёртым аргументом передаётся результат plugin_get_operation_timeout_us(plugin,0). ↩

  8. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_regular_folder_items(from=2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: сон завершился через 75 с, range_loader закончил задачу со статусом succeeded, затем пришёл следующий запрос from=4. ↩↩

  9. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_rows(row_ids r1,r2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: rows_loader закончил задачу со статусом succeeded через 75 с, и сразу пришёл get_folder_rows для r3; rows_info первого пункта ждал этот же 75 с. ↩↩↩

  10. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c038 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) на пустой ответ get_folder_rows оболочка повторяла запрос без паузы: за ~45 с случая пришло 7977 вызовов get_folder_rows (741 с ["r1","r2"], затем после кнопки вниз — 7234 с ["r1"]), повторы шли до уборки случая. ↩↩↩

  11. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c061 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где ряд r2 — снова row_dup с data "ld" (вариант ld, как loading-ряд), вызвал цикл повторов без паузы: 18602 вызова get_folder_rows за ~41 с (от ~190 до ~710 в секунду). ↩↩

  12. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c059 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где ряд r2 — row_regular с пустым items (вариант zero), не вызвал повторов: за ~45 с случая было 2 вызова get_folder_rows (["r1","r2"] и ["r3"]). ↩↩

  13. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c060 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где вместо ряда r2 отдан row_vgap с тем же id (вариант vgap), не вызвал повторов: за ~45 с случая было 2 вызова get_folder_rows. ↩↩

  14. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) ENTER во время медленного get_folder_rows (сон 20 с) поставил handle_user_input(rows_enter) и вызвал «canceling active cancelable», но rows_enter дошёл до плагина только после возврата get_folder_rows через 20 с; задача rows_loader завершилась со статусом canceled, затем ряды запрошены заново (["r1"]). ↩↩

  15. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) переходы фокуса вниз и вправо во время медленного get_folder_rows (сон 20 с) не отменили его: задача rows_loader завершилась succeeded через 20 с, строки «canceling» нет; rows_info для новых пунктов не отправлялись до её завершения. ↩↩

  16. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. ↩↩↩

  17. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out). ↩↩

  18. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В nav_plugin_perform_operation_blocked предварительный вызов ожидания проверки индекса mc выполняется до снятия начального времени и вычисления дедлайна timeout_us; длительность этого вызова в timeout_us операции не входит. ↩↩↩

  19. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующий вызов плагина после отмены по тайм-ауту не ждёт отменённого: php_server с отменённым вызовом уже убит, и вызов, пришедший через ~4,7 с, сразу выполняется в новом php_server («[php] creating...», новый pid); код отменённого вызова не продолжился. ↩↩↩

  20. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды IP Control ждут, пока идёт handle_user_input плагина: launch_media_url, отправленный через 4 с после начала 20-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. ↩↩

  21. fw-tv188b-261021-0117-r25.c343 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие PROG_BLUE, нажатое в 22:10:24 во время операции таймера (sleep 3), дошло до плагина в 22:10:26.592 — сразу после timer end в 22:10:26.588, то есть ждало конца операции. ↩↩

  22. fw-tv188b-261021-0117-r25.c345 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 STOP в 22:11:25 по выводу скрипта во время спящего обработчика таймера (sleep 10) не прервал его: в shell.log обработчик продолжал still working до 19:11:33.699 UTC и вернул результат в 19:11:34.557 UTC; событие ev_playback_stop обработано после этого, в 19:11:34.609 UTC. ↩↩

  23. fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина test_plugin5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[test_plugin5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. ↩

  24. fw-tv188b-261021-0117-r25.c322 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после остановки php_server из-за сбоя вызова (Fatal error, exit(0)) следующий вызов плагина запускает новый php_server: в shell.log после «start (timeout=60.0s)» идёт «[test_plugin5] [php] server started; pid: 17849.» (после Fatal error) и «… pid: 17924.» (после exit). ↩

  25. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Исполнитель операций плагина собран из plugin_operation.c, plugin_operation_common.c и plugin_operation_executor.c; имена его функций видны в asserts: plugin_op_request_create, plugin_active_record_create, plugin_active_record_list_add, plugin_active_record_list_release, poe_queue_record_list_add, poe_queue_record_list_remove, plugin_op_request_list_insert, plugin_op_request_list_remove, plugin_opexec_try_activate_requests, poe_arec_do_cancel, plugin_opexec_handle_active_requests. ↩

  26. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Типы операций плагина в оболочке перечислены подряд в plugin_operation.c: get_folder_view, get_next_folder_view, get_regular_folder_items, handle_user_input, get_tv_info, get_day_epg, get_tv_playback_url, get_tv_stream_url, change_tv_favorites, get_vod_info, get_vod_stream_url, get_vod_stream_info. ↩

  27. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Создание запроса операции (plugin_op_request_create) устроено так: запрос получает 64-битный id из общего счётчика исполнителя, флаг «отменяемый», копию имени плагина (strdup), тип операции, входные данные, обратный вызов завершения и его аргумент; после постановки в очередь при PLUGIN_OPEXEC = 1 печатается «[plugin_opexec] queued %s». ↩

  28. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Очередь запросов ведётся отдельно для каждого плагина: запись очереди ищется по имени плагина, а активные операции хранятся отдельным списком, к которому привязан набор имён плагинов с активной операцией. ↩

  29. doc-sdk-plugins.c060 · doc · any-documented; прошивка — · Плагин обрабатывает одновременно только один вызов: вызовы из Dune GUI всегда сериализуются ↩

  30. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Новый запрос отменяет текущую активную операцию того же плагина, если та помечена отменяемой: печатается «plugin_opexec I: canceling active cancelable for %s» и вызывается poe_arec_do_cancel с флагом fast = 0. ↩

  31. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c027 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Активная запись удаляется из списка только когда операция не выполняется: при непустом дескрипторе операции печатается «plugin_opexec W: can't a-remove still running %s» и запись остаётся; иначе печатается «a-removing %s», имя плагина выходит из набора занятых, и у плагина может активироваться следующий запрос. ↩

  32. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Синхронный прогон операции — nav_plugin_perform_operation_blocked (nav_plugin_common.c): он ставит в очередь неотменяемый запрос с обратным вызовом, затем в цикле вызывает plugin_opexec_handle_active_requests и спит usleep(50000) (50 мс), пока статус запроса не станет отличным от нуля. ↩

  33. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Статусы операции плагина: 1 — Succeeded, 2 — Failed, 3 — Cancelled, 4 — API Error; статус 4 оболочка заменяет на 2 и подставляет в результат ошибку с текстами plugin_default_title_application_error и plugin_default_msg_unhandled_plugin_error. ↩

  34. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Операция активируется (plugin_opexec_try_activate_requests) только когда исполнитель не находится внутри обратного вызова результата; при активации запоминается время старта, а если плагин по имени не найден или запуск операции не удался, запрос сразу получает статус 2 с сообщением «no such plugin for %s» или «start_operation failed for %s». ↩

  35. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c024 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При остановке воспроизведения (play-stop) исполнитель удаляет из очередей запросы типов 5–7 (в порядке plugin_operation.c — get_day_epg, get_tv_playback_url, get_tv_stream_url) с сообщением «plugin_opexec D: play-stop q-removing %s», а такие же активные операции отменяет с флагом fast = 1 («play-stop a-canceling req %lld»). ↩

  36. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При деактивации плагина исполнитель удаляет из очереди все его запросы («plugin_opexec D: q-removing %d requests on '%s' deactivate»), а работающую активную операцию помечает отменённой и ставит ей статус 3 («plugin_opexec D: canceled on deactivate %s»), не вызывая отмену у самого плагина. ↩

  37. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c026 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Запросы get_day_epg (тип 5) исполнитель дедуплицирует и ограничивает по числу: если такой же день уже загружается активной операцией — «ignoring epg req, day already loading as %s» и запрос не создаётся; такой же запрос в очереди удаляется («q-removing %s: same EPG day request»); лишние удаляются с «q-removing #%d, %s: too many epg requests». ↩

  38. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=main_screen и запуск по IP Control точки входа другого плагина, отправленные через 4 с после начала 20-секундного handle_user_input, эту операцию не отменяют: она дорабатывает до конца («end long», «result action null»), строк «q-removing … deactivate» и «canceled» нет. ↩

  39. fw-tv188b-261021-0117-r25.c344 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=main_screen, отправленный в 22:10:55 во время спящего обработчика таймера (sleep 10), вернул ответ в 22:11:05 — после timer end в 22:11:04.970; player_state при ответе — navigator. ↩

  40. fw-tv188b-261021-0117-r25.c346 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после cmd=main_screen во время операции плагина (C2) главный экран оболочки был чёрным; вернул его только keyevent HOME; причина не установлена. ↩

  41. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 plugin_operation_type_to_string (0x00295e50) сопоставляет native kind=0 с get_folder_view, 2 — с get_regular_folder_items, 3 — с get_folder_rows, 4 — с handle_user_input. ↩↩

  42. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При отсутствии текущего request_id rows_loader вызывает источник запросов и ставит полученный пакет как операцию get_folder_rows (native kind=3); после обработки запросов цикл повторяется, пока есть готовые пакеты и нет текущей задачи. ↩

  43. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) при открытии рядов test_plugin13 в режиме load (r1–r3 — LOADING через row_dup) оболочка сама, без кнопок, запросила get_folder_rows сначала для ["r1","r2"], затем для ["r3"]; после ответов фокус кнопкой вниз переходил на r1.0, r2.0, r3.0. ↩

  44. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) на неполный ответ get_folder_rows (запрошены r1,r2, возвращён только r1) оболочка сразу запросила недостающий ["r2"], затем ["r3"]; после этого повторов не было (3 вызова за случай). ↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c038 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) на пустой ответ get_folder_rows оболочка повторяла запрос без паузы: за ~45 с случая пришло 7977 вызовов get_folder_rows (741 с ["r1","r2"], затем после кнопки вниз — 7234 с ["r1"]), повторы шли до уборки случая.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c059 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где ряд r2 — row_regular с пустым items (вариант zero), не вызвал повторов: за ~45 с случая было 2 вызова get_folder_rows (["r1","r2"] и ["r3"]).
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c060 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где вместо ряда r2 отдан row_vgap с тем же id (вариант vgap), не вызвал повторов: за ~45 с случая было 2 вызова get_folder_rows.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c061 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) ответ get_folder_rows, где ряд r2 — снова row_dup с data "ld" (вариант ld, как loading-ряд), вызвал цикл повторов без паузы: 18602 вызова get_folder_rows за ~41 с (от ~190 до ~710 в секунду).

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) ENTER во время медленного get_folder_rows (сон 20 с) поставил handle_user_input(rows_enter) и вызвал «canceling active cancelable», но rows_enter дошёл до плагина только после возврата get_folder_rows через 20 с; задача rows_loader завершилась со статусом canceled, затем ряды запрошены заново (["r1"]).
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) переходы фокуса вниз и вправо во время медленного get_folder_rows (сон 20 с) не отменили его: задача rows_loader завершилась succeeded через 20 с, строки «canceling» нет; rows_info для новых пунктов не отправлялись до её завершения.

    ↩

  45. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) plugin_invalidate_folders своей папки рядов из таймера при фокусе на r1.2 вызвал новый get_folder_view с sel_state, содержащим r1 и r1.2; оболочка восстановила фокус на r1.2. ↩

  46. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) после plugin_invalidate_folders таймер нового вида папки рядов сработал ещё раз через 8 с (второй handle_user_input(rows_timer), ответ null); всего за случай два вызова таймера. ↩

  47. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Тайм-аут операции приходит в nav_plugin_perform_operation_blocked в микросекундах: функция проверяет assert «timeout_us >= 0», сравнивает его с часами CLOCK_MONOTONIC в микросекундах и в сообщении «start (timeout=%.1fs)» делит на 1000000. ↩

  48. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 положительное operation_timeout в данных действия plugin_handle_user_input задаёт миллисекунды (перед исполнителем умножается на 1000), а operation_timeout из манифеста — секунды (plugin_get_operation_timeout_us умножает его на 1000000). ↩

  49. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 конструктор структуры плагина (fcn.0028fc3c) обнуляет её и записывает в поле +0x2c значение 0x3c (60); это поле parse_plugin_manifest затем использует как общий тайм-аут операций в секундах. ↩

  50. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при первом распознанном дочернем элементе operation_timeout (кроме default) parse_plugin_manifest создаёт таблицу из 13 значений, заполняет её общим тайм-аутом и записывает в ячейку операции только положительное число из текста элемента. Операции без своего элемента получают общее значение. ↩

  51. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 plugin_get_operation_timeout_us (0x0027cb2c) для типа 0–12 возвращает значение таблицы +0x30 по индексу типа, а при NULL таблицы — общий тайм-аут +0x2c описателя plugin+0x38; результат умножается на 1000000 (секунды → мкс). ↩↩

  52. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c047 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 parse_plugin_manifest читает operation_timeout/default (при отсутствии -1) в поле +0x2c и, если значение меньше 1, заменяет его на 0x3c (60); строку «default operation timeout is %d sec» пишет только для положительного значения. ↩↩

  53. fw-tv188b-261021-0117-r25.c310 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 handle_user_input test_plugin5 со sleep(15) при «start (timeout=60.0s)» доработал без отмены: результат («result action») пришёл через ~15 с после старта, сообщений об отмене по тайм-ауту нет, а следующий вызов исполнил тот же php_server 17676. ↩

  54. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c012 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · По истечении тайм-аута nav_plugin_perform_operation_blocked печатает «plugin W: %s->%s(%s): cancelling by timeout (%.1fs)» и отменяет свой запрос вызовом отмены по id с флагом fast = 1, но продолжает ждать результата в том же цикле. ↩↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · poe_arec_do_cancel для уже работающей операции только помечает её отменённой: печатает «plugin_opexec D: canceling working %s» (при повторной отмене — «already canceled working %s» и выходит) и вызывает отмену у плагина (plugin_cancel_operation с дескриптором операции) лишь при ненулевом флаге fast.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся.

    ↩

  55. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка результата операции PHP-плагина (php_plugin.c, fcn.002720ec) при пришедшем результате смотрит флаг отмены в дескрипторе операции: если он выставлен, печатается «Received result for cancelled operation.», а результат не разбирается и не отдаётся оболочке. ↩

  56. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если операция была отменена по тайм-ауту и действие-результат не задано, оболочка подставляет в результат ошибку с текстом перевода plugin_operation_timed_out, печатает «plugin W: %s->%s(%s): canceled in %.3fs» и возвращает статус 2. ↩

  57. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения тайм-аута операции плагина «start (timeout=%.1fs)», «cancelling by timeout (%.1fs)», «canceled in %.3fs» и ключ перевода plugin_operation_timed_out; по-английски он переведён как «Operation time exceeded» ↩

  58. fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). ↩

  59. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/.pid содержит pid текущего php_server плагина (по нему находится процесс «php_server test_plugin7_to …», после перезапуска — новый pid); после остановки php_server по тайм-ауту файл в двух случаях из трёх отсутствовал, в третьем остался с pid убитого процесса. ↩

  60. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · У незавершённого активного запроса plugin_opexec ожидание проверки mc хранится в байте +0x20: пока он ненулевой, запуск операции отложен; при FUN_0041cd54()==1 обработчик пишет «mc index now valid», сбрасывает байт и переходит к запуску. ↩↩

  61. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c019 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Проверка mc в 0x0041cd54 — хвостовой вызов FS_read_int('/tmp/plugins/shell_ext/mc_index_valid.txt', -1); ожидающий активный запрос продолжает запуск только при результате этой проверки 1. ↩

  62. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В блокирующем цикле после постановки запроса достижение дедлайна timeout_us вызывает отмену этого запроса по id с fast=1; после вызова отмены цикл продолжает обрабатывать запросы и ждать ненулевого статуса результата. ↩

  63. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) перед plugin_installer:// файл /tmp/plugins/shell_ext/mc_index_valid.txt содержал 1, и установка test_plugin13z прошла за ~2 с (команда 19:57:31, install action завершён 16:57:33 по времени shell.log) без видимого ожидания индекса mc. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_regular_folder_items(from=2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: сон завершился через 75 с, range_loader закончил задачу со статусом succeeded, затем пришёл следующий запрос from=4.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_rows(row_ids r1,r2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: rows_loader закончил задачу со статусом succeeded через 75 с, и сразу пришёл get_folder_rows для r3; rows_info первого пункта ждал этот же 75 с.

    ↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при нативном вызове get_folder_view через 0x00257500 без operation_timeout в манифесте nav_plugin_perform_operation_blocked получает timeout_us=60000000 (60 с): четвёртым аргументом передаётся результат plugin_get_operation_timeout_us(plugin,0).
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_view тестового плагина test_plugin13t без operation_timeout, спавший 75 с, оболочка отменила через 60 с: в shell.log «cancelling by timeout (60.0s)», PHP-сервер плагина остановлен, затем show_error «Превышено время операции».
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (один прогон) get_folder_view плагина без элемента operation_timeout в манифесте оболочка отменила по тайм-ауту 60 с (а не 10 с из SDK); get_regular_folder_items того же плагина, спавший 75 с, отменён не был.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При отсутствии текущего request_id rows_loader вызывает источник запросов и ставит полученный пакет как операцию get_folder_rows (native kind=3); после обработки запросов цикл повторяется, пока есть готовые пакеты и нет текущей задачи.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_rows(row_ids r1,r2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: rows_loader закончил задачу со статусом succeeded через 75 с, и сразу пришёл get_folder_rows для r3; rows_info первого пункта ждал этот же 75 с.

    ↩

  64. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_rows test_plugin13, спавший 40 с при operation_timeout/default=30 в манифесте, не был отменён на 30 с: задача rows_loader завершилась succeeded через 40 с, затем пришёл запрос ["r3"]. ↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_view тестового плагина test_plugin13t без operation_timeout, спавший 75 с, оболочка отменила через 60 с: в shell.log «cancelling by timeout (60.0s)», PHP-сервер плагина остановлен, затем show_error «Превышено время операции».
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_regular_folder_items(from=2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: сон завершился через 75 с, range_loader закончил задачу со статусом succeeded, затем пришёл следующий запрос from=4.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_rows(row_ids r1,r2) тестового плагина test_plugin13t без operation_timeout, спавший 75 с, не был отменён: rows_loader закончил задачу со статусом succeeded через 75 с, и сразу пришёл get_folder_rows для r3; rows_info первого пункта ждал этот же 75 с.

    ↩

  65. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (один прогон) get_folder_view плагина без элемента operation_timeout в манифесте оболочка отменила по тайм-ауту 60 с (а не 10 с из SDK); get_regular_folder_items того же плагина, спавший 75 с, отменён не был. ↩

  66. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c030 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 одновременно работают три процесса php_server — по одному на плагин (shell_ext, dune-hd.tv, android_apps), все — дочерние com.dunehd.app, с аргументами <плагин> <скрипт> /tmp/run /tmp/plugins/<плагин>/system_properties.txt  ↩

  67. fw-tv188b-261021-0117-r25.c297 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server нового PHP-плагина из flashdata запускается при первом вызове плагина, а не при его регистрации: после регистрации test_plugin6 процесса php_server test_plugin6 нет, а при первом handle_user_input в shell.log идут «start (timeout=60.0s)», «[test_plugin6] [php] creating...», «server started; pid: 31928.», «ready.» (так же у test_plugin5, pid 17362). ↩

    • fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина test_plugin5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[test_plugin5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676.
    • fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server test_plugin5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет.

    ↩

    • fw-tv188b-261021-0117-r25.c307 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статическая переменная класса плагина сохраняется между вызовами, пока жив php_server: счётчик KbProbe5Fw::$n, увеличиваемый в каждом call_plugin, рос 1→5 в пяти вызовах процесса 17362 (13:38:00–13:39:25).
    • fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924).

    ↩

    • fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)».
    • fw-tv188b-261021-0117-r25.c322 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после остановки php_server из-за сбоя вызова (Fatal error, exit(0)) следующий вызов плагина запускает новый php_server: в shell.log после «start (timeout=60.0s)» идёт «[test_plugin5] [php] server started; pid: 17849.» (после Fatal error) и «… pid: 17924.» (после exit).

    ↩

  68. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». ↩

  69. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c038 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 смерть php_server от внешнего kill -9 оболочка замечает только при следующем вызове плагина: «plugin W: () child exited, signal 9», затем «shutting down... stopped.», новый php_server («server started; pid: …») и успешный вызов. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/.pid содержит pid текущего php_server плагина (по нему находится процесс «php_server test_plugin7_to …», после перезапуска — новый pid); после остановки php_server по тайм-ауту файл в двух случаях из трёх отсутствовал, в третьем остался с pid убитого процесса.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 php_server содержит путь /tmp/run/%s.pid и импорт FS_writestring, которых нет в strings php_server r24

    ↩

  70. fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. ↩

  71. fw-tv188b-261021-0117-r25--plugin-loader.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 диалог ошибки при запуске KB11 reg имел заголовок «Ошибка приложения», текст «Произошла ошибка. Приложение будет закрыто.» и кнопку OK; диалог закрыт BACK. ↩

  72. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При неудаче передачи вызова PHP-клиентом PhpDriver::start_call останавливает php_server и допускает одну повторную попытку с запуском сервера заново (всего максимум две попытки передачи); при второй неудаче возвращает 0, а неудачный запуск сервера завершает вызов сразу. ↩

  73. doc-sdk-plugins.c061 · doc · any-documented; прошивка — · Глобальные переменные PHP обычно сохраняются между вызовами, но экземпляр движка может быть пересоздан в любой момент между вызовами — плагин не должен на них полагаться ↩

  74. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Задержка показа прогресс-диалога берётся из аргумента операции; если он отрицательный — из записи плагина (поле манифеста по смещению 0x28), а если и там отрицательное — 1000000 мкс (1 с). ↩

  75. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Заголовок прогресс-диалога берётся из аргумента операции; если он пуст или состоит из пробелов — из заголовка плагина, а если и тот пуст — из перевода plugin_connecting («Connecting...»). ↩

  76. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если GUI ещё не инициализирован, прогресс-диалог для операции отключается, и при включённом PLUGIN_OP печатается «plugin D: GUI not initialized, progress disabled». ↩

  77. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит ключи operation_progress_dialog_show_delay и operation_timeout (подобласти parse_plugin_manifest()) и сообщения «%s: default operation progress dialog show delay: %d microseconds», «%s: default operation timeout is %d sec», «%s: operation '%s' timeout is %d sec» ↩

  78. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные ext_epg и ktv_start задают operation_progress_dialog_show_delay/default = 20000 (у shell_ext то же значение — fw-tv188b-260827-0003-r24--shell-ext.c014) ↩

  79. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сообщения исполнителя операций закрыты отладочными флагами, которые читаются как целое через FS_read_int со значением по умолчанию: /config/hd_debug/PLUGIN_OPEXEC.txt (0) — сообщения plugin_opexec, /config/hd_debug/PLUGIN_OPEXEC_SIZE.txt (0) — «plugin_opexec size D: queue …», /config/hd_debug/PLUGIN_OP.txt (0) — сообщения операции (start, finished, progress dialog), /config/hd_debug/PLUGIN_OP_HUI.txt (1) — сообщения handle_user_input. ↩

  80. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 FUN_0014eb50 при кэшированном значении -1 читает /config/hd_debug/PLUGIN_OP.txt через FS_read_int с default=0 и возвращает кэшированное значение; это проверка печати start (timeout=…) для типов кроме 4. ↩

  81. fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 FUN_0014ebc8 при кэшированном значении -1 читает /config/hd_debug/PLUGIN_OP_HUI.txt через FS_read_int с default=1 и возвращает кэшированное значение; это отдельная проверка печати start (timeout=…) для handle_user_input. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при выборе печати «start (timeout=%.1fs)» nav_plugin_perform_operation_blocked для типа 4 сначала проверяет FUN_0014ebc8()>0; при значении <=0 переходит к общей проверке FUN_0014eb50()>0, куда остальные типы попадают сразу.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 FUN_0014eb50 при кэшированном значении -1 читает /config/hd_debug/PLUGIN_OP.txt через FS_read_int с default=0 и возвращает кэшированное значение; это проверка печати start (timeout=…) для типов кроме 4.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 FUN_0014ebc8 при кэшированном значении -1 читает /config/hd_debug/PLUGIN_OP_HUI.txt через FS_read_int с default=1 и возвращает кэшированное значение; это отдельная проверка печати start (timeout=…) для handle_user_input.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при выборе печати «start (timeout=%.1fs)» nav_plugin_perform_operation_blocked для типа 4 сначала проверяет FUN_0014ebc8()>0; при значении <=0 переходит к общей проверке FUN_0014eb50()>0, куда остальные типы попадают сразу.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 FUN_0014eb50 при кэшированном значении -1 читает /config/hd_debug/PLUGIN_OP.txt через FS_read_int с default=0 и возвращает кэшированное значение; это проверка печати start (timeout=…) для типов кроме 4.

    ↩

  82. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 сообщения «[php] start_call(): call_id» и «[php] [call: N]: starting...» печатаются при уровне PHP_CLIENT >= 2, который читает помощник FUN_00148a34 из /config/hd_debug/PHP_CLIENT.txt. ↩

  83. fw-tv188b-261021-0117-r25.c085 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect4 на tv188b r25 оболочка при старте вывела в shell.log PLUGIN_OP = 0, PLUGIN_OPEXEC = 0, PLUGIN_OPEXEC_SIZE = 0 и PLUGIN_OP_HUI = 1; это наблюдение не задаёт значения при наличии файлов $FS_PREFIX/config/hd_debug/.txt. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при проверке на устройстве файл $FS_PREFIX/config/hd_debug/PLUGIN_OPEXEC.txt существовал до перезапуска оболочки (am force-stop в 22:07:27, новый pid в 22:07:31), и после старта в shell.log появилось «hd_debug D: using PLUGIN_OPEXEC = 1».
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при проверке на устройстве при PLUGIN_OPEXEC = 1 в shell.log шли «plugin_opexec D: new activated req 92/…», «plugin_opexec D: req 93/…: still working...» и «plugin_opexec D: a-removing req 93/…»; сообщений «canceling req» в сохранённом выводе C1 нет.
    • fw-tv188b-260827-0003-r24--plugin-loader.c105 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл $FS_PREFIX/config/hd_debug/PLUGIN_OPEXEC.txt со значением 1, созданный до старта оболочки, дал при старте hd_debug D: using PLUGIN_OPEXEC = 1.

    ↩

  84. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте оболочки с $FS_PREFIX/config/hd_debug/PLUGIN_UPDATE.txt = 1 строка «hd_debug D: using PLUGIN_UPDATE = …» в shell.log не выводится, тогда как созданный рядом PLUGIN_OPEXEC.txt = 1 даёт «hd_debug D: using PLUGIN_OPEXEC = 1». ↩

  85. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сообщение «plugin_opexec D: %s: still working...» печатается не чаще одного раза в секунду: plugin_opexec_handle_active_requests сравнивает время с последней отметкой с 999999 мкс и обновляет отметку. ↩

  86. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c023 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подряд идущие операции handle_user_input с описанием ввода «timeout» или «timer» логируются не каждая: оболочка запоминает, что предыдущая операция была такой же, и пропускает сообщение о старте; в сообщениях о результате такие операции печатаются только при PLUGIN_OP_HUI больше 1. ↩

  87. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 (261021_0117_r25) набор сообщений исполнителя операций тот же, добавлены «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid» и «plugin_opexec D: %s: %s» (вместо «still working...»), а сообщения операции получили формат «%s->%s(%s.%s)». ↩

  88. doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве (один прогон) get_folder_view тестового плагина test_plugin13t без operation_timeout, спавший 75 с, оболочка отменила через 60 с: в shell.log «cancelling by timeout (60.0s)», PHP-сервер плагина остановлен, затем show_error «Превышено время операции».
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (один прогон) get_folder_view плагина без элемента operation_timeout в манифесте оболочка отменила по тайм-ауту 60 с (а не 10 с из SDK); get_regular_folder_items того же плагина, спавший 75 с, отменён не был.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 при первом распознанном дочернем элементе operation_timeout (кроме default) parse_plugin_manifest создаёт таблицу из 13 значений, заполняет её общим тайм-аутом и записывает в ячейку операции только положительное число из текста элемента. Операции без своего элемента получают общее значение.
    • fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 plugin_get_operation_timeout_us (0x0027cb2c) для типа 0–12 возвращает значение таблицы +0x30 по индексу типа, а при NULL таблицы — общий тайм-аут +0x2c описателя plugin+0x38; результат умножается на 1000000 (секунды → мкс).

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка результата операции PHP-плагина (php_plugin.c, fcn.002720ec) при пришедшем результате смотрит флаг отмены в дескрипторе операции: если он выставлен, печатается «Received result for cancelled operation.», а результат не разбирается и не отдаётся оболочке.

    ↩

  89. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c016 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Тайм-аут операции (operation_timeout; по SDK по умолчанию 10 с, потиповой N может задать своё значение) отсчитывает оболочка: по истечении она отменяет операцию у себя и сообщает «Operation time exceeded», но PHP-вызов в php_server не прерывается — его результат приходит позже и отбрасывается («Received result for cancelled operation»). ↩

  90. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c020 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пустой ответ PHP-сервера (например, после фатальной ошибки PHP, когда call_plugin не вернул строку) оболочка считает сбоем и останавливает php_server; следующий вызов запустит новый процесс, и статические и глобальные переменные PHP будут потеряны ↩

  91. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c022 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, на tv188b r24 оболочка проверяет php_server через waitpid при следующем вызове плагина и после внешнего убийства процесса запускает новый php_server. ↩

  92. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c026 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, на tv188b r24 php_server получает результат вызова из $out; при неудаче выполнения или невозможности получить $out пишет php-call failed либо can not retrieve out, а оболочка трактует пустой ответ как PHP_CALL_FAILED. ↩

  93. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c032 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · PHP-сервер плагина не завершается после вызова: он живёт между вызовами, пока оболочка его не остановит (правка скрипта, сбой, выход оболочки), поэтому статические переменные PHP (например, static $plugin в DefaultDunePluginFw::call_plugin_impl) обычно переживают вызов ↩

  94. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c009 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ответ php_server несёт номер вызова; оболочка сверяет его с ожидаемым и ответ с чужим номером (например, на ранее отменённый вызов) только логирует как «unexpected call id» и отбрасывает ↩

  95. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c024 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server в цикле читает вызовы из input_fd и отвечает в output_fd; ошибка чтения, в том числе конец файла после закрытия канала оболочкой, завершает цикл и процесс — закрытие каналов служит сигналом остановки ↩

  96. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c030 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · operation_progress_dialog_show_delay/default, вероятно, — задержка перед показом диалога хода операции плагина; лог печатает её в микросекундах, а встроенные плагины пишут 20000, так что единица значения в манифесте (мс с пересчётом или мкс) из строк не следует; в SDK ключ не описан ↩

  97. fw-tv188b-260827-0003-r24--plugin-loader.c104 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, на tv188b r24 оболочка перечитывает целочисленные параметры /config/hd_debug/.txt при изменении mtime файла. ↩