fix memory leak of dynamic creation and release of threads
This commit is contained in:
parent
3dfbfef7c1
commit
f7ac50cd5d
9
deps/oblib/src/lib/coro/co_routine.cpp
vendored
9
deps/oblib/src/lib/coro/co_routine.cpp
vendored
@ -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_);
|
||||
|
3
deps/oblib/src/lib/coro/co_routine.h
vendored
3
deps/oblib/src/lib/coro/co_routine.h
vendored
@ -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;
|
||||
|
32
deps/oblib/src/lib/coro/co_var_center.cpp
vendored
32
deps/oblib/src/lib/coro/co_var_center.cpp
vendored
@ -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
|
||||
|
6
deps/oblib/src/lib/coro/co_var_center.h
vendored
6
deps/oblib/src/lib/coro/co_var_center.h
vendored
@ -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()
|
||||
{
|
||||
|
3
deps/oblib/src/lib/coro/thread.cpp
vendored
3
deps/oblib/src/lib/coro/thread.cpp
vendored
@ -229,6 +229,9 @@ void* Thread::__th_start(void* arg)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mem_context != nullptr && *mem_context != nullptr) {
|
||||
DESTROY_CONTEXT(*mem_context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user