Чтение онлайн

на главную

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

if (sts != _RESMGR_DEFAULT) return sts;

// разбор динамически создаваемого кода devctl,

// извлечение из него длины принятого блока

unsigned int nbytes = (msg->i.dcmd - DCMD_SRR) >> 16;

msg->o.nbytes = nbytes;

// и тут же ретрансляция блока назад

return _RESMGR_PTR(ctp, &msg->i, sizeof(msg->i) + nbytes);

}

//---------------------------------------------------------

//
установка однопоточного менеджера, выполняемая

// в отдельном потоке

static void* install(void* data) {

dispatch_t *dpp;

if ((dpp = dispatch_create) == NULL)

exit("dispatch allocate");

resmgr_attr_t resmgr_attr;

memset(&resmgr_attr, 0, sizeof(resmgr_attr));

resmgr_attr.nparts_max = 1;

resmgr_attr.msg_max_size = 2048;

static resmgr_connect_funcs_t connect_funcs;

static resmgr_io_funcs_t io_funcs;

iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

_RESMGR_IO_NFUNCS, &io_funcs);

// определяем обработку, отличную от обработки по умолчанию,

// только для двух команд: read & devctl

io_funcs.read = &readfunc;

io_funcs.devctl = &devctlfunc;

static iofunc_attr_t attr;

iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

// связываем менеджер с его префиксным именем

if (resmgr_attach(dpp, &resmgr_attr, DEVNAME,

_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr) == -1)

exit("prefix attach");

dispatch_context_t* ctp = dispatch_context_alloc(dpp);

while (true) {

if ((ctp = dispatch_block(ctp)) == NULL)

exit("block error");

dispatch_handler(ctp);

}

}

// размер буфера для обмена сообщениями,

// этого нам хватит с большим запасом и надолго ;)

const int blk = 100000;

// обработчик низкоуровневых сообщений,

// также работающий в отдельном потоке

void* msginout(void* с) {

static uint8_t bufin[blk];

struct _msg_info info;

while (true) {

int rcvid = MsgReceive(data chid, &bufin, blk, &info);

if (rcvid < 0) exit("message receive");

if (MsgReply(rcvid, EOK, &bufin, info.msglen) < 0)

exit("message reply");

}

}

//--------------------------------------------------------

// "пустой" обработчик реакции на ^C (сигнал SIGINT)

inline static void empty(int signo) {}

//--------------------------------------------------------

// главная программа, которая все это "хозяйство" установит

// и будет безропотно ждать завершения по ^C ;)

int main(int argc, char *argv[]) {

cout << "SRR server: " << VERSION << endl;

// открывается менеджер ресурса ...

int fd = open(DEVNAME, O_RDONLY);

// если менеджер открылся, то это нам не нужно -

// дубликаты не создавать!

if (fd > 0)

close(fd), cout << "already in use " << DEVNAME << endl, exit(EXIT_FAILURE);

// перехватываем реакцию ^C:

cout << ". . . . . . waiting ^C. . . . . ." << flush;

signal(SIGINT, empty);

// создается канал для обмена низкоуровневыми сообщениями

data.chid = ChannelCreate(0);

// и запускается отдельным потоком ретранслятор с этого канала

if (pthread_create(NULL, NULL, msginout, NULL) != EOK)

exit("message thread");

// запускается менеджер ресурса

if (pthread_create(NULL, NULL, install, NULL) != EOK)

exit("manager thread");

// ... все! Мы свое дело сделали и ожидаем ^C ...

pause;

cout << "\rFinalization... " << endl;

Поделиться:
Популярные книги

Темный Патриарх Светлого Рода 2

Лисицин Евгений
2. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 2

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Подпольная империя

Ромов Дмитрий
4. Цеховик
Фантастика:
попаданцы
альтернативная история
6.60
рейтинг книги
Подпольная империя

Сиротка 4

Первухин Андрей Евгеньевич
4. Сиротка
Фантастика:
фэнтези
попаданцы
6.00
рейтинг книги
Сиротка 4

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Назад в СССР: 1984

Гаусс Максим
1. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Назад в СССР: 1984

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Вечная Война. Книга V

Винокуров Юрий
5. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
7.29
рейтинг книги
Вечная Война. Книга V