Страниц: [1]
  Печать  
Автор Тема: Переназначаются (было - НЕ) iofunc_ocb_calloc() и iofunc_ocb_free().  (Прочитано 5413 раз)
PoP
Sr. Member
****
Offline Offline

Сообщений: 336


Просмотр профиля
« : Марта 20, 2013, 12:26:56 pm »

Собственно вот это:
Цитировать
--------------------------------------------------------------------------------
You should fill in the attribute's mount structure (i.e. the attr->mount pointer) instead of replacing this function.
If you specify iofunc_ocb_calloc() and iofunc_ocb_free() callouts in the attribute's mount structure, then you should use the callouts instead of calling the standard iofunc_ocb_calloc() and iofunc_ocb_free() functions.
--------------------------------------------------------------------------------
не срабатывает. По крайней мере в QNX 6.5 SP1. Вызываются стандартные библиотечные функции.
Простая подмена вполне работоспособна.
« Последнее редактирование: Марта 21, 2013, 09:53:13 am от PoP » Записан
oder
Гость
« Ответ #1 : Марта 20, 2013, 02:22:49 pm »

Это базовая технология. Через неё выделяются и освобождаются все OCB. Она не может не работать ибо тогда вообще ничего не работало бы.
Записан
PoP
Sr. Member
****
Offline Offline

Сообщений: 336


Просмотр профиля
« Ответ #2 : Марта 20, 2013, 03:11:42 pm »

Я не говорю, что ничего не выделяется и не освобождается. Но способом, описанным в "Extending the POSIX-Layer Data Structures" не удаётся выделить OCB большего размера чем iofunc_ocb_t. Несмотря на правильное заполнение ocb_funcs происходит вызов  iofunc_ocb_calloc()  и iofunc_ocb_free() из библиотеки (а не функций my_ocb_calloc()  и my_ocb_free(), адреса которых заданы в attr.mount при вызове resmgr_attach). Естественно, выделяется OCB стандартного размера.
Прямое перекрытие библиотечных iofunc_ocb_calloc()  и iofunc_ocb_free() своими успешно работает (ещё со времён 4-ки) но, судя по приведённой цитате из хелпа, так теперь делать нехорошо.
Возможно, чтобы всё работало как положено, необходимо заполнить поле mount не только в базовых атрибутах при монтировании, но и в атрибутах всех вложенных директорий и файлов ? Так не попробовал,  пришло в голову когда всё вернул назад и подменил функции.
Записан
oder
Гость
« Ответ #3 : Марта 20, 2013, 03:28:56 pm »

Вообще-то все аттрибуты должны ссылаться на тот же единственный mount. Если структура аттрибутов представляет файл, то маунт представляет носитель. А носитель для всех файлов на нем общий.
Записан
PoP
Sr. Member
****
Offline Offline

Сообщений: 336


Просмотр профиля
« Ответ #4 : Марта 20, 2013, 05:42:12 pm »

Если структура аттрибутов представляет файл, то маунт представляет носитель. А носитель для всех файлов на нем общий.
Примерно из этого я, по наивности, и исходил. Мне казалось, что если я при создании точки монтирования указал функции выделения/освобождения OCB то они автоматом распространятся выше. Оказалось - не так Embarrassed.
У меня не совсем диск. И всё вышло ещё веселей - OCB c "хвостами" можно создавать только для тех типов данных, где они реально нужны. В общем я был не прав. Всё работает. Только хелп не очень подробный.

P.S. Теперь слегка бесит только одно - чтобы всё собиралось без бубна
#include <sys/iofunc.h>
должно обязательно встречаться раньше чем
#include <sys/dispatch.h>
иначе - IOFUNC_OCB_T будет void.
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #5 : Марта 20, 2013, 05:46:12 pm »

А вы nfuncs выставили правильно (в attr->mount->funcs->nfuncs)?
Записан
PoP
Sr. Member
****
Offline Offline

Сообщений: 336


Просмотр профиля
« Ответ #6 : Марта 21, 2013, 09:52:00 am »

Правильно. И всё работает. Я был не прав. Просто я считал что функции унаследуются от точки монтирования, а нужно прописывать ссылку на свои функции в attr.mount каждого вложенного файла (если для работы с ним используются "хвосты" OCB).

P.S. Изменил название темы.
« Последнее редактирование: Марта 21, 2013, 09:54:26 am от PoP » Записан
Страниц: [1]
  Печать  
 
Перейти в: