void on_read(mp::wavy::event& e) { try{ while(true) { if(m_pac.execute()) { msgpack::object msg = m_pac.data(); std::shared_ptr<msgpack::zone> z( m_pac.release_zone() ); m_pac.reset(); e.more(); //e.next(); //DEBUG(std::cout << "object received: " << msg << "->"); //DEBUG(lock_mut lock(&mut);); event_handle(fd(), msg, &*z); return; } m_pac.reserve_buffer(8*1024); int read_len = ::read(fd(), m_pac.buffer(), m_pac.buffer_capacity()); if(read_len <= 0) { if(read_len == 0) {throw mp::system_error(errno, "connection closed"); } if(errno == EAGAIN || errno == EINTR) { return; } else { perror("read"); throw mp::system_error(errno, "read error"); } } m_pac.buffer_consumed(read_len); } }catch(...){ DEBUG_OUT("fd:%d ",fd());; perror("exception "); e.remove(); } }
static void feed_file(msgpack::unpacker& pac, const char* path) { std::ifstream fin(path); while(true) { pac.reserve_buffer(32*1024); fin.read(pac.buffer(), pac.buffer_capacity()); if(fin.bad()) { throw std::runtime_error("read failed"); } pac.buffer_consumed(static_cast<size_t>(fin.gcount())); if(fin.fail()) { break; } } }