diff options
author | Determinant <ted.sybil@gmail.com> | 2018-11-18 16:24:30 -0500 |
---|---|---|
committer | Determinant <ted.sybil@gmail.com> | 2018-11-18 16:24:30 -0500 |
commit | 161d969e0eabfecccd69a6b9ed2d03919cf89cb5 (patch) | |
tree | 60008191c4320a8b4c5ae31773d70f996d3548f7 /include/salticidae/conn.h | |
parent | 39f6d6ac46d440aa68e7b1a2f2e4eb629356af34 (diff) |
improve the test programsmultiloops
Diffstat (limited to 'include/salticidae/conn.h')
-rw-r--r-- | include/salticidae/conn.h | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/include/salticidae/conn.h b/include/salticidae/conn.h index c357875..265a02a 100644 --- a/include/salticidae/conn.h +++ b/include/salticidae/conn.h @@ -238,6 +238,7 @@ class ConnPool { /* related to workers */ size_t nworker; salticidae::BoxObj<Worker[]> workers; + bool worker_running; void accept_client(int, int); conn_t add_conn(const conn_t &conn); @@ -319,7 +320,8 @@ class ConnPool { conn_server_timeout(config._conn_server_timeout), seg_buff_size(config._seg_buff_size), listen_fd(-1), - nworker(config._nworker) { + nworker(config._nworker), + worker_running(false) { workers = new Worker[nworker]; user_tcall = new ThreadCall(ec); disp_ec = workers[0].get_ec(); @@ -327,27 +329,22 @@ class ConnPool { workers[0].set_dispatcher(); } - ~ConnPool() { - stop(); - for (auto it: pool) - { - conn_t conn = it.second; - conn->stop(); - conn->self_ref = nullptr; - } - if (listen_fd != -1) close(listen_fd); - } + ~ConnPool() { stop(); } ConnPool(const ConnPool &) = delete; ConnPool(ConnPool &&) = delete; void start() { + if (worker_running) return; SALTICIDAE_LOG_INFO("starting all threads..."); for (size_t i = 0; i < nworker; i++) workers[i].start(); + worker_running = true; } - void stop() { + void stop_workers() { + if (!worker_running) return; + worker_running = false; SALTICIDAE_LOG_INFO("stopping all threads..."); /* stop all workers */ for (size_t i = 0; i < nworker; i++) @@ -355,7 +352,21 @@ class ConnPool { /* join all worker threads */ for (size_t i = 0; i < nworker; i++) workers[i].get_handle().join(); - nworker = 0; + } + + void stop() { + stop_workers(); + for (auto it: pool) + { + conn_t conn = it.second; + conn->stop(); + conn->self_ref = nullptr; + } + if (listen_fd != -1) + { + close(listen_fd); + listen_fd = -1; + } } /** Actively connect to remote addr. */ |