Message queue support
Jose Miguel Goncalves
Fri Jun 27 21:59:00 GMT 2003
OK Jeff, I agree with you.
J. Johnston wrote:
> Thanks Jose,
> The first part regarding the "created" flag is correct, however, I do
> not agree
> with the 2nd part of your change. That code ensures that the creator of
> the shared memory file also
> owns the semaphores. Once the "created" flag has been set correctly, it
> should work for
> your test.
> -- Jeff J.
> Jose Miguel Goncalves wrote:
>> I have found another bug in mq_open(). When called more than once (for
>> the same queue) with O_CREAT flag set, it fails. Sugested patch:
>> RCS file: /cvs/src/src/newlib/libc/sys/linux/mq_open.c,v
>> retrieving revision 1.3
>> diff -p -u -r1.3 mq_open.c
>> --- mq_open.c 27 Jun 2003 00:00:48 -0000 1.3
>> +++ mq_open.c 27 Jun 2003 14:53:04 -0000
>> @@ -98,7 +98,8 @@ mq_open (const char *name, int oflag, ..
>> return (mqd_t)-1;
>> errno = saved_errno;
>> - created = 1;
>> + if (fd >= 0)
>> + created = 1;
>> if (fd < 0)
>> @@ -132,9 +133,12 @@ mq_open (const char *name, int oflag, ..
>> saved_errno = errno;
>> semid = semget (key, 6, IPC_CREAT | IPC_EXCL | mode);
>> errno = saved_errno;
>> - /* now that we have created the semaphore, we should initialize
>> it */
>> if (semid != -1)
>> + /* now that we have created the semaphore, we should
>> initialize it */
>> semctl (semid, 0, SETVAL, arg);
>> + else
>> + /* semaphore already exists, so we get only it's id */
>> + semid = semget (key, 6, 0);
>> JosÃ© GonÃ§alves
>> J. Johnston wrote:
>>> I found a serious problem with opening an existing queue for read
>>> whereby the
>>> read/write buffers were not being allocated. A patch has been
>>> committed to the
>>> sources. With that patch applied I was able to run your test case
>>> -- Jeff J.
>>> Jose Miguel Goncalves wrote:
>>>> After setting up /dev/shm I could create a queue with mq_open(), and
>>>> send messages with mq_send(), but calling to mq_receive() returns
>>>> errors - "Bad address".
>>>> I attach the source code for the simple mqueue test application that
>>>> I'm using. I am compiling in a 2.4.21 linux kernel with:
>>>> $ gcc -static -nostdlib -g -Wall -D_REENTRANT
>>>> /usr/local/newlib/i686-pc-linux-gnu/lib/crt0.o test_thread_queue.c
>>>> -L/usr/local/newlib/i686-pc-linux-gnu/lib -lpthread -lc -lgcc -o
>>>> The same source compiled in a Sun Solaris 8 machine (with native
>>>> support for pthreads and mqueues) works fine.
>>>> JosÃ© GonÃ§alves
More information about the Newlib