Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Страницы: (4) 1 [2] 3 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
пара статей от Бени про специфику NVFS
http://palmos.combee.net/blog/TheNVFSFilesDmSyncDatabas.html http://palmos.combee.net/blog/TheNVFSFilesHowSyncsCanFa.html |
Сообщ.
#17
,
|
|
|
настоящая история создания 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. |
Сообщ.
#18
,
|
|
|
Как вам фокус?
1) Запускаем "Tasks", создаем записи! 2) выполняем код 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) Пробаем запустить код, и получаем... db_id = DmFindDatabase(0, "ToDoDB"); // получаем db_id == 0 !!! Reset. и все на месте З.Ы. Интерестно получается, база удалена, из другого приложения уже не достать, а "Tasks" читает ее без проблем, да и еще, эта база востанавливается при ресете. +++. Обойти это можно только удалением самих записей. З.Ы.З.Ы ни каких дополнительных программ на пальме не стоит, голый Трео 650 или Тунгстен Т5 Е2 |
Сообщ.
#19
,
|
|
|
На пальмвановских машинках, начиная с TT3 (TE и проч) вместо штатных PIM программ (Datebook, Todo, Address, Memopad) стоят версии программ от P1. Они работают со своими базами, но пытаются создавать копии данных в стандартных базах.
|
Сообщ.
#20
,
|
|
|
Пример правильного 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 в начале? |
Сообщ.
#21
,
|
|
|
берем базу с 3 записями определенного размера (первая запись - менее 512 байт, вторая и третья - у меня 29882 байт и 28810 байт).
берем приведенный ниже код. запускаем первый раз - нормально. запускаем 2-ой раз - на e2 и lifedrive вылетает (на t5 и машинках без nvfs всё ok). # 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 Кбайт, скачиваний: 948) |
Сообщ.
#22
,
|
|
|
а на какой строчке вылетает?
|
Сообщ.
#23
,
|
|
|
кажется DmCloseDatabase. это в принципе неважно - таблица находится в неправильном состоянии уже после первого запуска программы. второй запуск просто это показывает.
кстати после перезагрузки таблица вообще пропадает из палма. похоже это связано с введенной в последних версиях nvfs sub-allocation (или как у них там это называется) - кластер в 512 байт делится на более мелкие "подкластеры" для уменьшения потерь свобоного места |
Сообщ.
#24
,
|
|
|
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() |
Сообщ.
#25
,
|
|
|
в palm-dev-forum запостишь?
|
Сообщ.
#26
,
|
|
|
ага... только подпишусь сначала
|
Сообщ.
#27
,
|
|
|
проверил на симуляторе Tungsten X - всё нормально.
это значит, что в 5.4.9 исправили? |
Сообщ.
#28
,
|
|
|
обнаружилась ещё одна проблема с 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? |
Сообщ.
#29
,
|
|
|
я думаю, что имеется ввиду "все грязные данные сбрасываются на флешку". скорее всего до DmReleaseRecord запись не считается грязной.
такое же поведение можно наблюдать в обычном Memos. до выхода из редактирования записи она не сохранится на флешке. |
Сообщ.
#30
,
|
|
|
Цитата edo @ проверил на симуляторе Tungsten X - всё нормально. это значит, что в 5.4.9 исправили? только что проверил на lifedrive с последним апдейтом - вылетает. версия palmos - 5.4.8 |