Skip to content

Commit

Permalink
Handler: Implement macro helper C10K_READ_ASYNC_THEN_MEMFUN, C10K_WRI…
Browse files Browse the repository at this point in the history
…TE_ASYNC_THEN_MEMFUN
  • Loading branch information
htfy96 committed Jan 27, 2017
1 parent bcaa757 commit 7f2ca79
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 20 deletions.
6 changes: 5 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ include_directories(${spdlog_SOURCE_DIR}/include)
##################################
include_directories(src)

set(c10k_SOURCE src/c10k/c10k.cpp src/c10k/c10k.hpp src/c10k/event_loop.hpp src/c10k/event_loop.cpp src/c10k/timer_fd.hpp src/c10k/queue.hpp src/c10k/connection.hpp src/c10k/connection.cpp src/c10k/worker_thread.hpp)
set(c10k_SOURCE src/c10k/c10k.cpp src/c10k/c10k.hpp
src/c10k/event_loop.hpp src/c10k/event_loop.cpp
src/c10k/timer_fd.hpp src/c10k/queue.hpp
src/c10k/connection.hpp src/c10k/connection.cpp
src/c10k/worker_thread.hpp src/c10k/handler.hpp)
add_library(c10k STATIC ${c10k_SOURCE})
target_link_libraries(c10k ${CMAKE_THREAD_LIBS_INIT})

Expand Down
31 changes: 31 additions & 0 deletions src/c10k/handler.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// Created by lz on 1/27/17.
//

#ifndef C10K_SERVER_HANDLER_HPP
#define C10K_SERVER_HANDLER_HPP

#include <memory>
#include <functional>
#include <type_traits>
namespace c10k
{
// interface for handler
struct Handler: std::enable_shared_from_this<Handler>
{
virtual void handle_init(const ConnectionPtr &conn) = 0;
virtual ~Handler() {}
};

#define C10K_READ_ASYNC_THEN_MEMFUN(Conn_, OIt_, Len_, MemFunName_) \
Conn_->read_async_then(OIt_, Len_, \
std::bind(&std::remove_pointer_t<decltype(this)>::MemFunName_, \
std::static_pointer_cast<std::remove_pointer_t<decltype(this)>>(shared_from_this()), _1, _2, _3))

#define C10K_WRITE_ASYNC_THEN_MEMFUN(Conn_, IIt1_, IIt2_, MemFunName_) \
Conn_->write_async_then(IIt1_, IIt2_, \
std::bind(&std::remove_pointer_t<decltype(this)>::MemFunName_, \
std::static_pointer_cast<std::remove_pointer_t<decltype(this)>>(shared_from_this()), _1))
}

#endif //C10K_SERVER_HANDLER_HPP
8 changes: 1 addition & 7 deletions src/c10k/worker_thread.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,14 @@

#include "event_loop.hpp"
#include "connection.hpp"
#include "handler.hpp"
#include <spdlog/spdlog.h>
#include <memory>
#include <type_traits>
#include <functional>

namespace c10k
{
// interface for handler
struct Handler: std::enable_shared_from_this<Handler>
{
virtual void handle_init(const ConnectionPtr &conn) = 0;
virtual ~Handler() {}
};

namespace detail
{
// WorkerThread
Expand Down
18 changes: 6 additions & 12 deletions test/worker_thread_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <catch.hpp>
#include <c10k/worker_thread.hpp>
#include <c10k/utils.hpp>
#include <c10k/handler.hpp>
#include "test_common.hpp"
#include <cstdint>
#include <sstream>
Expand All @@ -18,30 +19,23 @@ struct ServerHandler: public c10k::Handler
{
using namespace std::placeholders;
using std::static_pointer_cast;
conn->read_async_then((char*)&len, sizeof(len),
std::bind(&ServerHandler::read_buffer,
static_pointer_cast<ServerHandler>(shared_from_this()), _1, _2, _3));
C10K_READ_ASYNC_THEN_MEMFUN(conn, (char*)&len, sizeof(len), read_buffer);
}

void read_buffer(const c10k::ConnectionPtr &conn, char *st, char *ed)
{
using namespace std::placeholders;
buffer.reserve(len);
conn->read_async_then(std::back_inserter(buffer), len,
std::bind(&ServerHandler::write_back,
std::static_pointer_cast<ServerHandler>(shared_from_this()), _1, _2, _3));
C10K_READ_ASYNC_THEN_MEMFUN(conn, std::back_inserter(buffer), len, write_back);
}

void write_back(const c10k::ConnectionPtr &conn, char *st, char *ed)
{
void write_back(const c10k::ConnectionPtr &conn, char *st, char *ed) {
using namespace std::placeholders;
std::vector<char> wrt_buffer;
wrt_buffer.reserve(2 + len);
std::copy_n((char *)&len, 2, std::back_inserter(wrt_buffer));
std::copy_n((char *) &len, 2, std::back_inserter(wrt_buffer));
std::copy(buffer.begin(), buffer.end(), std::back_inserter(wrt_buffer));
conn->write_async_then(wrt_buffer.begin(), wrt_buffer.end(),
std::bind(&ServerHandler::close_connection,
std::static_pointer_cast<ServerHandler>(shared_from_this()), _1));
C10K_WRITE_ASYNC_THEN_MEMFUN(conn, wrt_buffer.begin(), wrt_buffer.end(), close_connection);
}

void close_connection(const c10k::ConnectionPtr &conn)
Expand Down

0 comments on commit 7f2ca79

Please sign in to comment.