void send_from_queue(std::shared_ptr<Connection> connection) {
     strand.post([this, connection]() {
         boost::asio::async_write(*socket, send_queue.begin()->header_stream->streambuf,
                 strand.wrap([this, connection](const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
             if(!ec) {
                 boost::asio::async_write(*socket, send_queue.begin()->message_stream->streambuf,
                         strand.wrap([this, connection]
                         (const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
                     auto send_queued=send_queue.begin();
                     if(send_queued->callback)
                         send_queued->callback(ec);
                     if(!ec) {
                         send_queue.erase(send_queued);
                         if(send_queue.size()>0)
                             send_from_queue(connection);
                     }
                     else
                         send_queue.clear();
                 }));
             }
             else {
                 auto send_queued=send_queue.begin();
                 if(send_queued->callback)
                     send_queued->callback(ec);
                 send_queue.clear();
             }
         }));
     });
 }
Beispiel #2
0
 void Wait() {
     if (!queue_.empty()) {
         std::cout << "t0 + " << std::setw(4) << mark() << "ms Open for Number :   "  << type <<  " (dur:"  << queue_.front() <<  ") (depth " << queue_.size() << ")\n";
         timer_.expires_from_now(boost::posix_time::milliseconds(queue_.front()));
         timer_.async_wait(strand_.wrap(std::bind(&Session::Close, shared_from_this())));
     }
 }