Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.241.82] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Ученые недоумевают: каким образом программы типа 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()? Влияет ли эта функция на кэширование или просто предотвращает удаление? Следствие зашло в тупик... |
Сообщ.
#2
,
|
|
|
Приличные приложения вызывают DmDatabaseProtect, когда обрабатывают нотификации и/или алармы. Думается мне, что Palm использует этот факт для управления кешированием. В принципе логично.
|
Сообщ.
#3
,
|
|
|
Теперь вроде бы понятно. В 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. |
Сообщ.
#4
,
|
|
|
Я плакалъ. Можно переведу на русский?
Цитата 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 писались до этих нововведений. По этой причине эти программы просто лочили ресурсы у программ. И все. Никакой магии. На форумах треоцентрала и майтрео можно найти упоминание многих программ, которые подписывались на процедурные нотификации без лока ресурсов. |
Сообщ.
#5
,
|
|
|
Цитата "Беня срочно дописывает в 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 кэше ) никаких ключевых слов по таким программам не сохранилось? Я кстати тоже склоняюсь к таком варианту. |
Сообщ.
#6
,
|
|
|
поищи по resco locker на треоцентрале. где-то это пересекалось с тредом по palminternals, где проверяли нужно ли лочить программы, перехватывающие hede.
|
Сообщ.
#7
,
|
|
|
Спасибо, поищем!
|
Сообщ.
#8
,
|
|
|
Цитата И все-таки на один вопрос эти уродцы так и не ответили: какая правильная последовательность лока ресурсов? 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) А ты говоришь проститутки и гомосексуалисты. Нормальные девчата и парни. натуралы! |
Сообщ.
#9
,
|
|
|
Т.е. вот такая последовательность гарантированно будет держать запись в кэше?
А что из этого нужно, если я хочу подписаться на нотификацию, и соответственно не хочу, чтобы мою базу (или хотя бы ресурсы кода) выбрасывали из кэша? DmDatabaseProtect? |
Сообщ.
#10
,
|
|
|
Цитата urain @ Джулия говорит, что так пойдет: Lock: DmOpenDatabase(), DmGetResource(), MemHandleLock(), DmRelease(), DmDatabaseProtect(true), DmCloseDatabase(), Unlock: MemHandleUnlock(), DmDatabaseProtect(false) А ты говоришь проститутки и гомосексуалисты. Нормальные девчата и парни. натуралы! я же говорю, гомосексуалисты. пользы от ответа неведомой Джулии - ноль (с учетом того, что я неправильно разместил протект после клоуза - 0.1). беглый взгляд на последовательности показывает, что ключевой вопрос - нужно ли делать release оба раза или только во второй при анлоке. Duo, те последовательности, что я написал, работают. Причем у достаточно большого числа человек. ключевые моменты - лок ресурса code#1 и протект базы. |
Сообщ.
#11
,
|
|
|
долой негатифф!! можно было спрашивать в октябре.
Как я понял, релиз надо делать только первый раз при локе, хотя это надо проверять. Не уверен что оставлю весь этот чит в новой версии. Интересно, что протект нужно ставить перед close, меня специально поправили. |
Сообщ.
#12
,
|
|
|
протект перед закрытием - это понятно. после если закрывать перед протектом, то в промежутке между ними может случиться что-нибудь, что выгрузит базу нафиг.
|
Сообщ.
#13
,
|
|
|
вот. результирующая статеечка, первая версия. http://wiki.palmoid.com/ow.asp?PalmRecordOperationSemantic
|
Сообщ.
#14
,
|
|
|
Цитата igor_n @ вот. результирующая статеечка, первая версия. http://wiki.palmoid.com/ow.asp?PalmRecordOperationSemantic О, спасибо, полезная статья. Ты бы еще разобрался, как кэш очистить. DBCache Tool у меня кстати тоже не работает, ни синхронизацией, ни базой. |
Сообщ.
#15
,
|
|
|
Сам видел, попытки его очистить только усугубляют состояние кэша. А DBCacheTool у меня регулярно гробил базу злончера, и я решил обойтись без него.
|