Страниц: [1]
  Печать  
Автор Тема: devctlv: попытаемся создать документацию  (Прочитано 2461 раз)
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« : Июня 28, 2013, 10:30:53 am »

Здравствуйте, есть моменты, которые я немного не понимаю.

1) Передача данных, есть такой вызов

Код:
iovec vecs[2];
SETIOV(vecs[0], buf0, buf0_size);
SETIOV(vecs[1], buf1, buf1_size);
devctlv(fd, dcmd, /*snd_parts*/2, /*rcv_parts*/0, vecs, NULL, NULL);

Данные склеиваются в одно сообщение? В обработчике  devctl я получаю их с помощью (_DEVCTL_DATA(msg->i));
Как определяются размеры?


2) Прием данных частями, тут надо вернуть
Код:
_RESMGR_NPARTS(2)

и предварительно сделать
Код:
SETIOV(ctp->iov, ?, size);SETIOV(ctp->iov + 1, ?, size);
Как я предварительно выделенные буферы, которые передаю для возврата данных получить в обработчике.

Ну третий вопрос это совокупность первых двух, думаю, я все пойму, когда получу ответы на первые два.




Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #1 : Июля 04, 2013, 05:05:05 pm »

Итак.

1) Данные склеиваются, размеры можно определить или с помощью msg->i.nbytes (это суммарный размер), если известен размер одной части, либо передавая размер в неком заголовке.

2) Для того, чтобы корректно вернулись данные, мы ОБЯЗАНЫ вернуть первым элементом msg->o.
Причем сначала желательно занулить ну и установить правильный nbytes что ли. (Допустим данных на вход не передавалось никаких, передаем два сгенерированных внутри ресменеджера буфера)

Код:
io_devctl(resmgr_context_t *ctp, io_devctl_t *msg, iofunc_ocb_t *ocb){

  //Стандартные проверки, дефолтная функция

  const char* buf1 = "First buffer";
  int buf1size = strlen(buf1) + 1;
  const char* buf2 = "Second buffer";
  int buf2size = strlen(buf2) + 1;
  memset(&msg->o, 0, sizeof(msg->o));
  //Заполняем nbytes как общий размер возвращаемых данных
  msg->o.nbytes = buf1size + buf2size + sizeof(msg->o);
  SETIOV(ctp->iov + 0, &msg->o, sizeof(msg->o));
  SETIOV(ctp->iov + 1, buf1, buf1size);
  SETIOV(ctp->iov + 2, buf1, buf2size);
  return _RESMGR_NPARTS(3);
  //Нужно еще не забыть при инициализации структуры resmgr_attr_t ее поле nparts_max установить в 3 или более, иначе мне кажется можем повредить память
}

//Клиентская часть (нам уже не нужно 3 iov)
{
  #define BUF_MAX 50
  iovec rvecs[2];
  char buf1[BUF_MAX];
  char buf2[BUF_MAX];
  SETIOV(rvecs + 0, buf1, sizeof(buf1));
  SETIOV(rvecs + 1, buf2, sizeof(buf2));
  devctlv(fd, DCMD_GET_DATA, 0, 2, NULL, rvecs, NULL);
  printf("%s %s\n", buf1, buf2);
}

Как-то так
Записан
Страниц: [1]
  Печать  
 
Перейти в: