Message queue support

J. Johnston jjohnstn@redhat.com
Fri Jun 27 21:26:00 GMT 2003


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