Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1074 → Rev 38

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