Boost logo

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