#define THREAD_POOL_PARAM_T dispatch_context_t #include

// следующее переопределение принципиально важно.

// оно предписывает вместо стандартного блока OCB (open control block),

// создаваемого вызовом клиента open() и соответствующего его файловому

// дескриптору, использовать собственную структуру данных.

// Эта структура должна быть производной от стандартной

// iofunc_ocb_t, а определение должно предшествовать

// включению

#define IOFUNC_OCB_T struct ownocb

#include

class ownocb public iofunc_ocb_t {

 static const int BUFSIZE = 1024;

public:

 char *buf;

 ownocb(void) { buf = new char[BUFSIZE]; }

 ~ownocb(void) { delete buf; }

};

IOFUNC_OCB_T *ownocb_calloc(resmgr_context_t *ctp, IOFUNC_ATTR_T *device) {

 return new ownocb;

}

void ownocb_free(IOFUNC_OCB_T *o) { delete o; }

iofunc_funcs_t ownocb_funcs = {

 _IOFUNC_NFUNCS, ownocb_calloc, ownocb_free

};

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

// Вместо умалчиваемой операции iofunc_lock_ocb_default(),

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

// и блокирующей атрибутную запись, мы предписываем вызывать

// "пустую" операцию и не блокировать атрибутную запись,

// чем обеспечиваем параллелизм.

static int nolock(resmgr_context_t *ctp, void *v, IOFUNC_OCB_T *ocb) {

 return EOK;

}

// обработчик запроса чтения

static int line_read(resmgr_context_t *ctp, io_read_t *msg,

 IOFUNC_OCB_T *ocb) {

 if (strlen(ocb->buf) != 0) {

  MsgReply(ctp->rcvid, strlen(ocb->buf) + 1, ocb->buf, strlen(ocb->buf) + 1);

  strcpy(ocb->buf, "");

 } else MsgReply(ctp->rcvid, EOK, NULL, 0);

 return _RESMGR_NOREPLY;

}

// обработчик запроса записи

static int line_write(resmgr_context_t *ctp, io_write_t *msg,

 IOFUNC_OCB_T *ocb) {

 resmgr_msgread(ctp, ocb->buf, msg->i.nbytes, sizeof(msg->i));

 _IO_SET_WRITE_NBYTES(ctp, msg->i.nbytes);

 return EOK;

}

// имя, под которым регистрируется менеджер:

const char sResName[_POSIX_PATH_MAX + 1] = "/dev/wmng";

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

static void StartResMng(void) {

 dispatch_t* dpp;

 if ((dpp = dispatch_create()) == NULL)

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

 resmgr_attr_t resmgr_attr;

 memset(&resmgr_attr, 0, sizeof resmgr_attr);

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = 2048;

 // статичность 3-х последующих описаний принципиально важна!

 // (также они могут быть сделаны глобальными переменными файла):

 static resmgr_connect_funcs_t connect_funcs;

 static resmgr_io_funcs_t io_funcs;

 static iofunc_attr_t attr;

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

  _RESMGR_IO_NFUNCS, &io_funcs);

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

Все книги серии High tech

Нет соединения с сервером, попробуйте зайти чуть позже