diff --git a/trunk/configure b/trunk/configure index 24fe192c96..9358f7339c 100755 --- a/trunk/configure +++ b/trunk/configure @@ -464,7 +464,7 @@ if [[ $SRS_UTEST == YES ]]; then MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_kernel" "srs_utest_core" "srs_utest_config" "srs_utest_rtmp" "srs_utest_http" "srs_utest_avc" "srs_utest_reload" "srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_rtc" "srs_utest_config2" - "srs_utest_protocol" "srs_utest_protocol2" "srs_utest_kernel2") + "srs_utest_protocol" "srs_utest_protocol2" "srs_utest_kernel2" "srs_utest_thread_pool") if [[ $SRS_SRT == YES ]]; then MODULE_FILES+=("srs_utest_srt") fi diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index b42a163be1..19cc2ffbb7 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -36,7 +36,12 @@ using namespace std; #include #include -#if defined(SRS_OSX) || defined(SRS_CYGWIN64) +#if defined(SRS_OSX) + pid_t gettid() { + uint64_t tid; + return pthread_threadid_np(NULL, &tid) ? 0 : tid; + } +#elif defined(SRS_CYGWIN64) pid_t gettid() { return 0; } @@ -550,6 +555,12 @@ SrsThreadPool::~SrsThreadPool() ::close(pid_fd); pid_fd = -1; } + + while(!threads_.empty()) { + SrsThreadEntry* entry = threads_.back(); + srs_freep(entry); + threads_.pop_back(); + } } // Setup the thread-local variables, MUST call when each thread starting. @@ -799,6 +810,7 @@ void* SrsThreadPool::start(void* arg) entry->err = srs_error_new(ERROR_THREAD_FINISHED, "finished normally"); } + srs_st_destroy(); // We do not use the return value, the err has been set to entry->err. return NULL; } diff --git a/trunk/src/utest/srs_utest_thread_pool.cpp b/trunk/src/utest/srs_utest_thread_pool.cpp new file mode 100644 index 0000000000..318441dc4e --- /dev/null +++ b/trunk/src/utest/srs_utest_thread_pool.cpp @@ -0,0 +1,58 @@ +// +// Copyright (c) 2013-2024 The SRS Authors +// +// SPDX-License-Identifier: MIT +// +#include +#include + +static srs_error_t dummy_loop(void*) { + return srs_success; +} + +#ifndef SRS_CYGWIN64 + +VOID TEST(ThreadPoolTest, tid) { +#if 0 + srs_error_t err; + SrsThreadPool* thread_pool_1 = new SrsThreadPool(); + SrsThreadPool* thread_pool_2 = new SrsThreadPool(); + + EXPECT_TRUE((err = thread_pool_1->initialize()) == srs_success); + srs_freep(err); + + EXPECT_TRUE((err = thread_pool_2->initialize()) == srs_success); + srs_freep(err); + + EXPECT_TRUE((err = thread_pool_1->execute("hybrid", dummy_loop, (void*)NULL)) == srs_success); + srs_freep(err); + + EXPECT_TRUE((err = thread_pool_2->execute("hybrid", dummy_loop, (void*)NULL)) == srs_success); + srs_freep(err); + + err = thread_pool_1->run(); + srs_freep(err); + err = thread_pool_2->run(); + srs_freep(err); + + EXPECT_GT(thread_pool_1->hybrid()->tid, 0); + EXPECT_GT(thread_pool_2->hybrid()->tid, 0); + + EXPECT_NE(thread_pool_1->hybrid()->tid, thread_pool_2->hybrid()->tid); + + srs_freep(thread_pool_1); + srs_freep(thread_pool_2); +#endif + + srs_error_t err; + EXPECT_TRUE((err = _srs_thread_pool->initialize()) == srs_success); + srs_freep(err); + + //EXPECT_TRUE((err = _srs_thread_pool->execute("hybrid", dummy_loop, (void*)NULL)) == srs_success); + //srs_freep(err); + + //err = _srs_thread_pool->run(); + srs_freep(err); +} + +#endif diff --git a/trunk/src/utest/srs_utest_thread_pool.hpp b/trunk/src/utest/srs_utest_thread_pool.hpp new file mode 100644 index 0000000000..81ea5a34d6 --- /dev/null +++ b/trunk/src/utest/srs_utest_thread_pool.hpp @@ -0,0 +1,15 @@ +// +// Copyright (c) 2013-2024 The SRS Authors +// +// SPDX-License-Identifier: MIT +// + +#ifndef SRS_UTEST_THREAD_POOL +#define SRS_UTEST_THREAD_POOL + +#include + +#include + +#endif // SRS_UTEST_THREAD_POOL +