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