|
Boost Users : |
Subject: [Boost-users] Boost.ASIO calling handler guarantees
From: æ£ÄÏÒ ôÒÕÛËÉÎ (ted-xp_at_[hidden])
Date: 2014-08-22 08:20:10
Hello, Dear All,
I'm playing with Boost.ASIO framework and failed to find a complete answer on the following question.
Under which circumstances is it guaranteed that asynchronous operation completion handler is called?
Plainly speaking, is this example code correct?
void my_handler(const error_code &ec)
{
if(!ec) { /* process successful operation */ }
else { /* process failed operation */ }
try {
async_write(port, my_handler2)
}
catch(...) {
// processing failure to execute asynchronous operation
}
}
Obviously here I rely heavily upon the above mentioned guarantee.
Looking at least at async_write() implementation, it cannot be relied upon:
- async_write executes a chain of boost::asio::detail::write_op() operations:
- if asio_handler_allocate() may throw then
- write_op::stream_.async_write_some() may throw then
- write_op.handler_() might never be called
So, either we should never rely on this assumption, or there's a bug in async_write().
Not relying on this assumption what is the reliable way of building applications with Boost.Asio?
Sincerely yours,
Fedor Trushkin
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