Читаем QNX/UNIX: Анатомия параллелизма полностью

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

 io_funcs.read = line_read;

 io_funcs.write = line_write;

 io_funcs.lock_ocb = nolock;

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

 // через это поле осуществляется связь с новой

 // структурой OCB.

 attr.mount = &mountpoint

 if (resmgr_attach(dpp, &resmgr_attr, sResName, _FTYPE_ANY, 0,

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

  perror("name attach"), exit(EXIT_FAILURE);

 // создание пула потоков (многопоточность)

 thread_pool_attr_t pool_attr;

 memset(&pool_attr, 0, sizeof pool_attr);

 pool_attr.handle = dpp;

 pool_attr.context_alloc = dispatch_context_alloc;

 pool_attr.block_func = dispatch_block;

 pool_attr.handler_func = dispatch_handler;

 pool_attr.context_free = dispatch_context_free;

 pool_attr.lo_water = 2;

 pool_attr.hi_water = 6;

 pool_attr.increment = 1;

 pool_attr.maximum = 50;

 thread_pool_t* tpp;

 if ((tpp = thread_pool_create(&pool_attr, POOL_FLAG_EXIT_SELF)) == NULL)

  perror("pool create"), exit(EXIT_FAILURE);

 thread_pool_start(tpp);

 // к этой точке return управление уже никогда не подойдет...

}

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

 // проверка, не загружен ли ранее экземпляр менеджера,

 // 2 экземпляра нам ни к чему...

 char sDirName[_POSIX_NAME_MAX + 1];

 int nDirLen = strrchr((const char*)sResName, '/') - (char*)sResName;

 strncpy(sDirName, sResName, nDirLen);

 sDirName[nDirLen] = '\0';

 DIR *dirp = opendir(sDirName);

 if (dirp == NULL)

  perror("directory not found"), exit(EXIT_FAILURE);

 struct dirent *direntp;

 while (true) {

  if ((direntp = readdir(dirp)) == NULL) break;

  if (strcmp(direntp->d_name, strrchr(sResName, '/') + 1) == 0)

   cout << "second copy of manager" << endl, exit(EXIT_FAILURE);

 }

 closedir(dirp);

 // старт менеджера

 StartResMng();

 // ... к этой точке мы уже никогда не подойдем...

 exit(EXIT_SUCCESS);

}

В отличие от типового и привычного шаблона многопоточного менеджера, мы проделали здесь дополнительно следующее:

• Определили собственную структуру OCB, новый экземпляр которой должен создаваться для каждого нового подключающегося клиента:

class ownocb : public iofunc_ocb_t { ... };

• Переопределили описание структуры OCB, используемое библиотеками менеджера ресурсов:

#define IOFUNC_OCB_T struct ownocb

• Заполняя атрибутную запись устройства:

attr.mount = &mountpoint

мы к точке монтирования «привязываем» функции создания и уничтожения вновь определенной структуры OCB (по умолчанию библиотека менеджера станет размещать только стандартный OCB):

iofunc_funcs_t ownocb_funcs = {

 _IOFUNC_NFUNCS, ownocb_calloc, ownocb_free

};

iofunc_mount_t mountpoint = { 0, 0, 0, 0, &ownocb_funcs };

( _IOFUNC_NFUNCS— это просто константа, определяющая число функций и равная 2.)

• Определяем собственные функции размещения и уничтожения структуры OCB с прототипами:

IOFUNC_OCB_T* ownocb_calloc(resmgr_context_t*, IOFUNC_ATTR_T*);

void ownocb_free(IOFUNC_OCB_T *o);

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных