aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDeterminant <ted.sybil@gmail.com>2019-10-13 14:05:29 -0400
committerDeterminant <ted.sybil@gmail.com>2019-10-13 14:05:29 -0400
commit3505e9d33eab6d341185773c1da315b2dc833a21 (patch)
treea67629fea47ee83f5c05d781198469f135882eeb /src
parent8270af53b2e4741fcacab49a21823597cc31d88c (diff)
WIP: bounded recv buffer
Diffstat (limited to 'src')
-rw-r--r--src/conn.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/conn.cpp b/src/conn.cpp
index 98ad3fc..a627a15 100644
--- a/src/conn.cpp
+++ b/src/conn.cpp
@@ -91,7 +91,7 @@ void ConnPool::Conn::_send_data(const conn_t &conn, int fd, int events) {
}
}
conn->ev_socket.del();
- conn->ev_socket.add(FdEvent::READ);
+ conn->ev_socket.add(conn->ready_recv ? 0 : FdEvent::READ);
/* consumed the buffer but endpoint still seems to be writable */
conn->ready_send = true;
}
@@ -106,6 +106,14 @@ void ConnPool::Conn::_recv_data(const conn_t &conn, int fd, int events) {
ssize_t ret = seg_buff_size;
while (ret == (ssize_t)seg_buff_size)
{
+ if (conn->recv_buffer.size() >= conn->max_recv_buff_size)
+ {
+ /* receive buffer is full, disable READ event */
+ conn->ev_socket.del();
+ conn->ev_socket.add(conn->ready_send ? 0 : FdEvent::WRITE);
+ conn->ready_recv = true;
+ return;
+ }
bytearray_t buff_seg;
buff_seg.resize(seg_buff_size);
ret = recv(fd, buff_seg.data(), seg_buff_size, 0);
@@ -171,7 +179,7 @@ void ConnPool::Conn::_send_data_tls(const conn_t &conn, int fd, int events) {
}
}
conn->ev_socket.del();
- conn->ev_socket.add(FdEvent::READ);
+ conn->ev_socket.add(conn->ready_recv ? : FdEvent::READ);
/* consumed the buffer but endpoint still seems to be writable */
conn->ready_send = true;
}
@@ -187,6 +195,14 @@ void ConnPool::Conn::_recv_data_tls(const conn_t &conn, int fd, int events) {
auto &tls = conn->tls;
while (ret == (ssize_t)seg_buff_size)
{
+ if (conn->recv_buffer.size() >= conn->max_recv_buff_size)
+ {
+ /* receive buffer is full, disable READ event */
+ conn->ev_socket.del();
+ conn->ev_socket.add(conn->ready_send ? 0 : FdEvent::WRITE);
+ conn->ready_recv = true;
+ return;
+ }
bytearray_t buff_seg;
buff_seg.resize(seg_buff_size);
ret = tls->recv(buff_seg.data(), seg_buff_size);
@@ -295,6 +311,7 @@ void ConnPool::accept_client(int fd, int) {
conn_t conn = create_conn();
conn->send_buffer.set_capacity(queue_capacity);
conn->seg_buff_size = seg_buff_size;
+ conn->max_recv_buff_size = max_recv_buff_size;
conn->fd = client_fd;
conn->cpool = this;
conn->mode = Conn::PASSIVE;
@@ -375,6 +392,7 @@ ConnPool::conn_t ConnPool::_connect(const NetAddr &addr) {
conn_t conn = create_conn();
conn->send_buffer.set_capacity(queue_capacity);
conn->seg_buff_size = seg_buff_size;
+ conn->max_recv_buff_size = max_recv_buff_size;
conn->fd = fd;
conn->cpool = this;
conn->mode = Conn::ACTIVE;