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]