Skip to content

Commit 864c2fa

Browse files
committed
opt(eventx,main):1.10.20
1. 优化ThreadPool,减少主线程join()等待时长; 2. 优化main框架,重命名loop_exit_wait与error_exit_wait两个参数为exit_wait_sec与is_fault_hup
1 parent 9369469 commit 864c2fa

File tree

5 files changed

+41
-24
lines changed

5 files changed

+41
-24
lines changed

modules/eventx/thread_pool.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ ThreadPool::Snapshot ThreadPool::snapshot() const
289289

290290
void ThreadPool::threadProc(ThreadToken thread_token)
291291
{
292+
bool let_main_loop_join_me = false;
293+
292294
LogDbg("thread %u start", thread_token.id());
293295

294296
while (true) {
@@ -301,13 +303,7 @@ void ThreadPool::threadProc(ThreadToken thread_token)
301303
*/
302304
if ((d_->idle_thread_num >= d_->undo_tasks_cabinet.size()) && (d_->threads_cabinet.size() > d_->min_thread_num)) {
303305
LogDbg("thread %u will exit, no more work.", thread_token.id());
304-
//! 则将线程取出来,交给main_loop去join(),然后delete
305-
auto t = d_->threads_cabinet.free(thread_token);
306-
if (t != nullptr) //! 如果取得到,说明还没有被cleanup()
307-
d_->wp_loop->runInLoop(
308-
[t]{ t->join(); delete t; },
309-
"ThreadPool::threadProc, join and delete t"
310-
);
306+
let_main_loop_join_me = true;
311307
break;
312308
}
313309

@@ -370,6 +366,17 @@ void ThreadPool::threadProc(ThreadToken thread_token)
370366
}
371367

372368
LogDbg("thread %u exit", thread_token.id());
369+
370+
if (let_main_loop_join_me) {
371+
//! 则将线程取出来,交给main_loop去join(),然后delete
372+
auto t = d_->threads_cabinet.free(thread_token);
373+
TBOX_ASSERT(t != nullptr);
374+
d_->wp_loop->runInLoop(
375+
[t]{ t->join(); delete t; },
376+
"ThreadPool::threadProc, join and delete it"
377+
);
378+
//! 这个操作放到最后来做是为了减少主线程join()的等待时长
379+
}
373380
}
374381

375382
bool ThreadPool::createWorker()

modules/eventx/work_thread.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ int WorkThread::cancel(TaskToken token)
189189

