|
Boost Users : |
Subject: [Boost-users] boost::asio destructor segfault?
From: Sean McAllister (smcallis_at_[hidden])
Date: 2010-03-18 14:36:16
I've got a class that's using ASIO to run a simple server listening for
command messages from a remote interface.
It's got some private members to help with this (class abridged for
shortness):
class ClassifierContext {
private:
io_service ioService_;
t_socket_shptr socket_;
};
It runs it's event loop in it's own thread (started with boost::thread)
// Hosts thread to run IO event loop
void ClassifierContext::io_loop() {
try {
connect();
} catch (std::exception &e) {
RERROR("Error connecting to site server -- %s", e.what());
}
// Work object prevents run() from stopping when it runs out of work
asio::io_service::work work(ioService_);
ioService_.run();
}
And it periodically sends data back along a single socket associated with
the ioService and also has
an asynchronous read pending to listen for command messages (I can post this
code if needed, it's just a couple async_sends and an async_read)
The problem I'm seeing comes when the destructor for the class is run:
ClassifierContext::~ClassifierContext() {
ioService_.stop();
}
Periodically (every 20 times or so) I get a segfault when the destructor for
ioService_ is called. A representative stack trace looks like this:
#0 0x0921bfd6 in ?? ()
#1 0x08125877 in
boost::asio::detail::reactor_op_queue<int>::destroy_operations (
this=0x8ec5f40)
at opt/linux/include/boost/asio/detail/reactor_op_queue.hpp:268
#2 0x081274ad in
boost::asio::detail::epoll_reactor<false>::shutdown_service (
this=0x8ec5ed8)
at opt/linux/include/boost/asio/detail/epoll_reactor.hpp:119
#3 0x08127b3b in ~service_registry (this=0x8ec5958)
at opt/linux/include/boost/asio/detail/service_registry.hpp:75
#4 0x08127c29 in ~io_service (this=0x8492360)
at opt/linux/include/boost/asio/impl/io_service.ipp:62
#5 0x08117110 in ~ClassifierContext (this=0x8492360)
at ClassifierContext.cpp:91
#6 0xb781cbb9 in exit () from /lib/tls/i686/cmov/libc.so.6
#7 0xb780477d in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
#8 0x081079c1 in _start () at ../sysdeps/i386/elf/start.S:119
Has anyone seen a segfault like this before? It's intermittent so that
tells me there's some kind of race condition. Any idea how I can work
around it?
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net