On 01/12/2011 10:48 AM, Niklas Röjemo wrote:
Hi All,

I have problem with interaction between fork and qpid when using qpid
from mrg 1.3. The program worked using mrg 1.1. The problem can be
triggered with a small program that sends a message on qpid and then
forks a minimal child. The child will terminate with a segmentation fault.

The test program is next, followed by some output from gdb.

==============
#include<sys/wait.h>

#include<qpid/client/Connection.h>
#include<qpid/client/Session.h>
#include<qpid/client/Message.h>

int main(int argc, char** argv) {
   const char* key     = "rojemo_ts";
   const char* exchange = "amq.direct";
   const char* host    = "qpid-vm";
   int         port    = 5672;

   for(int i = 0; i<  10; ++i) {
     {
       qpid::client::Connection connection;
       connection.open(host, port);
       qpid::client::Session session = 
qpid::client::sync(connection.newSession());
       qpid::client::Message message;
       message.getDeliveryProperties().setRoutingKey(key);
       message.setData("testing");
       session.messageTransfer(qpid::client::arg::content=message,
                              qpid::client::arg::destination=exchange);
       session.sync();
       session.close();
       connection.close();
     }

     {
       pid_t pid = fork();
       if(!pid) {
        sleep(1);
        exit(0);
       } else {
        int status;
        wait(&status);
       }
     }
   }
}
==============

Only one message is sent before the child process dies (also the main
process terminates).

(gdb) run
Starting program: 
/users/rojemo/work/mareeba-1/forkservers/test/x86_64_linux/qpid_test_g
[Thread debugging using libthread_db enabled]
[New Thread 0x40a00940 (LWP 18851)]
Detaching after fork from child process 18852.

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x40a00940 (LWP 18851)]
0x000000375ca08ca0 in pthread_mutex_lock () from /lib64/libpthread.so.0
(gdb) where
#0  0x000000375ca08ca0 in pthread_mutex_lock () from /lib64/libpthread.so.0
#1  0x00000034e266b97a in qpid::sys::Mutex::lock() () from 
/usr/lib64/libqpidclient.so.3
#2  0x00000034e2b2a377 in qpid::sys::Poller::wait(qpid::sys::Duration) () from 
/usr/lib64/libqpidcommon.so.3
#3  0x00000034e2b2adc7 in qpid::sys::Poller::run() () from 
/usr/lib64/libqpidcommon.so.3
#4  0x00000034e2b2101a in ?? () from /usr/lib64/libqpidcommon.so.3
#5  0x000000375ca0673d in start_thread () from /lib64/libpthread.so.0
#6  0x000000375bed3f6d in clone () from /lib64/libc.so.6

The main process is waiting in the call to wait.


   Regards,
   Niklas


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]


The qpid client library creates background threads, so forking a qpid client like this won't work. For some info on why forking & pthreads don't coexist well see the"Rationale" section of: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to