Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 317 → Rev 318

/shark/trunk/kernel/mqueue.c
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;
}