zg (zg) wrote,
zg
zg

Category:
поучительная история про то, как производители экономят на квалифицированной рабочей силе, а страдает от этого конечный потребитель.
diclaimer: некоторые технические моменты в истории сознательно упрощены.

1. проблема.

в симбиан апи есть такой вызов:
static void User::Panic(const TDesC& aCategory,TInt aReason);
он завершает вызвавшее его приложение и показывает табличку, которая состоит из трёх строк.
первая строка всегда: app. closed.
вторая содержит имя нити, вызвавшей ошибку. у главной нити любого приложения имя: main.
третья строка обычно пустая. но можно включить показ параметров aCategory и aReason, создав файл c:\system\bootdata\ErrRd. подробнее - тут.

оригинальная n-gage с версией прошивки 4.03, если на неё поставить очень много пиратских игр, любит показывать такую табличку почти при каждой загрузке. в сети существует куча шаманских рецептов, которые не работают. основная посылка — криво сломанные игры.
табличка с включенным показом параметров выглядит так:
app. closed
main
ss audio server 4


2. поиск решения.

найти место в прошивке, где выполняется код:
User::Panic(_L("SS Audio Server"),4);
достаточно легко. такое место в прошивке всего одно и выполняется оно при ошибке инициализации аудио сервера.
а вот дальше — всё сложнее. сама процедура инициализации — очень большая, её отладка — недоступна, остаётся лишь анализ кода, которого очень много.
первым результатом такого анализа была идея написать автостартующую программу, которая бы при старте телефона делала dismount карте памяти. какая связь между картой памяти и падением аудио сервера? а очень простая: аудио сервер никогда не падает при отсутствии карты памяти.
такая программа была написана и она даже работала по следующим причинам:
автостартующие программы запускаются гораздо раньше аудио сервера.
в самом конце загрузки, последней запускается программа UnlockMMC.app, которая делает mount карте памяти.

но программа хоть решала одну большую проблему, создавала куда более меньшую, но всё же — проблему. все остальные автостартующие программы, находящиеся на карте не стартовали.

3. немного про client-server.

технология известная и широко применяется в symbian достаточно широко. в реализации большинства клиентов при неудачном соединении с сервером с ошибками KErrNotFound и KErrServerTerminated происходит попытка запуска сервера с ожиданием.

4. про adsp сервер и про аудио сервер.

в n-gage в отличии от других смартфонов 60 серии, существуют два дополнительных сервиса: adsp и аудио. первый служит для непосредственного управления дополнительным dsp, встроенным в n-gage. второй — высокоуровневая надстройка над первым. в реализации клиентов к обоим сервисам присутствует код запуска «своих» серверов, но он нигде не используется.
оба этих сервиса запускаются специальной программой starter, которая в том числе при старте запускает различные приложения исходя из своего списка.
итак, как это происходит:
▪ запускается adsp сервер.
▪ запускается приложение «телефон». оно к нашей истории никакого отношения не имеет.
▪ запускается аудио сервер. аудио сервер пытается совершить соединение к adsp серверу и если оно происходит неудачно — падает.

внимательный читатель, дочитав до этого места, скажет:
— #$%#$#%^@$%^@@%$#$! — и будет совершенно прав, ибо в наш век вытесняющей многозадачности только полные кретины могут надеятся на гарантированную очерёдность выполнения несинхронизированных действий в различых потоках.

5. решение.

к большому счастью функция синхронного запуска adsp сервера экспортируется клиентской билиотекой, поэтому может быть легко вызвана автостартующей програмой. так как starter сначала дожидается инициализации всех автостартующих программ, а уже потом переходит к своему списку, то вышеописанной проблемы 100% не возникает.
реализацию можно взять тут. реализация не имеет никаких побочных эффектов.

6. причем же тут пиратские игры.

а при том. существует специальный сервер, который мониторит содержимое папок \system\apps на всех дисках. и по всей видимости этот самый мониторинг при большом объеме приложений приводит к тому, что к моменту запуска аудио сервера adsp сервер не успевает проинициализироваться.

7. прошивка 3.30

вышеописанная ошибка есть и в данной версии прошивки, однако падение аудио сервера не мешает дальнейшей работе телефона.
Tags: fixss, ngage
Subscribe

  • (no subject)

    прошло ещё пять лет. телефон всё ещё работает и является единственным используемым телефоном.

  • (no subject)

    история гаговской сцены. краткий персказ: сначала была группа близпда, потом появился некто бослей, организовал группу энгаге, наломали кучу игр, в…

  • (no subject)

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments