Hello,
Post it here. Don’t email it to me. I won’t look at emailed code,
but if you post it here for comment, I’ll try and take a look at
it.
Ok. I’ll try to post my code. This is resource manager’s code:
int io_read(resmgr_context_t *ctp, io_read_t *msg, RESMGR_OCB_T *ocb);
int io_message(message_context_t *ctp, int code, unsigned flags, void
*handle);
static resmgr_connect_funcs_t connect_funcs;
static resmgr_io_funcs_t io_funcs;
static iofunc_attr_t attr;
static char *resursu_buferis;
int main(int argc, char *argv)
{
/ kintamieji kuriuos naudosim */
dispatch_t *dpp;
dispatch_context_t *ctp;
resmgr_attr_t resmgr_attr;
int id, bufdydis, thread_id_driver, coid;
pthread_attr_t driver_attr;
struct sched_param driver_sched, all_sched;
pthread_t dthread;
message_attr_t *msg_attr;
bufdydis = 2048;
resursu_buferis = malloc(bufdydis);
/* sukuriam dispatch interfeisa*/
if((dpp = dispatch_create()) == NULL)
{
printf(“Nepavyko sukurti dispatch interfeiso\n”);
return(EXIT_FAILURE);
}
/* isvalom ir uzpildom resursu menedzerio atributu struktura */
memset(&resmgr_attr, 0, sizeof(resmgr_attr));
resmgr_attr.nparts_max = 1;
resmgr_attr.msg_max_size = 2048;
/* inicializuojam tam tikru zinuciu handlinimo funkcijas */
iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,
_RESMGR_IO_NFUNCS, &io_funcs);
connect_funcs.open = iofunc_open_default;// ar reikia?
io_funcs.read = io_read;
/* inicializuojam musu device’o atributus */
iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
attr.nbytes = bufdydis;
/* prijungiam musu resursu menedzeri su savo vardu*/
id = resmgr_attach(dpp, &resmgr_attr, “/dev/dario”, _FTYPE_ANY, 0,
&connect_funcs, &io_funcs, &attr);
if(id == -1)
{
printf(“Negalima prijungti resursu menedzerio\n”);
return EXIT_FAILURE;
}
/* aptarnausim savo zinutes /
/ nuo 0x5000 iki 0x5010 */
if(message_attach(dpp, NULL, _IO_MAX+1500, _IO_MAX+2000, &io_message,
NULL) == -1)
{
fprintf(stderr, “Nepavyko priatachinti asmeniniu zinuciu\n”);
return(EXIT_FAILURE);
}
/* inicializuojam dispatch konteksta */
ctp = dispatch_context_alloc(dpp);
/* paleidziam resursu menedzerio amzina cikla */
while(1)
{
if((ctp = dispatch_block(ctp)) == NULL)
{
fprintf(stderr, “bloko klaida\n”);
return EXIT_FAILURE;
}
dispatch_handler(ctp);
}
free(resursu_buferis);
return 0; //sitas niekad nebus vykdomas
}
int io_message(message_context_t *ctp, int code, unsigned flags, void
*handle)
{
printf(“Gavau privacia zinute !!! \n”);
// MsgReply(ctp->rcvid, 1, NULL, 0);
return(0);
}
I deleted io_read code becouse it works fine. The problem is with
private messages. And here is my client code:
int main(int argc, char **argv)
{
int fileid, nuskaityta, chid, coid;
char *buferis;
struct pmy_msg mymsg;
buferis = malloc(100);
fileid = open("/dev/dario", O_RDWR);
if (fileid != -1)
{
nuskaityta = read(fileid, buferis, 100);
printf("%s %d \n", buferis, nuskaityta);
close(fileid);
}
else
{
printf(“Negalejau atidaryti menedzerio, klaida %d\n”, errno);
}
mymsg.type = _IO_MAX+1600;
mymsg.action = MSG_PULSAS;
MsgSend(fileid, &mymsg, sizeof(mymsg), NULL, 0);
printf(“debug \n”);
return(EXIT_SUCCESS);
}
And at last common header for both files:
struct pmy_msg
{
_Uint16t type;
int action;
struct sigevent eventas;
};
So that’s the code. I will be thankfull if you look at it.
Best regards,
Darius