diff options
author | Determinant <[email protected]> | 2018-07-16 18:44:56 -0400 |
---|---|---|
committer | Determinant <[email protected]> | 2018-07-16 18:44:56 -0400 |
commit | ea892d32e090c5d48d383646d67105f571877993 (patch) | |
tree | 4abc565149bc21e11a996b8b0f3b213654a8f1c1 | |
parent | fd881223556fc608b24626a7bc6e78bf576d3ed7 (diff) |
...
-rw-r--r-- | CMakeLists.txt | 23 | ||||
-rw-r--r-- | include/salticidae/conn.h | 33 | ||||
-rw-r--r-- | include/salticidae/util.h | 2 | ||||
-rw-r--r-- | src/conn.cpp | 24 | ||||
-rw-r--r-- | src/util.cpp | 4 | ||||
-rw-r--r-- | test/CMakeLists.txt | 4 |
6 files changed, 57 insertions, 33 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index b358842..cc6ce86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,9 +30,20 @@ find_package(OpenSSL REQUIRED) include_directories(include) add_library(salticidae + OBJECT src/util.cpp src/conn.cpp) -target_link_libraries(salticidae event crypto) + +option(BUILD_SHARED "build shared library." OFF) +if(BUILD_SHARED) + set_property(TARGET salticidae PROPERTY POSITION_INDEPENDENT_CODE 1) + add_library(salticidae_shared SHARED $<TARGET_OBJECTS:salticidae>) + set_target_properties(salticidae_shared PROPERTIES OUTPUT_NAME "salticidae") + target_link_libraries(salticidae_shared event crypto) +endif() +add_library(salticidae_static STATIC $<TARGET_OBJECTS:salticidae>) +set_target_properties(salticidae_static PROPERTIES OUTPUT_NAME "salticidae") +target_link_libraries(salticidae_static event crypto) add_subdirectory(test) @@ -46,11 +57,5 @@ elseif(CMAKE_BUILD_TYPE STREQUAL "Release") add_definitions(-DSALTICIDAE_NORMAL_LOG) endif() -#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -no-pie -pg") -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -W -Wall -Wextra -pedantic") - -macro(remove_cxx_flag flag) - string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") -endmacro() - -remove_cxx_flag("-DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -W -Wall -Wextra -pedantic -Wsuggest-override") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -W -Wall -Wextra -pedantic -Wsuggest-override") diff --git a/include/salticidae/conn.h b/include/salticidae/conn.h index f91e30e..4db5f40 100644 --- a/include/salticidae/conn.h +++ b/include/salticidae/conn.h @@ -44,18 +44,8 @@ #include "salticidae/netaddr.h" #include "salticidae/msg.h" -const int MAX_LISTEN_BACKLOG = 10; -const size_t BUFF_SEG_SIZE = 4096; -const size_t MAX_MSG_HANDLER = 64; -const double TRY_CONN_DELAY = 2; -const double CONN_SERVER_TIMEOUT = 2; - namespace salticidae { -inline double gen_rand_timeout(double base_timeout) { - return base_timeout + rand() / (double)RAND_MAX * 0.5 * base_timeout; -} - class RingBuffer { struct buffer_entry_t { bytearray_t data; @@ -163,6 +153,7 @@ class ConnPool { }; private: + size_t seg_buff_size; conn_t self_ref; int fd; ConnPool *cpool; @@ -197,6 +188,7 @@ class ConnPool { const NetAddr &get_addr() const { return addr; } ConnMode get_mode() const { return mode; } RingBuffer &read() { return recv_buffer; } + void set_seg_buff_size(size_t size) { seg_buff_size = size; } void write(bytearray_t &&data) { send_buffer.push(std::move(data)); @@ -226,6 +218,10 @@ class ConnPool { }; private: + int max_listen_backlog; + double try_conn_delay; + double conn_server_timeout; + size_t seg_buff_size; std::unordered_map<int, conn_t> pool; int listen_fd; Event ev_listen; @@ -236,10 +232,22 @@ class ConnPool { protected: EventContext eb; virtual conn_t create_conn() = 0; + virtual double gen_conn_timeout() { + return gen_rand_timeout(try_conn_delay); + } public: friend Conn; - ConnPool(const EventContext &eb): eb(eb) {} + ConnPool(const EventContext &eb, + int max_listen_backlog = 10, + double try_conn_delay = 2, + double conn_server_timeout = 2, + size_t seg_buff_size = 4096): + max_listen_backlog(max_listen_backlog), + try_conn_delay(try_conn_delay), + conn_server_timeout(conn_server_timeout), + seg_buff_size(seg_buff_size), + eb(eb) {} ~ConnPool() { for (auto it: pool) @@ -249,6 +257,9 @@ class ConnPool { } } + ConnPool(const ConnPool &) = delete; + ConnPool(ConnPool &&) = delete; + /** create an active mode connection to addr */ conn_t create_conn(const NetAddr &addr); /** setup and start listening */ diff --git a/include/salticidae/util.h b/include/salticidae/util.h index d0fd984..505f014 100644 --- a/include/salticidae/util.h +++ b/include/salticidae/util.h @@ -40,6 +40,8 @@ namespace salticidae { void sec2tv(double t, struct timeval &tv); void event_add_with_timeout(struct event *ev, double timeout); +double gen_rand_timeout(double base_timeout, double alpha = 0.5); + std::string trim(const std::string &s, const std::string &space = "\t\r\n "); std::vector<std::string> split(const std::string &s, const std::string &delim); diff --git a/src/conn.cpp b/src/conn.cpp index 0b42853..62cba8a 100644 --- a/src/conn.cpp +++ b/src/conn.cpp @@ -45,12 +45,12 @@ ConnPool::Conn::operator std::string() const { void ConnPool::Conn::send_data(evutil_socket_t fd, short events) { if (!(events & EV_WRITE)) return; auto conn = self(); /* pin the connection */ - ssize_t ret = BUFF_SEG_SIZE; - while (ret == BUFF_SEG_SIZE) + ssize_t ret = seg_buff_size; + while (ret == (ssize_t)seg_buff_size) { if (!send_buffer.size()) /* nothing to write */ break; - bytearray_t buff_seg = send_buffer.pop(BUFF_SEG_SIZE); + bytearray_t buff_seg = send_buffer.pop(seg_buff_size); ssize_t size = buff_seg.size(); ret = send(fd, buff_seg.data(), size, MSG_NOSIGNAL); SALTICIDAE_LOG_DEBUG("socket sent %d bytes", ret); @@ -88,12 +88,12 @@ void ConnPool::Conn::send_data(evutil_socket_t fd, short events) { void ConnPool::Conn::recv_data(evutil_socket_t fd, short events) { if (!(events & EV_READ)) return; auto conn = self(); /* pin the connection */ - ssize_t ret = BUFF_SEG_SIZE; - while (ret == BUFF_SEG_SIZE) + ssize_t ret = seg_buff_size; + while (ret == (ssize_t)seg_buff_size) { bytearray_t buff_seg; - buff_seg.resize(BUFF_SEG_SIZE); - ret = recv(fd, buff_seg.data(), BUFF_SEG_SIZE, 0); + buff_seg.resize(seg_buff_size); + ret = recv(fd, buff_seg.data(), seg_buff_size, 0); SALTICIDAE_LOG_DEBUG("socket read %d bytes", ret); if (ret <= 0) { @@ -137,6 +137,7 @@ void ConnPool::accept_client(evutil_socket_t fd, short) { NetAddr addr((struct sockaddr_in *)&client_addr); conn_t conn = create_conn(); Conn *conn_ptr = conn.get(); + conn->seg_buff_size = seg_buff_size; conn->fd = client_fd; conn->cpool = this; conn->mode = Conn::PASSIVE; @@ -197,7 +198,7 @@ void ConnPool::init(NetAddr listen_addr) { if (bind(listen_fd, (struct sockaddr *)&sockin, sizeof(sockin)) < 0) throw ConnPoolError(std::string("binding error")); - if (::listen(listen_fd, MAX_LISTEN_BACKLOG) < 0) + if (::listen(listen_fd, max_listen_backlog) < 0) throw ConnPoolError(std::string("listen error")); ev_listen = Event(eb, listen_fd, EV_READ, std::bind(&ConnPool::accept_client, this, _1, _2)); @@ -238,7 +239,7 @@ void ConnPool::Conn::try_conn(evutil_socket_t, short) { } ev_connect = Event(cpool->eb, fd, EV_WRITE, std::bind(&Conn::conn_server, this, _1, _2)); - ev_connect.add_with_timeout(CONN_SERVER_TIMEOUT); + ev_connect.add_with_timeout(cpool->conn_server_timeout); } ConnPool::conn_t ConnPool::create_conn(const NetAddr &addr) { @@ -252,13 +253,14 @@ ConnPool::conn_t ConnPool::create_conn(const NetAddr &addr) { if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) throw ConnPoolError(std::string("unable to set nonblocking socket")); conn_t conn = create_conn(); - Conn * conn_ptr = conn.get(); + Conn *conn_ptr = conn.get(); + conn->seg_buff_size = seg_buff_size; conn->fd = fd; conn->cpool = this; conn->mode = Conn::ACTIVE; conn->addr = addr; conn->ev_connect = Event(eb, -1, 0, std::bind(&Conn::try_conn, conn_ptr, _1, _2)); - conn->ev_connect.add_with_timeout(gen_rand_timeout(TRY_CONN_DELAY)); + conn->ev_connect.add_with_timeout(gen_conn_timeout()); add_conn(conn); SALTICIDAE_LOG_INFO("created connection %s", std::string(*conn).c_str()); return conn; diff --git a/src/util.cpp b/src/util.cpp index 2adb997..7125598 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -47,6 +47,10 @@ void event_add_with_timeout(struct event *ev, double timeout) { event_add(ev, &tv); } +double gen_rand_timeout(double base_timeout, double alpha) { + return base_timeout + rand() / (double)RAND_MAX * alpha * base_timeout; +} + const std::string get_current_datetime() { /* credit: http://stackoverflow.com/a/41381479/544806 */ char fmt[64], buf[64]; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bedaaa3..7af1f87 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -21,7 +21,7 @@ # SOFTWARE. add_executable(test_msg test_msg.cpp) -target_link_libraries(test_msg salticidae) +target_link_libraries(test_msg salticidae_static) add_executable(test_stream test_stream.cpp) -target_link_libraries(test_stream salticidae) +target_link_libraries(test_stream salticidae_static) |