int (*unblock)(ctp, io_pulse_t *msg, handle,
void *reserved);
int (*mount) (ctp, io_mount_t *msg, handle,
io_mount_extra_t *extra);
} resmgr_connect_funcs_t;
Заметьте, что я сократил прототипы, опустив тип первого параметра, resmgr_context_t*
), и третьего, handle (RESMGR_HANDLE_T
).
Полный прототип для, например, функции
int (*open)(resmgr_context_t *
RESMGR_HANDLE_T *
Первый элемент структуры (
в виде именованной константы _RESMGR_CONNECT_NFUNCS. Используйте эту константу при заполнении таблицы функций установления соединения вручную (хотя
Отметим, что формат у всех прототипов один и тот же. Первый параметр, resmgr_context_t
. Это внутренний контекстный блок, используемый библиотекой администратора ресурсов и который изменять не следует (за исключением одного поля, к обсуждению которого мы еще вернемся).
Второй параметр всегда указывает на сообщение. Поскольку функции в таблице предназначены для обработки различных типов сообщений, тип второго параметра в прототипе соответствует типу сообщения, которое данная функция должна обрабатывать.
Третий параметр — структура типа RESMGR_HANDLE_T
, называемая дескриптором (
И, наконец, последний параметр является «резервным», или «дополнительным», и используется для функций, которым необходимы какие-либо дополнительные данные. Мы продемонстрируем применение параметра
resmgr_io_funcs_t
Таблица функций ввода/вывода подобна таблице функций установления соединения. Вот она (взято из
):
typedef struct _resmgr_io_funcs {
unsigned nfuncs;
int (*read)(ctp, io_read_t *msg, ocb);
int (*write)(ctp, io_write_t *msg, ocb);
int (*close_ocb)(ctp, void *reserved, ocb);
int (*stat)(ctp, io_stat_t *msg, ocb);
int (*notify)(ctp, io_notify_t *msg, ocb);
int (*devctl)(ctp, io_devctl_t *msg, ocb);
int (*unblock)(ctp, io_pulse_t *msg, ocb);
int (*pathconf)(ctp, io_pathconf_t *msg, ocb);
int (*lseek)(ctp, io_lseek_t *msg, ocb);
int (*chmod)(ctp, io_chmod_t *msg, ocb);
int (*chown)(ctp, io_chown_t *msg, ocb);
int (*utime)(ctp, io_utime_t *msg, ocb);
int (*openfd)(ctp, io_openfd_t *msg, ocb);
int (*fdinfo)(ctp, io_fdinfo_t *msg, ocb);
int (*lock)(ctp, io_lock_t *msg, ocb);
int (*space)(ctp, io_space_t *msg, ocb);
int (*shutdown)(ctp, io_shutdown_t *msg, ocb);
int (*mmap)(ctp, io_mmap_t *msg, ocb);
int (*msg)(ctp, io_msg_t *msg, ocb);
int (*umount)(ctp, void *msg, ocb);
int (*dup)(ctp, io_dup_t *msg, ocb);
int (*close_dup)(ctp, io_close_t *msg, ocb);
int (*lock_ocb)(ctp, void *reserved, ocb);