aboutsummaryrefslogtreecommitdiff
path: root/include/salticidae/conn.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/salticidae/conn.h')
-rw-r--r--include/salticidae/conn.h22
1 files changed, 20 insertions, 2 deletions
diff --git a/include/salticidae/conn.h b/include/salticidae/conn.h
index 3144a68..69402d3 100644
--- a/include/salticidae/conn.h
+++ b/include/salticidae/conn.h
@@ -77,10 +77,11 @@ class ConnPool {
protected:
size_t seg_buff_size;
conn_t self_ref;
+ std::mutex ref_mlock;
int fd;
Worker *worker;
ConnPool *cpool;
- ConnMode mode;
+ std::atomic<ConnMode> mode;
NetAddr addr;
MPSCWriteBuffer send_buffer;
@@ -110,7 +111,16 @@ class ConnPool {
}
/** Get the handle to itself. */
- conn_t self() { return self_ref; }
+ conn_t self() {
+ mutex_lg_t _(ref_mlock);
+ return self_ref;
+ }
+
+ void release_self() {
+ mutex_lg_t _(ref_mlock);
+ self_ref = nullptr;
+ }
+
operator std::string() const;
const NetAddr &get_addr() const { return addr; }
ConnMode get_mode() const { return mode; }
@@ -380,6 +390,14 @@ class ConnPool {
template<typename Func>
void reg_conn_handler(Func cb) { conn_cb = cb; }
+
+ void terminate(Conn &_conn) {
+ auto conn = _conn.self();
+ if (!conn) return;
+ disp_tcall->async_call([this, conn](ThreadCall::Handle &) {
+ conn->disp_terminate();
+ });
+ }
};
}