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

    http://palmos.combee.net/blog/TheNVFSFilesDmSyncDatabas.html
    http://palmos.combee.net/blog/TheNVFSFilesHowSyncsCanFa.html
      настоящая история создания NVFS

      Цитата

      It wasn't so much that the engineers didn't understand Palm OS; they were originally trying to get NVFS into the system while modifying as little code as possible, and originally it looked like hooking into Data Manager would be less intrusive. Remember, this wasn't done as a new release of Palm OS 5, but instead as a licensee project for palmOne. By the time we discovered that this was going to be complicated and problematic, the Treo 650 and T5 were close to ship, and the follow on versions were mainly to get that code stabilized and debugged.

      -- Ben Combee, Senior Software Engineer, palmOne, Inc.
        Как вам фокус? ;)

        1) Запускаем "Tasks", создаем записи!

        2) выполняем код

        ExpandedWrap disabled
          db_id = DmFindDatabase(0, "ToDoDB");
          // получаем db_id == xxxxx !!!
           
          err = DmDeleteDatabase(0, db_id);
          // получаем err == errNone !!!
           
          db_id = DmFindDatabase(0, "ToDoDB");
          // получаем db_id == 0 !!!

        Вроде все правильно, не такли :)

        3) Запускаем "Tasks" иииии....
        Все записи на месте!!!!!

        4) Пробаем запустить код, и получаем...
        ExpandedWrap disabled
          db_id = DmFindDatabase(0, "ToDoDB");
          // получаем db_id == 0 !!!

        Reset. и все на месте :)

        З.Ы.
        Интерестно получается, база удалена, из другого приложения уже не достать, а "Tasks" читает ее без проблем, да и еще, эта база востанавливается при ресете.

        +++.
        Обойти это можно только удалением самих записей.

        З.Ы.З.Ы
        ни каких дополнительных программ на пальме не стоит, голый Трео 650 или Тунгстен Т5 Е2
        Сообщение отредактировано: Osmiy -
          На пальмвановских машинках, начиная с TT3 (TE и проч) вместо штатных PIM программ (Datebook, Todo, Address, Memopad) стоят версии программ от P1. Они работают со своими базами, но пытаются создавать копии данных в стандартных базах.
            Пример правильного NVFS-aware кода. Возможно есть способ проще, но так вернее.

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

            Цитата

            // взять старое значение
            hRec = DmQueryRecord(dbP, i);
            pRec = MemHandleLock(hRec);
            // создать копию в памяти
            // скопировать в память старые поля фиксированной длины
            // ...
            // освободить, чтобы отработал ресайз
            MemHandleUnlock(hRec);
            // поресайзить
            hRec = DmResizeRecord(dbP, i, newSize);
            if (hRec == NULL){ // или DmGetLastError
            // ...
            // обработать и выйти. поскольку запись была взята по Query освобождать ничего не нужно
            }
            // пользовать здесь hRec не стоит, поскольку запись не была Getнута.
            // вот только здесь делаем Get
            hRec = DmGetRecord(dbP, i);
            // модифицируем запись
            pNewRec = MemHandleLock(hRec);
            DmWrite(pNewRec, 0, pMemRec, newSize);
            MemHandleUnlock(hRec);
            DmReleaseRecord(dbP, i, true);



            Почему так сложно? Потому что непонятно, насколько правильно NVFS отрабатывает DmResizeRecord для getнутой записи. Также непонятно, что делать, если Resize из-под getа обломился.

            Почему-то у меня работало с единственным Query и модификацией записи по хендлу в кэше без DmGetRecord (и естественно без DmReleaseRecord).

            Есть ли рациональные доводы за единственный Get в начале?
              берем базу с 3 записями определенного размера (первая запись - менее 512 байт, вторая и третья - у меня 29882 байт и 28810 байт).
              берем приведенный ниже код. запускаем первый раз - нормально. запускаем 2-ой раз - на e2 и lifedrive вылетает (на t5 и машинках без nvfs всё ok).

              ExpandedWrap disabled
                #  include <PalmOS.h>
                 
                UInt32 PilotMain (UInt16 cmd, void *cmdBPB, UInt16 launchFlags)
                {
                  if (cmd == sysAppLaunchCmdNormalLaunch)
                    {
                      UInt32 buf = 0;
                      MemHandle h2, h3;
                      MemPtr p2, p3;
                      LocalID id;
                      DmOpenRef db;
                 
                      id = DmFindDatabase (0, "bug");
                      if (id==0)
                          return (0);
                 
                      db = DmOpenDatabase (0, id, dmModeReadWrite);
                      h2 = DmGetRecord (db, 1);
                      h3 = DmGetRecord (db, 2);
                      p2 = MemHandleLock (h2);
                      p3 = MemHandleLock (h3);
                 
                      DmWrite (p2, 0, &buf, 4);
                      DmWrite (p3, 0, &buf, 4);
                 
                      MemHandleUnlock (h2);
                      MemHandleUnlock (h3);
                 
                      DmReleaseRecord (db, 1, true);
                      DmReleaseRecord (db, 2, true);
                 
                      DmCloseDatabase (db);
                    }
                 
                return (0);
                }


              собранные prc и pdb приложены
              Прикреплённый файлПрикреплённый файлbug.zip (2.44 Кбайт, скачиваний: 254)
                а на какой строчке вылетает?
                  кажется DmCloseDatabase. это в принципе неважно - таблица находится в неправильном состоянии уже после первого запуска программы. второй запуск просто это показывает.
                  кстати после перезагрузки таблица вообще пропадает из палма.

                  похоже это связано с введенной в последних версиях nvfs sub-allocation (или как у них там это называется) - кластер в 512 байт делится на более мелкие "подкластеры" для уменьшения потерь свобоного места
                    t650 (с последней офиц прошивкой) с третьего раза не может открыть базу. симулятор 650 пишет

                    vfsdbcache.c, Line:1992, FATAdjustFreeCounts() called on table that is not affected
                    vfsdbcache.c, Line:2374, corrupt freelist in FATUpdateTable()
                    vfsdbcache.c, Line:2393, free counts out-of-sync in FATUpdateTable()
                      в palm-dev-forum запостишь?
                        ага... только подпишусь сначала
                          проверил на симуляторе Tungsten X - всё нормально.
                          это значит, что в 5.4.9 исправили?
                            обнаружилась ещё одна проблема с nvfs.

                            есть e2 со старой версией программой (без dmsyncdatabase). человек неделю работал с ней, после сделал reset - в памяти оказались корректные данные, но только вот трехдневной давности. из программы не выходили, таблицы при работе н е закрываются.

                            в документации сказано:
                            Цитата
                            Backup is triggered on a limited set of events:
                            ..................................
                            Device sleep. Whenever the device goes to sleep as a result of the normal system sleep functionality, the Data Manager iterates through all open databases and backs them up to the non-volatile store. This takes care of those databases that are opened by an application and not closed until the application exits, and those databases that are opened by background threads that are running when the system goes to sleep.


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

                              такое же поведение можно наблюдать в обычном Memos. до выхода из редактирования записи она не сохранится на флешке.
                                Цитата edo @
                                проверил на симуляторе Tungsten X - всё нормально.
                                это значит, что в 5.4.9 исправили?

                                только что проверил на lifedrive с последним апдейтом - вылетает.
                                версия palmos - 5.4.8
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1341 ]   [ 18 queries used ]   [ Generated: 21.07.19, 09:19 GMT ]