190190
void WorkThread::threadProc()
191191
{
192+
LogDbg("thread start");
193+
192194
while (true) {
193195
Task* item = nullptr;
194196
{

modules/main/run_in_backend.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ struct Runtime {
5858
Module apps;
5959

6060
util::PidFile pid_file;
61-
int loop_exit_wait = 1;
62-
bool error_exit_wait = false;
61+
int exit_wait_sec = 1;
62+
bool is_fault_hup = false;
6363
std::thread thread;
6464

6565
Runtime() : apps("", ctx) {
@@ -146,19 +146,24 @@ bool Start(int argc, char **argv)
146146
}
147147
}
148148

149-
util::json::GetField(js_conf, "loop_exit_wait", _runtime->loop_exit_wait);
150-
util::json::GetField(js_conf, "error_exit_wait", _runtime->error_exit_wait);
149+
util::json::GetField(js_conf, "exit_wait_sec", _runtime->exit_wait_sec);
150+
util::json::GetField(js_conf, "is_fault_hup", _runtime->is_fault_hup); //! 出现错误的时候是否需要挂起
151151

152152
trace.initialize(ctx, js_conf);
153153
log.initialize(argv[0], ctx, js_conf);
154154
LogOutput_Disable();
155155

156156
SayHi();
157157

158+
//! 注册异常退出时的动作,在异常信号触发时调用
158159
error_exit_func = [&] {
160+
if (_runtime->is_fault_hup)
161+
LogNotice("process is hup.");
162+
163+
//! 主要是保存日志
159164
log.cleanup();
160165

161-
while (_runtime->error_exit_wait)
166+
while (_runtime->is_fault_hup)
162167
std::this_thread::sleep_for(std::chrono::seconds(1));
163168
};
164169

@@ -201,8 +206,8 @@ void Stop()
201206
[] {
202207
_runtime->apps.stop();
203208
_runtime->ctx.stop();
204-
_runtime->ctx.loop()->exitLoop(std::chrono::seconds(_runtime->loop_exit_wait));
205-
LogDbg("Loop will exit after %d sec", _runtime->loop_exit_wait);
209+
_runtime->ctx.loop()->exitLoop(std::chrono::seconds(_runtime->exit_wait_sec));
210+
LogDbg("Loop will exit after %d sec", _runtime->exit_wait_sec);
206211
},
207212
"main::Stop"
208213
);

modules/main/run_in_frontend.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ extern void SayBye();
5252
extern std::function<void()> error_exit_func;
5353

5454
namespace {
55-
void RunInFrontend(ContextImp &ctx, Module &apps, int loop_exit_wait)
55+
void RunInFrontend(ContextImp &ctx, Module &apps, int exit_wait_sec)
5656
{
5757
auto stop_signal = ctx.loop()->newSignalEvent("main::RunInFrontend::stop_signal");
5858
auto warn_signal = ctx.loop()->newSignalEvent("main::RunInFrontend::warn_signal");
@@ -71,8 +71,8 @@ void RunInFrontend(ContextImp &ctx, Module &apps, int loop_exit_wait)
7171
LogImportant("Got signal %d, stop", signo);
7272
apps.stop();
7373
ctx.stop();
74-
ctx.loop()->exitLoop(std::chrono::seconds(loop_exit_wait));
75-
LogDbg("Loop will exit after %d sec", loop_exit_wait);
74+
ctx.loop()->exitLoop(std::chrono::seconds(exit_wait_sec));
75+
LogDbg("Loop will exit after %d sec", exit_wait_sec);
7676
}
7777
);
7878

@@ -131,11 +131,11 @@ int Main(int argc, char **argv)
131131
}
132132
}
133133

134-
int loop_exit_wait = 1;
135-
util::json::GetField(js_conf, "loop_exit_wait", loop_exit_wait);
134+
int exit_wait_sec = 1;
135+
util::json::GetField(js_conf, "exit_wait_sec", exit_wait_sec);
136136

137-
bool error_exit_wait = false;
138-
util::json::GetField(js_conf, "error_exit_wait", error_exit_wait);
137+
bool is_fault_hup = false;
138+
util::json::GetField(js_conf, "is_fault_hup", is_fault_hup); //! 出现错误的时候是否需要挂起
139139

140140
trace.initialize(ctx, js_conf);
141141
log.initialize(argv[0], ctx, js_conf);
@@ -145,17 +145,20 @@ int Main(int argc, char **argv)
145145

146146
//! 注册异常退出时的动作,在异常信号触发时调用
147147
error_exit_func = [&] {
148+
if (is_fault_hup)
149+
LogNotice("process is hup.");
150+
148151
//! 主要是保存日志
149152
log.cleanup();
150153

151-
while (error_exit_wait)
154+
while (is_fault_hup)
152155
std::this_thread::sleep_for(std::chrono::seconds(1));
153156
};
154157

155158
if (ctx.initialize(argv[0], js_conf)) {
156159
if (apps.initialize(js_conf)) {
157160
if (ctx.start() && apps.start()) { //! 启动所有应用
158-
RunInFrontend(ctx, apps, loop_exit_wait);
161+
RunInFrontend(ctx, apps, exit_wait_sec);
159162
} else {
160163
LogErr("Apps start fail");
161164
}

version.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
# TBOX版本号
2222
TBOX_VERSION_MAJOR := 1
2323
TBOX_VERSION_MINOR := 10
24-
TBOX_VERSION_REVISION := 19
24+
TBOX_VERSION_REVISION := 20

0 commit comments

Comments
 (0)