На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование под PalmOS"
Правила раздела просты:
1. Будьте вежливыми.
2. Задавате вопросы только по теме. Пользовательские вопросы (у меня не работает пальм) являются оффтопиком. Пользуйтесь конференциями palmz.in, hpc.ru, ihand.ru .
3. Поиск вареза запрещен.
4. Пользуйтесь поиском. Не надейтесь, что кому-то доставляет удовольствие отвечать в сотый раз на один и тот же вопрос.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Управление DB Cache, По мотивам RescoLocker и SharkCache
    Ученые недоумевают: каким образом программы типа RescoLocker и SharkCache осуществляют управление кэшом на NVFS устройствах?

    Нужно это вот для чего. Предположим я подписалася на нотификацию нажатия на виртуальную кнопку. При этом мне начинают приходить нотификации при нажатии на любые кнопки. Некоторые пользователи сообщают о падении общей производительности всей системы. Я предполагаю что каждый раз при нажатии на любую кнопку (в том числе всякие псевдо кнопки) ось загружает программу в кэш, дает ей обрабатать нотификацию и удаляет ее из кэша. Отсюда очевидный выход: как вариант ускорения работы - опционально залочить программу в кэше.

    Документация как-то темнит. В последнем Developer Guide для palm sdk 5.1 есть что-то интересное, но моей джедайской проницательности не хватает получить полное представление:

    More aggressive DBCache flushing:
    Locked records are now unlocked automatically when a database is closed,
    including resource record. Closed databases and unlocked records are flushed
    more aggressively whenever more space is needed. Applications that are
    implementing callbacks or alarm procedures should be extremely careful and
    make sure that the code resource is locked at all times and protected with
    DMDatabaseProtect() when expected to run.


    Причем здесь DmDatabaseProtect()? Влияет ли эта функция на кэширование или просто предотвращает удаление?

    Следствие зашло в тупик...
    :)
      Приличные приложения вызывают DmDatabaseProtect, когда обрабатывают нотификации и/или алармы. Думается мне, что Palm использует этот факт для управления кешированием. В принципе логично.
        Теперь вроде бы понятно. В KB на палм соурс четко написано: залоченные записи от закрытых баз удаляются из кэша если они не защищены (protected). Таким образом, если они защищены они не удаляются!

        I'm just exorcized the deamons. This house is clean now :) © Ventura

        Цитируем статейку:

        Although it is considered poor programming practice, some applications took advantage of the fact that locked database records could still be read from the storage heap after a database was closed. In Palm OS Garnet, however, unless the database is protected, when more space is needed in the DBCache the Data Manager automatically unloads from the DBCache records of any closed and unprotected databases. Thus, after a database is closed its records are no longer guaranteed to reside at the memory locations returned by the record lock calls.
          Я плакалъ. Можно переведу на русский?

          Цитата

          NVFS on Palm OS v. 5.4.9 and later provides the following enhancements:
          ■ Alerts for extreme low memory condition
          The system warns users more aggressively when the device storage heap is low
          on space. Please note that if the storage heap is already full and there is still data
          to be flushed, the data will be lost.

          "Мы заставили этого кретина-явского-программиста выдавать алерт везде, где он забыл проверять на переполнение кэша.".
          Цитата

          ■ Minimization of memory fragmentation
          The occurrence of memErrNotEnoughSpace should be significantly minimized as the
          result of better compaction of DBCache. This optimization in turn makes it easier
          for an application to exhaust the available memory. Applications should still check
          for available memory and chunk size whenever possible.

          "кретин-явский-программист с удивлением узнал, что в кэше нет гэрбэдж коллектора. пришлось написать."
          Цитата

          ■ Slower sorting
          Optimizations that are done in OS 5.4.9 have caused the sorting performance to
          be slower as a trade-off, but this should only be visible when a huge number of
          records are involved.

          "Зато теперь мы сломали сортировку. dolater увидит - надает по шее тому, кто это сделал"
          Цитата

          ■ DmQueryRecord is safe to use again
          The system should now be able to recover invalid handle and read the record data
          back from the non-volatile memory.

          "А иногда мы запись и с первого раза не считывали"
          Цитата

          ■ More aggressive DBCache flushing
          Locked records are now unlocked automatically when a database is closed,
          including resource record. Closed databases and unlocked records are flushed
          more aggressively whenever more space is needed. Applications that are
          implementing callbacks or alarm procedures should be extremely careful and
          make sure that the code resource is locked at all times and protected with
          DMDatabaseProtect() when expected to run.

          "все равно программисты не протектят базы. когда обнаружат, что это не работает, мы успеем склепать 5.4.10"
          Цитата

          ■ Bug fix for FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion), which
          now returns the correct OS version and build number.

          "зато теперь мы испортили sysFtrNumProcessorID, sysFtrNumVendor и sysFtrNumOEMHALID. так смешнее!"
          Цитата

          NOTE For information on how to lock code resource and protect a database, please
          consult the PalmSource Developer Knowledge Base.

          "Беня срочно дописывает в kb наши последние изменения и сдвигает дату статьи назад."

          Проститутки и гомосексуалисты. Интересно сколько приложений отвалится с выходом 5.4.9? В принципе логичная фича, похоже их достало бороться с залоченными записями. Но делать это спустя год после выхода в свет NVFS?

          И все-таки на один вопрос эти уродцы так и не ответили: какая правильная последовательность лока ресурсов? open get lock release close protect open get unlock release close unprotect или open get lock close protect open get unlock release close unprotect? в яхме сделана первая схема. в русхаке вторая.

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

          Добавлено
          Да, resco locker и shark cache писались до этих нововведений. По этой причине эти программы просто лочили ресурсы у программ. И все. Никакой магии.

          На форумах треоцентрала и майтрео можно найти упоминание многих программ, которые подписывались на процедурные нотификации без лока ресурсов.
            Цитата
            "Беня срочно дописывает в kb наши последние изменения и сдвигает дату статьи назад."

            :) Бен, это Эд Коллиган. Ай нид хелп.

            Цитата
            И все-таки на один вопрос эти уродцы так и не ответили: какая правильная последовательность лока ресурсов? open get lock release close protect open get unlock release close unprotect или open get lock close protect open get unlock release close unprotect? в яхме сделана первая схема. в русхаке вторая.

            Как все сложно. Спросим Джулию, однако. Не зря ведь ее там посадили, небось страдает бедная от недостатка вопросов.

            Цитата

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

            Выходит что так.

            Цитата
            На форумах треоцентрала и майтрео можно найти упоминание многих программ, которые подписывались на процедурные нотификации без лока ресурсов.

            Попробую поискать, спасибо. Хотя там как-то не просто все ищется. У тебя в памяти (в db кэше :)) никаких ключевых слов по таким программам не сохранилось? :)
            Я кстати тоже склоняюсь к таком варианту.
              поищи по resco locker на треоцентрале. где-то это пересекалось с тредом по palminternals, где проверяли нужно ли лочить программы, перехватывающие hede.
                Спасибо, поищем!
                  Цитата
                  И все-таки на один вопрос эти уродцы так и не ответили: какая правильная последовательность лока ресурсов? open get lock release close protect open get unlock release close unprotect или open get lock close protect open get unlock release close unprotect? в яхме сделана первая схема. в русхаке вторая.

                  Джулия говорит, что так пойдет:
                  Lock: DmOpenDatabase(), DmGetResource(), MemHandleLock(), DmRelease(), DmDatabaseProtect(true), DmCloseDatabase(),
                  Unlock: MemHandleUnlock(), DmDatabaseProtect(false)
                  А ты говоришь проститутки и гомосексуалисты. Нормальные девчата и парни. натуралы! :)
                    Т.е. вот такая последовательность гарантированно будет держать запись в кэше?
                    А что из этого нужно, если я хочу подписаться на нотификацию, и соответственно не хочу, чтобы мою базу (или хотя бы ресурсы кода) выбрасывали из кэша? DmDatabaseProtect?
                      Цитата urain @
                      Джулия говорит, что так пойдет:
                      Lock: DmOpenDatabase(), DmGetResource(), MemHandleLock(), DmRelease(), DmDatabaseProtect(true), DmCloseDatabase(),
                      Unlock: MemHandleUnlock(), DmDatabaseProtect(false)
                      А ты говоришь проститутки и гомосексуалисты. Нормальные девчата и парни. натуралы! :)

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

                      Duo, те последовательности, что я написал, работают. Причем у достаточно большого числа человек. ключевые моменты - лок ресурса code#1 и протект базы.
                        долой негатифф!! можно было спрашивать в октябре.
                        Как я понял, релиз надо делать только первый раз при локе, хотя это надо проверять. Не уверен что оставлю весь этот чит в новой версии.
                        Интересно, что протект нужно ставить перед close, меня специально поправили.
                          протект перед закрытием - это понятно. после если закрывать перед протектом, то в промежутке между ними может случиться что-нибудь, что выгрузит базу нафиг.
                            вот. результирующая статеечка, первая версия. http://wiki.palmoid.com/ow.asp?PalmRecordOperationSemantic
                              Цитата igor_n @
                              вот. результирующая статеечка, первая версия. http://wiki.palmoid.com/ow.asp?PalmRecordOperationSemantic

                              О, спасибо, полезная статья.

                              Ты бы еще разобрался, как кэш очистить. DBCache Tool у меня кстати тоже не работает, ни синхронизацией, ни базой.
                                Сам видел, попытки его очистить только усугубляют состояние кэша. А DBCacheTool у меня регулярно гробил базу злончера, и я решил обойтись без него.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1075 ]   [ 17 queries used ]   [ Generated: 21.09.19, 17:42 GMT ]