18,11 → 18,11 |
|
/** |
------------ |
CVS : $Id: mqueue.c,v 1.4 2003-11-05 15:05:11 giacomo Exp $ |
CVS : $Id: mqueue.c,v 1.3 2003-01-07 17:07:49 pj Exp $ |
|
File: $File$ |
Revision: $Revision: 1.4 $ |
Last update: $Date: 2003-11-05 15:05:11 $ |
Revision: $Revision: 1.3 $ |
Last update: $Date: 2003-01-07 17:07:49 $ |
------------ |
|
POSIX message queues |
114,9 → 114,8 |
mode_t m; |
mqd_t mq; |
struct mq_attr *attr; |
SYS_FLAGS f; |
|
f = kern_fsave(); |
kern_cli(); |
|
for (i = 0; i < MQ_OPEN_MAX; i++) |
if (mq_table[i].flags & MQ_USED) { |
128,20 → 127,20 |
if (found) { |
if (oflag == (O_CREAT | O_EXCL)) { |
errno = EEXIST; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} else { |
kern_frestore(f); |
kern_sti(); |
return i; |
} |
} else { |
if (!(oflag & O_CREAT)) { |
errno = ENOENT; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} else if (!(oflag & O_RDWR)) { |
errno = EACCES; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} else { |
va_list l; |
156,7 → 155,7 |
mq_table[mq].name = kern_alloc(strlen((char *)name)+1); |
if (!mq_table[mq].name) { |
errno = ENOSPC; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
strcpy(mq_table[mq].name, (char *)name); |
188,7 → 187,7 |
kern_free(mq_table[mq].name,strlen((char *)name)+1); |
|
errno = ENOSPC; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
200,7 → 199,7 |
mq_table[mq].maxmsg * mq_table[mq].msgsize); |
|
errno = ENOSPC; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
211,12 → 210,12 |
mq_table[mq].mq_first = 0; |
|
free_mq = mq_table[mq].next; |
kern_frestore(f); |
kern_sti(); |
return mq; |
} |
else { |
errno = ENOSPC; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
} |
225,15 → 224,13 |
|
int mq_close(mqd_t mqdes) |
{ |
SYS_FLAGS f; |
kern_cli(); |
|
f = kern_fsave(); |
|
if (mqdes < 0 || |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
247,7 → 244,7 |
mq_table[mqdes].next = free_mq; |
free_mq = mqdes; |
|
kern_frestore(f); |
kern_sti(); |
return 0; |
} |
|
255,9 → 252,8 |
{ |
int i; |
int found = 0; |
SYS_FLAGS f; |
|
f = kern_fsave(); |
kern_cli(); |
|
for (i = 0; i < MQ_OPEN_MAX; i++) |
if (mq_table[i].flags & MQ_USED) { |
276,11 → 272,11 |
mq_table[i].flags = 0; |
mq_table[i].next = free_mq; |
free_mq = i; |
kern_frestore(f); |
kern_sti(); |
return 0; |
} else { |
errno = ENOENT; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
} |
398,11 → 394,10 |
unsigned int msg_prio) |
{ |
int newmsg; |
SYS_FLAGS f; |
|
task_testcancel(); |
|
f = kern_fsave(); |
kern_cli(); |
|
/* first, if it is the first time that mq_receive or mq_send is called, |
register the cancellation point */ |
416,19 → 411,19 |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
if (msg_len > mq_table[mqdes].msgsize) { |
errno = EMSGSIZE; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
if (msg_prio > MQ_PRIO_MAX) { |
errno = EINVAL; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
437,7 → 432,7 |
/* the message queue is full!!! */ |
if (mq_table[mqdes].flags & O_NONBLOCK) { |
errno = EAGAIN; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
else { |
470,7 → 465,7 |
|
if (mqproc_table[exec_shadow].intsig) { |
errno = EINTR; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
} |
550,7 → 545,7 |
} |
} |
|
kern_frestore(f); |
kern_sti(); |
return 0; |
} |
|
560,11 → 555,10 |
int msg; |
PID p; |
ssize_t returnvalue; |
SYS_FLAGS f; |
|
task_testcancel(); |
|
f = kern_fsave(); |
kern_cli(); |
|
/* first, if it is the first time that mq_receive or mq_send is called, |
register the cancellation point */ |
578,13 → 572,13 |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
if (msg_len > mq_table[mqdes].msgsize) { |
errno = EMSGSIZE; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
593,7 → 587,7 |
/* the message queue is empty!!! */ |
if (mq_table[mqdes].flags & O_NONBLOCK) { |
errno = EAGAIN; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
else { |
626,7 → 620,7 |
|
if (mqproc_table[exec_shadow].intsig) { |
errno = EINTR; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
} |
672,21 → 666,19 |
return returnvalue; |
} |
|
kern_frestore(f); |
kern_sti(); |
return returnvalue; |
} |
|
int mq_notify(mqd_t mqdes, const struct sigevent *notification) |
{ |
SYS_FLAGS f; |
kern_cli(); |
|
f = kern_fsave(); |
|
if (mqdes < 0 || |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
693,12 → 685,12 |
if (mq_table[mqdes].flags & MQ_NOTIFICATION_PRESENT) { |
if (!notification) { |
mq_table[mqdes].flags &= ~MQ_NOTIFICATION_PRESENT; |
kern_frestore(f); |
kern_sti(); |
return 0; |
} |
else { |
errno = EBUSY; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
} |
707,7 → 699,7 |
|
memcpy(&mq_table[mqdes].notification, notification,sizeof(struct sigevent)); |
|
kern_frestore(f); |
kern_sti(); |
return 0; |
} |
|
714,15 → 706,13 |
int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, |
struct mq_attr *omqstat) |
{ |
SYS_FLAGS f; |
kern_cli(); |
|
f = kern_fsave(); |
|
if (mqdes < 0 || |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
735,21 → 725,19 |
|
mq_table[mqdes].flags = (mq_table[mqdes].flags & ~O_NONBLOCK) | |
(mqstat->mq_flags & O_NONBLOCK); |
kern_frestore(f); |
kern_sti(); |
return 0; |
} |
|
int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat) |
{ |
SYS_FLAGS f; |
kern_cli(); |
|
f = kern_fsave(); |
|
if (mqdes < 0 || |
mqdes >= MQ_OPEN_MAX || |
!(mq_table[mqdes].flags & MQ_USED) ) { |
errno = EBADF; |
kern_frestore(f); |
kern_sti(); |
return -1; |
} |
|
758,6 → 746,6 |
mqstat->mq_msgsize = mq_table[mqdes].msgsize; |
mqstat->mq_curmsgs = mq_table[mqdes].count; |
|
kern_frestore(f); |
kern_sti(); |
return 0; |
} |