提交 f7ac50cd 编写于 作者: J jg0 提交者: wangzelin.wzl

fix memory leak of dynamic creation and release of threads

上级 3dfbfef7
......@@ -144,13 +144,13 @@ void CoRoutine::__start(transfer_t from)
int CoRoutine::at_create()
{
CVC.at_routine_create();
CVC.at_routine_create(get_crls_buffer());
return OB_SUCCESS;
}
void CoRoutine::at_exit()
{
CVC.at_routine_exit();
CVC.at_routine_exit(get_crls_buffer());
return;
}
......@@ -190,6 +190,11 @@ void CoMainRoutine::start()
free_coidx(idx_);
}
void CoMainRoutine::at_exit()
{
CoRoutine::at_exit();
}
void CoMainRoutine::destroy()
{
CoCtx::destroy(&cc_);
......
......@@ -235,8 +235,7 @@ public:
void start();
// Destroy resources.
void destroy();
void at_exit() override
{}
void at_exit() override;
void usleep(uint32_t usec) final;
void sleep_until(int64_t abs_time) final;
......
......@@ -72,35 +72,21 @@ int CoVarCenter::register_hook(CoVarHook* hook)
return static_cast<int>(num);
}
void CoVarCenter::at_routine_create()
void CoVarCenter::at_routine_create(char *buffer)
{
char* buffer = nullptr;
if (OB_LIKELY(CoSched::get_active_routine() != nullptr)) {
buffer = CoSched::get_active_routine()->get_crls_buffer();
assert(buffer != nullptr);
} else {
ob_abort();
}
int64_t& num = reinterpret_cast<int64_t&>(*(&buffer[coro::CoConfig::MAX_CRLS_SIZE] - 8));
int64_t &num = reinterpret_cast<int64_t&>(*(&buffer[coro::CoConfig::MAX_CRLS_SIZE]-8));
num = 0;
}
void CoVarCenter::at_routine_exit()
void CoVarCenter::at_routine_exit(char *buffer)
{
if (CoSched::get_active_routine() != CoSched::get_instance()) {
char* buffer = nullptr;
if (OB_LIKELY(CoSched::get_active_routine() != nullptr)) {
buffer = CoSched::get_active_routine()->get_crls_buffer();
}
const auto MAX_CRLS_SIZE = coro::CoConfig::MAX_CRLS_SIZE;
int64_t& num = reinterpret_cast<int64_t&>(*(&buffer[MAX_CRLS_SIZE] - 8));
CoVarHook** last = reinterpret_cast<CoVarHook**>(&buffer[MAX_CRLS_SIZE] - 16);
for (int64_t i = num - 1; i >= 0; i--) {
last[-i]->deinit_();
}
num = 0;
const auto MAX_CRLS_SIZE = coro::CoConfig::MAX_CRLS_SIZE;
int64_t &num = reinterpret_cast<int64_t&>(*(&buffer[MAX_CRLS_SIZE]-8));
CoVarHook **last = reinterpret_cast<CoVarHook**>(&buffer[MAX_CRLS_SIZE]-16);
for (int64_t i = num-1; i >= 0; i--) {
last[-i]->deinit_();
}
num = 0;
}
} // namespace lib
......
......@@ -72,9 +72,9 @@ public:
return pos;
}
int register_hook(CoVarHook* hook);
void at_routine_create();
void at_routine_exit();
int register_hook(CoVarHook *hook);
void at_routine_create(char *buffer);
void at_routine_exit(char *buffer);
static CoVarCenter& instance()
{
......
......@@ -229,6 +229,9 @@ void* Thread::__th_start(void* arg)
}
}
}
if (mem_context != nullptr && *mem_context != nullptr) {
DESTROY_CONTEXT(*mem_context);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册