static void pni_connection_writable(pn_selectable_t *sel) { pn_reactor_t *reactor = (pn_reactor_t *) pni_selectable_get_context(sel); pn_transport_t *transport = pni_transport(sel); ssize_t pending = pn_transport_pending(transport); if (pending > 0) { ssize_t n = pn_send(pni_reactor_io(reactor), pn_selectable_get_fd(sel), pn_transport_head(transport), pending); if (n < 0) { if (!pn_wouldblock(pni_reactor_io(reactor))) { pn_condition_t *cond = pn_transport_condition(transport); if (!pn_condition_is_set(cond)) { pn_condition_set_name(cond, "proton:io"); pn_condition_set_description(cond, pn_error_text(pn_reactor_error(reactor))); } pn_transport_close_head(transport); } } else { pn_transport_pop(transport, n); } } ssize_t newpending = pn_transport_pending(transport); if (newpending != pending) { pni_connection_update(sel); pn_reactor_update(reactor, sel); } }
const_buffer connection_engine::write_buffer() const { ssize_t pending = pn_transport_pending(unwrap(transport_)); if (pending > 0) return const_buffer(pn_transport_head(unwrap(transport_)), pending); else return const_buffer(0, 0); }
static ssize_t pni_connection_pending(pn_selectable_t *sel) { pn_transport_t *transport = pni_transport(sel); ssize_t pending = pn_transport_pending(transport); if (pending < 0) { if (pn_transport_closed(transport)) { pn_selectable_terminate(sel); } } return pending; }
size_t connection_engine::can_write() const { return std::max(ssize_t(0), pn_transport_pending(ctx_->transport)); }