19 #include <google/profiler.h>
22 using namespace tasks;
23 using namespace tasks::net;
29 if (events & EV_READ) {
31 std::vector<char> buf(1024);
32 std::size_t bytes =
socket().
read(&buf[0], buf.size());
33 tdbg(
"echo_handler: read " << bytes <<
" bytes" << std::endl);
35 m_write_queue.push(std::move(buf));
37 terr(
"echo_handler::handle_event: " << e.
what() << std::endl);
41 if (events & EV_WRITE) {
42 if (!m_write_queue.empty()) {
43 std::vector<char>& buf = m_write_queue.front();
45 std::size_t len = buf.size() - m_write_offset;
46 std::size_t bytes =
socket().
write(&buf[m_write_offset], len);
47 tdbg(
"echo_handler: wrote " << bytes <<
" bytes" << std::endl);
54 m_write_offset += bytes;
57 terr(
"echo_handler::handle_event: " << e.
what() << std::endl);
62 if (m_write_queue.empty()) {
64 update_watcher(worker);
66 set_events(EV_READ | EV_WRITE);
67 update_watcher(worker);
73 std::time_t now = std::time(
nullptr);
74 std::time_t diff = now - m_last;
76 count = m_req_count.exchange(0, std::memory_order_relaxed);
78 int qps = count / diff;
79 std::cout << qps <<
" req/s, num of clients " << m_clients << std::endl;
85 terr(
"Got signal " << sig << std::endl);
89 int main(
int argc,
char** argv) {
91 ProfilerStart(
"echoserver.prof");
97 auto tasks = std::vector<task*>{&srv, &s};
static std::shared_ptr< dispatcher > instance()
std::streamsize write(const char *data, std::size_t len, int port=-1, std::string ip="")
bool handle_event(tasks::worker *worker, int revents)
int main(int argc, char **argv)
bool handle_event(tasks::worker *, int revents)
std::streamsize read(char *data, std::size_t len)
const char * what() const noexcept
Return the error message.
static std::atomic< int > m_req_count
static std::atomic< int > m_clients
static void handle_signal(struct ev_loop *, ev_signal *sig, int)
static void add_signal_handler(int sig, signal_func_t func)