Message queue support
J. Johnston
jjohnstn@redhat.com
Mon Jun 30 13:44:00 GMT 2003
Patch checked in. Thanks.
-- Jeff J.
Jose Miguel Goncalves wrote:
> OK Jeff, I agree with you.
>
> José Gonçalves
>
> 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:
>>
>>> Jeff,
>>>
>>> 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);
>>> }
>>> else
>>> {
>>>
>>> Regards,
>>> José Gonçalves
>>>
>>> J. Johnston wrote:
>>>
>>>> Jose,
>>>>
>>>> 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
>>>> successfully.
>>>>
>>>> -- Jeff J.
>>>>
>>>> Jose Miguel Goncalves wrote:
>>>>
>>>>> Jeff,
>>>>>
>>>>> 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
>>>>> -I/usr/local/newlib/i686-pc-linux-gnu/include
>>>>> /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
>>>>> test_thread_queue
>>>>>
>>>>> The same source compiled in a Sun Solaris 8 machine (with native
>>>>> support for pthreads and mqueues) works fine.
>>>>>
>>>>> Regards,
>>>>> José Gonçalves
>>>>>
>>>
>>>
>>
>>
>
>
More information about the Newlib
mailing list