Message queue support

Jose Miguel Goncalves jose.goncalves@inov.pt
Fri Jun 27 20:13:00 GMT 2003


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