Skip to content

boost::process::opstream throws exception in destructor #111

@sorayuki

Description

@sorayuki

Boost 1.71
MacOS 10.15 x64
XCode, Clang

Program build with CMake, with set(CMAKE_CXX_STANDARD 11)

When sub-process exited ( for example, a MPV player, which read FLV stream from stdin, exited due to user pressed Q ), boost::process::opstream can't destruct successfully because C++ 11 make noexcept(true) default to destructor.

Since boost::process::opstream is inherited from std::basic_stream, and std::basic_stream::~basic_stream has no noexcept(true), so the compiler stops me from add noexcept(false) to boost::process::basic_opstream::~basic_opstream.

I have no idea how to fix it.

(lldb) bt
* thread #4, stop reason = step in
  * frame #0: 0x0000000100011a3d rtmp-test-server`boost::process::detail::throw_last_error() at config.hpp:86:5
    frame #1: 0x00000001000119d2 rtmp-test-server`boost::process::detail::posix::basic_pipe<char, std::__1::char_traits<char> >::write(this=0x000070000eb58928, data="...", count=369) at basic_pipe.hpp:87:13
    frame #2: 0x00000001000118f1 rtmp-test-server`boost::process::basic_pipebuf<char, std::__1::char_traits<char> >::_write_impl(this=0x000070000eb588e8) at pipe.hpp:270:36
    frame #3: 0x0000000100011045 rtmp-test-server`boost::process::basic_pipebuf<char, std::__1::char_traits<char> >::sync(this=0x000070000eb588e8) at pipe.hpp:189:40
    frame #4: 0x0000000100011336 rtmp-test-server`boost::process::basic_pipebuf<char, std::__1::char_traits<char> >::overflow(this=0x000070000eb588e8, ch=-1) at pipe.hpp:184:18
    frame #5: 0x0000000100010ee6 rtmp-test-server`boost::process::basic_pipebuf<char, std::__1::char_traits<char> >::~basic_pipebuf(this=0x000070000eb588e8) at pipe.hpp:127:17
    frame #6: 0x0000000100010e85 rtmp-test-server`boost::process::basic_pipebuf<char, std::__1::char_traits<char> >::~basic_pipebuf(this=0x000070000eb588e8) at pipe.hpp:125:5
    frame #7: 0x0000000100010dd4 rtmp-test-server`boost::process::basic_opstream<char, std::__1::char_traits<char> >::~basic_opstream(this=0x000070000eb588e0, vtt=0x00000001000f6448) at pipe.hpp:407:7
    frame #8: 0x0000000100008410 rtmp-test-server`boost::process::basic_opstream<char, std::__1::char_traits<char> >::~basic_opstream(this=0x000070000eb588e0) at pipe.hpp:407:7
    frame #9: 0x00000001000071e4 rtmp-test-server`launch(port=56300, icb=0x00007ffeefbff958, setstate=function<void (const char *)> @ 0x000070000eb58ee0)>) at main.cpp:199:5
    frame #10: 0x000000010004201c rtmp-test-server`main::$_3::operator(this=0x00000001052324f8)() const at main.cpp:318:44
    frame #11: 0x0000000100041e9d rtmp-test-server`decltype(__f=0x00000001052324f8)()) std::__1::__invoke<main::$_3>(main::$_3&&) at type_traits:4361:1
    frame #12: 0x0000000100041e05 rtmp-test-server`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, main::$_3>(__t=size=2, (null)=__tuple_indices<> @ 0x000070000eb58f58) at thread:342:5
    frame #13: 0x0000000100041696 rtmp-test-server`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, main::$_3> >(__vp=0x00000001052324f0) at thread:352:5
    frame #14: 0x00007fff714dbd36 libsystem_pthread.dylib`_pthread_start + 125
    frame #15: 0x00007fff714d858f libsystem_pthread.dylib`thread_start + 15
(lldb)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions