2004-03-01 11:26:38

by bert hubert

[permalink] [raw]
Subject: posix message queues, was Re: 2.6.4-rc1-mm1

On Sun, Feb 29, 2004 at 02:06:17PM -0800, Andrew Morton wrote:

> - Added the POSIX message queue implementation. We're still stitching
> together a decent description of all of this. Reference information is at
> http://www.mat.uni.torun.pl/~wrona/posix_ipc/
> and
> http://www.opengroup.org/onlinepubs/007904975/basedefs/mqueue.h.html

I can confirm that basic functionality is there. Both blocking and
nonblocking operations work as advertised. Queue properly blocks when full
or empty.

mq_timedsend does not wait, it immediately returns ETIMEOUT with the queue
is full:

struct timespec ts;
ts.tv_sec=1;
ts.tv_nsec=0;
sprintf(msgptr,"%05d %s",c,stime);

if ( mq_timedsend(mqd,msgptr,msglen,msg_prio, &ts) )
{
perror("mq_send()");
break;
}

results in:

$ ./mqreceive /Q32x128
1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004
$ ./mqreceive /Q32x128
1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004
$ ./mqsend /Q32x128
$ ./mqsend /Q32x128
$ ./mqsend /Q32x128
mq_send(): Connection timed out <- immediately

Queue is in blocking mode.

I would very much advise Michal and Krzysztof to add some basic examples to
their page. I had to scour the internet to find some working code.

This is one of the few sites that allow you to test the posix message queue:
http://www.ac3.edu.au/SGI_Developer/books/T_IRIX_Prog/sgi_html/ch06.html

The examples there add /var/tmp/ to the queuenames, with linux, posix queues
need to have a name that starts with /.

Mounting the queuefs works but the fs, confusingly, is called mqueue and not
mqueuefs.

Otherwise sound work! PowerDNS really wants posix message queues, right now
we fuddle along with semaphores and locks.

Thanks,
Bert.

--
http://www.PowerDNS.com Open source, database driven DNS Software
http://lartc.org Linux Advanced Routing & Traffic Control HOWTO


2004-03-01 14:28:55

by Krzysztof Benedyczak

[permalink] [raw]
Subject: Re: posix message queues, was Re: 2.6.4-rc1-mm1

bert hubert wrote:

>On Sun, Feb 29, 2004 at 02:06:17PM -0800, Andrew Morton wrote:
>
>
>
>>- Added the POSIX message queue implementation. We're still stitching
>> together a decent description of all of this. Reference information is at
>> http://www.mat.uni.torun.pl/~wrona/posix_ipc/
>> and
>> http://www.opengroup.org/onlinepubs/007904975/basedefs/mqueue.h.html
>>
>>
>
>I can confirm that basic functionality is there. Both blocking and
>nonblocking operations work as advertised. Queue properly blocks when full
>or empty.
>
>mq_timedsend does not wait, it immediately returns ETIMEOUT with the queue
>is full:
>
> struct timespec ts;
> ts.tv_sec=1;
> ts.tv_nsec=0;
> sprintf(msgptr,"%05d %s",c,stime);
>
> if ( mq_timedsend(mqd,msgptr,msglen,msg_prio, &ts) )
> {
> perror("mq_send()");
> break;
> }
>
>results in:
>
>$ ./mqreceive /Q32x128
>1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004
>$ ./mqreceive /Q32x128
>1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004
>$ ./mqsend /Q32x128
>$ ./mqsend /Q32x128
>$ ./mqsend /Q32x128
>mq_send(): Connection timed out <- immediately
>
>
It _should_ return immediately. mq_timedsend timeout must be given as
absolute value, so if you want to have one second timeout from now,
you must do:

ts.tv_sec = time(NULL) + 1;
ts.tv_nsec = 0;

And I don't have idea why POSIX defines timeout as absolute not relative
;-).

>I would very much advise Michal and Krzysztof to add some basic examples to
>their page. I had to scour the internet to find some working code.
>
>
Thats right. The above problem also shows that such examples can be
usefull. We are just now updating man pages for the library (there are
some obsolete informations) and I will prepare some well commented programs.

>Mounting the queuefs works but the fs, confusingly, is called mqueue and not
>mqueuefs.
>
>
As proc or msdos. Of course it can be changed if more people will want
'fs' suffix. Menuconfig help gives proper name.

Regards,
Krzysiek