From e8f7c913b07fa87f34bca679c24224169d0f6ad9 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 May 2021 10:16:40 +0800 Subject: [PATCH 1/5] Refine global or thread-local variables initialize. 4.0.104 --- README.md | 1 + trunk/src/app/srs_app_hybrid.cpp | 25 +++++++++---------------- trunk/src/app/srs_app_threads.cpp | 20 +++++++++++++++++--- trunk/src/app/srs_app_threads.hpp | 3 +++ trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/main/srs_main_server.cpp | 5 +++++ 6 files changed, 36 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 9bbbfc2cd..5de795541 100755 --- a/README.md +++ b/README.md @@ -176,6 +176,7 @@ The ports used by SRS: ## V4 changes +* v4.0, 2021-05-08, Refine global or thread-local variables initialize. 4.0.104 * v4.0, 2021-05-07, RTC: Support circuit breaker. 4.0.103 * v4.0, 2021-05-07, RTC: Refine play stream find track. 4.0.102 * v4.0, 2021-05-07, RTC: Refine FastTimer to fixed interval. 4.0.101 diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index e398b0222..9e0079a75 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -208,10 +208,11 @@ SrsServer* SrsServerAdapter::instance() SrsHybridServer::SrsHybridServer() { - // Note that the timer depends on other global variables, - // so we MUST never create it in constructor. - timer20ms_ = NULL; - timer5s_ = NULL; + // Create global shared timer. + timer20ms_ = new SrsFastTimer("hybrid", 20 * SRS_UTIME_MILLISECONDS); + timer100ms_ = new SrsFastTimer("hybrid", 100 * SRS_UTIME_MILLISECONDS); + timer1s_ = new SrsFastTimer("hybrid", 1 * SRS_UTIME_SECONDS); + timer5s_ = new SrsFastTimer("hybrid", 5 * SRS_UTIME_SECONDS); clock_monitor_ = new SrsClockWallMonitor(); } @@ -219,7 +220,10 @@ SrsHybridServer::SrsHybridServer() SrsHybridServer::~SrsHybridServer() { srs_freep(clock_monitor_); + srs_freep(timer20ms_); + srs_freep(timer100ms_); + srs_freep(timer1s_); srs_freep(timer5s_); vector::iterator it; @@ -239,17 +243,6 @@ srs_error_t SrsHybridServer::initialize() { srs_error_t err = srs_success; - // init st - if ((err = srs_st_init()) != srs_success) { - return srs_error_wrap(err, "initialize st failed"); - } - - // Create global shared timer. - timer20ms_ = new SrsFastTimer("hybrid", 20 * SRS_UTIME_MILLISECONDS); - timer100ms_ = new SrsFastTimer("hybrid", 100 * SRS_UTIME_MILLISECONDS); - timer1s_ = new SrsFastTimer("hybrid", 1 * SRS_UTIME_SECONDS); - timer5s_ = new SrsFastTimer("hybrid", 5 * SRS_UTIME_SECONDS); - // Start the timer first. if ((err = timer20ms_->start()) != srs_success) { return srs_error_wrap(err, "start timer"); @@ -478,5 +471,5 @@ srs_error_t SrsHybridServer::on_timer(srs_utime_t interval) return err; } -SrsHybridServer* _srs_hybrid = new SrsHybridServer(); +SrsHybridServer* _srs_hybrid = NULL; diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index 77ee3d1b7..c81a07b52 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -83,12 +83,12 @@ srs_error_t SrsCircuitBreaker::initialize() bool SrsCircuitBreaker::hybrid_high_water_level() { - return enabled_ && hybrid_critical_water_level() || hybrid_high_water_level_; + return enabled_ && (hybrid_critical_water_level() || hybrid_high_water_level_); } bool SrsCircuitBreaker::hybrid_critical_water_level() { - return enabled_ && hybrid_dying_water_level() || hybrid_critical_water_level_; + return enabled_ && (hybrid_dying_water_level() || hybrid_critical_water_level_); } bool SrsCircuitBreaker::hybrid_dying_water_level() @@ -133,7 +133,7 @@ srs_error_t SrsCircuitBreaker::on_timer(srs_utime_t interval) // The hybrid thread cpu and memory. float thread_percent = stat->percent * 100; - if (enabled_ && hybrid_high_water_level() || hybrid_critical_water_level() || _srs_pps_snack2->r10s()) { + if (enabled_ && (hybrid_high_water_level() || hybrid_critical_water_level() || _srs_pps_snack2->r10s())) { srs_trace("CircuitBreaker: cpu=%.2f%%,%dMB, break=%d,%d,%d, cond=%.2f%%, snk=%d,%d,%d", u->percent * 100, memory, hybrid_high_water_level(), hybrid_critical_water_level(), hybrid_dying_water_level(), // Whether Circuit-Break is enable. @@ -147,3 +147,17 @@ srs_error_t SrsCircuitBreaker::on_timer(srs_utime_t interval) SrsCircuitBreaker* _srs_circuit_breaker = new SrsCircuitBreaker(); +srs_error_t srs_thread_initialize() +{ + srs_error_t err = srs_success; + + // init st + if ((err = srs_st_init()) != srs_success) { + return srs_error_wrap(err, "initialize st failed"); + } + + _srs_hybrid = new SrsHybridServer(); + + return err; +} + diff --git a/trunk/src/app/srs_app_threads.hpp b/trunk/src/app/srs_app_threads.hpp index 7e293b6fb..57fe7cbfb 100644 --- a/trunk/src/app/srs_app_threads.hpp +++ b/trunk/src/app/srs_app_threads.hpp @@ -63,5 +63,8 @@ private: extern SrsCircuitBreaker* _srs_circuit_breaker; +// Initialize global or thread-local variables. +extern srs_error_t srs_thread_initialize(); + #endif diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 7d3af0f74..56062eeec 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -26,6 +26,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 103 +#define VERSION_REVISION 104 #endif diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index fd0fe5804..727c41b45 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -87,6 +87,11 @@ SrsServer* _srs_server = NULL; srs_error_t do_main(int argc, char** argv) { srs_error_t err = srs_success; + + // Initialize global or thread-local variables. + if ((err = srs_thread_initialize()) != srs_success) { + return srs_error_wrap(err, "thread init"); + } // TODO: support both little and big endian. srs_assert(srs_is_little_endian()); From b6f27458221cc15630b493e4edb8cfe3f08ecacb Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 May 2021 10:25:04 +0800 Subject: [PATCH 2/5] Refine init of global variables --- trunk/src/kernel/srs_kernel_kbps.hpp | 3 ++- trunk/src/utest/srs_utest.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_kbps.hpp b/trunk/src/kernel/srs_kernel_kbps.hpp index 7b90ce171..c10d8317e 100644 --- a/trunk/src/kernel/srs_kernel_kbps.hpp +++ b/trunk/src/kernel/srs_kernel_kbps.hpp @@ -63,9 +63,10 @@ public: public: SrsPps(); virtual ~SrsPps(); -public: +private: // Setup the clock, use global clock if not set. void set_clock(SrsWallClock* clk); +public: // Update with the nn which is target. void update(); // Update with the nn. diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 4110aa609..92e8f72b3 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #include using namespace std; @@ -54,7 +55,7 @@ bool _srs_in_docker = false; srs_error_t prepare_main() { srs_error_t err = srs_success; - if ((err = srs_st_init()) != srs_success) { + if ((err = srs_thread_initialize()) != srs_success) { return srs_error_wrap(err, "init st"); } From b1e85664a1a6d7a3c729cfd2ad44e439fed7518e Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 May 2021 11:11:13 +0800 Subject: [PATCH 3/5] Refine init of global SrsPps --- trunk/src/app/srs_app_conn.cpp | 8 +- trunk/src/app/srs_app_hourglass.cpp | 2 +- trunk/src/app/srs_app_hybrid.cpp | 80 ++++----- trunk/src/app/srs_app_listener.cpp | 8 +- trunk/src/app/srs_app_rtc_conn.cpp | 16 +- trunk/src/app/srs_app_rtc_server.cpp | 6 +- trunk/src/app/srs_app_rtc_source.cpp | 20 +-- trunk/src/app/srs_app_threads.cpp | 218 +++++++++++++++++++++++- trunk/src/kernel/srs_kernel_flv.cpp | 2 +- trunk/src/kernel/srs_kernel_kbps.cpp | 14 +- trunk/src/kernel/srs_kernel_kbps.hpp | 3 - trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 12 +- trunk/src/main/srs_main_server.cpp | 11 +- trunk/src/protocol/srs_service_log.cpp | 4 +- 14 files changed, 304 insertions(+), 100 deletions(-) diff --git a/trunk/src/app/srs_app_conn.cpp b/trunk/src/app/srs_app_conn.cpp index 42534c023..875f85564 100644 --- a/trunk/src/app/srs_app_conn.cpp +++ b/trunk/src/app/srs_app_conn.cpp @@ -38,10 +38,10 @@ using namespace std; #include -SrsPps* _srs_pps_ids = new SrsPps(); -SrsPps* _srs_pps_fids = new SrsPps(); -SrsPps* _srs_pps_fids_level0 = new SrsPps(); -SrsPps* _srs_pps_dispose = new SrsPps(); +SrsPps* _srs_pps_ids = NULL; +SrsPps* _srs_pps_fids = NULL; +SrsPps* _srs_pps_fids_level0 = NULL; +SrsPps* _srs_pps_dispose = NULL; ISrsDisposingHandler::ISrsDisposingHandler() { diff --git a/trunk/src/app/srs_app_hourglass.cpp b/trunk/src/app/srs_app_hourglass.cpp index 9f5467dcd..feb4024e0 100644 --- a/trunk/src/app/srs_app_hourglass.cpp +++ b/trunk/src/app/srs_app_hourglass.cpp @@ -32,7 +32,7 @@ using namespace std; #include -SrsPps* _srs_pps_timer = new SrsPps(); +SrsPps* _srs_pps_timer = NULL; extern SrsPps* _srs_pps_clock_15ms; extern SrsPps* _srs_pps_clock_20ms; diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 9e0079a75..511263d78 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -44,10 +44,10 @@ extern unsigned long long _st_stat_recvfrom; extern unsigned long long _st_stat_recvfrom_eagain; extern unsigned long long _st_stat_sendto; extern unsigned long long _st_stat_sendto_eagain; -SrsPps* _srs_pps_recvfrom = new SrsPps(); -SrsPps* _srs_pps_recvfrom_eagain = new SrsPps(); -SrsPps* _srs_pps_sendto = new SrsPps(); -SrsPps* _srs_pps_sendto_eagain = new SrsPps(); +SrsPps* _srs_pps_recvfrom = NULL; +SrsPps* _srs_pps_recvfrom_eagain = NULL; +SrsPps* _srs_pps_sendto = NULL; +SrsPps* _srs_pps_sendto_eagain = NULL; extern unsigned long long _st_stat_read; extern unsigned long long _st_stat_read_eagain; @@ -55,30 +55,30 @@ extern unsigned long long _st_stat_readv; extern unsigned long long _st_stat_readv_eagain; extern unsigned long long _st_stat_writev; extern unsigned long long _st_stat_writev_eagain; -SrsPps* _srs_pps_read = new SrsPps(); -SrsPps* _srs_pps_read_eagain = new SrsPps(); -SrsPps* _srs_pps_readv = new SrsPps(); -SrsPps* _srs_pps_readv_eagain = new SrsPps(); -SrsPps* _srs_pps_writev = new SrsPps(); -SrsPps* _srs_pps_writev_eagain = new SrsPps(); +SrsPps* _srs_pps_read = NULL; +SrsPps* _srs_pps_read_eagain = NULL; +SrsPps* _srs_pps_readv = NULL; +SrsPps* _srs_pps_readv_eagain = NULL; +SrsPps* _srs_pps_writev = NULL; +SrsPps* _srs_pps_writev_eagain = NULL; extern unsigned long long _st_stat_recvmsg; extern unsigned long long _st_stat_recvmsg_eagain; extern unsigned long long _st_stat_sendmsg; extern unsigned long long _st_stat_sendmsg_eagain; -SrsPps* _srs_pps_recvmsg = new SrsPps(); -SrsPps* _srs_pps_recvmsg_eagain = new SrsPps(); -SrsPps* _srs_pps_sendmsg = new SrsPps(); -SrsPps* _srs_pps_sendmsg_eagain = new SrsPps(); +SrsPps* _srs_pps_recvmsg = NULL; +SrsPps* _srs_pps_recvmsg_eagain = NULL; +SrsPps* _srs_pps_sendmsg = NULL; +SrsPps* _srs_pps_sendmsg_eagain = NULL; extern unsigned long long _st_stat_epoll; extern unsigned long long _st_stat_epoll_zero; extern unsigned long long _st_stat_epoll_shake; extern unsigned long long _st_stat_epoll_spin; -SrsPps* _srs_pps_epoll = new SrsPps(); -SrsPps* _srs_pps_epoll_zero = new SrsPps(); -SrsPps* _srs_pps_epoll_shake = new SrsPps(); -SrsPps* _srs_pps_epoll_spin = new SrsPps(); +SrsPps* _srs_pps_epoll = NULL; +SrsPps* _srs_pps_epoll_zero = NULL; +SrsPps* _srs_pps_epoll_shake = NULL; +SrsPps* _srs_pps_epoll_spin = NULL; extern unsigned long long _st_stat_sched_15ms; extern unsigned long long _st_stat_sched_20ms; @@ -89,26 +89,26 @@ extern unsigned long long _st_stat_sched_40ms; extern unsigned long long _st_stat_sched_80ms; extern unsigned long long _st_stat_sched_160ms; extern unsigned long long _st_stat_sched_s; -SrsPps* _srs_pps_sched_15ms = new SrsPps(); -SrsPps* _srs_pps_sched_20ms = new SrsPps(); -SrsPps* _srs_pps_sched_25ms = new SrsPps(); -SrsPps* _srs_pps_sched_30ms = new SrsPps(); -SrsPps* _srs_pps_sched_35ms = new SrsPps(); -SrsPps* _srs_pps_sched_40ms = new SrsPps(); -SrsPps* _srs_pps_sched_80ms = new SrsPps(); -SrsPps* _srs_pps_sched_160ms = new SrsPps(); -SrsPps* _srs_pps_sched_s = new SrsPps(); +SrsPps* _srs_pps_sched_15ms = NULL; +SrsPps* _srs_pps_sched_20ms = NULL; +SrsPps* _srs_pps_sched_25ms = NULL; +SrsPps* _srs_pps_sched_30ms = NULL; +SrsPps* _srs_pps_sched_35ms = NULL; +SrsPps* _srs_pps_sched_40ms = NULL; +SrsPps* _srs_pps_sched_80ms = NULL; +SrsPps* _srs_pps_sched_160ms = NULL; +SrsPps* _srs_pps_sched_s = NULL; #endif -SrsPps* _srs_pps_clock_15ms = new SrsPps(); -SrsPps* _srs_pps_clock_20ms = new SrsPps(); -SrsPps* _srs_pps_clock_25ms = new SrsPps(); -SrsPps* _srs_pps_clock_30ms = new SrsPps(); -SrsPps* _srs_pps_clock_35ms = new SrsPps(); -SrsPps* _srs_pps_clock_40ms = new SrsPps(); -SrsPps* _srs_pps_clock_80ms = new SrsPps(); -SrsPps* _srs_pps_clock_160ms = new SrsPps(); -SrsPps* _srs_pps_timer_s = new SrsPps(); +SrsPps* _srs_pps_clock_15ms = NULL; +SrsPps* _srs_pps_clock_20ms = NULL; +SrsPps* _srs_pps_clock_25ms = NULL; +SrsPps* _srs_pps_clock_30ms = NULL; +SrsPps* _srs_pps_clock_35ms = NULL; +SrsPps* _srs_pps_clock_40ms = NULL; +SrsPps* _srs_pps_clock_80ms = NULL; +SrsPps* _srs_pps_clock_160ms = NULL; +SrsPps* _srs_pps_timer_s = NULL; #if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) extern int _st_active_count; @@ -116,10 +116,10 @@ extern unsigned long long _st_stat_thread_run; extern unsigned long long _st_stat_thread_idle; extern unsigned long long _st_stat_thread_yield; extern unsigned long long _st_stat_thread_yield2; -SrsPps* _srs_pps_thread_run = new SrsPps(); -SrsPps* _srs_pps_thread_idle = new SrsPps(); -SrsPps* _srs_pps_thread_yield = new SrsPps(); -SrsPps* _srs_pps_thread_yield2 = new SrsPps(); +SrsPps* _srs_pps_thread_run = NULL; +SrsPps* _srs_pps_thread_idle = NULL; +SrsPps* _srs_pps_thread_yield = NULL; +SrsPps* _srs_pps_thread_yield2 = NULL; #endif extern SrsPps* _srs_pps_objs_rtps; diff --git a/trunk/src/app/srs_app_listener.cpp b/trunk/src/app/srs_app_listener.cpp index 0037a6d9c..9e7e4b692 100755 --- a/trunk/src/app/srs_app_listener.cpp +++ b/trunk/src/app/srs_app_listener.cpp @@ -45,11 +45,11 @@ using namespace std; #include -SrsPps* _srs_pps_rpkts = new SrsPps(); -SrsPps* _srs_pps_addrs = new SrsPps(); -SrsPps* _srs_pps_fast_addrs = new SrsPps(); +SrsPps* _srs_pps_rpkts = NULL; +SrsPps* _srs_pps_addrs = NULL; +SrsPps* _srs_pps_fast_addrs = NULL; -SrsPps* _srs_pps_spkts = new SrsPps(); +SrsPps* _srs_pps_spkts = NULL; // set the max packet size. #define SRS_UDP_MAX_PACKET_SIZE 65535 diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index b336e21cb..f6801a77f 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -61,15 +61,15 @@ using namespace std; #include -SrsPps* _srs_pps_sstuns = new SrsPps(); -SrsPps* _srs_pps_srtcps = new SrsPps(); -SrsPps* _srs_pps_srtps = new SrsPps(); +SrsPps* _srs_pps_sstuns = NULL; +SrsPps* _srs_pps_srtcps = NULL; +SrsPps* _srs_pps_srtps = NULL; -SrsPps* _srs_pps_pli = new SrsPps(); -SrsPps* _srs_pps_twcc = new SrsPps(); -SrsPps* _srs_pps_rr = new SrsPps(); -SrsPps* _srs_pps_pub = new SrsPps(); -SrsPps* _srs_pps_conn = new SrsPps(); +SrsPps* _srs_pps_pli = NULL; +SrsPps* _srs_pps_twcc = NULL; +SrsPps* _srs_pps_rr = NULL; +SrsPps* _srs_pps_pub = NULL; +SrsPps* _srs_pps_conn = NULL; extern SrsPps* _srs_pps_snack; extern SrsPps* _srs_pps_snack2; diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index 2e9bc9f65..335bfe722 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -46,9 +46,9 @@ using namespace std; #include extern SrsPps* _srs_pps_rpkts; -SrsPps* _srs_pps_rstuns = new SrsPps(); -SrsPps* _srs_pps_rrtps = new SrsPps(); -SrsPps* _srs_pps_rrtcps = new SrsPps(); +SrsPps* _srs_pps_rstuns = NULL; +SrsPps* _srs_pps_rrtps = NULL; +SrsPps* _srs_pps_rrtcps = NULL; extern SrsPps* _srs_pps_addrs; extern SrsPps* _srs_pps_fast_addrs; diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index c696cb0da..a2ff017c4 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -52,17 +52,17 @@ #include // The NACK sent by us(SFU). -SrsPps* _srs_pps_snack = new SrsPps(); -SrsPps* _srs_pps_snack2 = new SrsPps(); -SrsPps* _srs_pps_snack3 = new SrsPps(); -SrsPps* _srs_pps_snack4 = new SrsPps(); -SrsPps* _srs_pps_sanack = new SrsPps(); -SrsPps* _srs_pps_svnack = new SrsPps(); +SrsPps* _srs_pps_snack = NULL; +SrsPps* _srs_pps_snack2 = NULL; +SrsPps* _srs_pps_snack3 = NULL; +SrsPps* _srs_pps_snack4 = NULL; +SrsPps* _srs_pps_sanack = NULL; +SrsPps* _srs_pps_svnack = NULL; -SrsPps* _srs_pps_rnack = new SrsPps(); -SrsPps* _srs_pps_rnack2 = new SrsPps(); -SrsPps* _srs_pps_rhnack = new SrsPps(); -SrsPps* _srs_pps_rmnack = new SrsPps(); +SrsPps* _srs_pps_rnack = NULL; +SrsPps* _srs_pps_rnack2 = NULL; +SrsPps* _srs_pps_rhnack = NULL; +SrsPps* _srs_pps_rmnack = NULL; extern SrsPps* _srs_pps_aloss2; diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index c81a07b52..fabaff593 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -37,7 +37,111 @@ extern SrsPps* _srs_pps_snack2; extern SrsPps* _srs_pps_snack3; extern SrsPps* _srs_pps_snack4; -SrsPps* _srs_pps_aloss2 = new SrsPps(); +SrsPps* _srs_pps_aloss2 = NULL; + +extern SrsPps* _srs_pps_ids; +extern SrsPps* _srs_pps_fids; +extern SrsPps* _srs_pps_fids_level0; +extern SrsPps* _srs_pps_dispose; + +extern SrsPps* _srs_pps_timer; + +extern SrsPps* _srs_pps_snack; +extern SrsPps* _srs_pps_snack2; +extern SrsPps* _srs_pps_snack3; +extern SrsPps* _srs_pps_snack4; +extern SrsPps* _srs_pps_sanack; +extern SrsPps* _srs_pps_svnack; + +extern SrsPps* _srs_pps_rnack; +extern SrsPps* _srs_pps_rnack2; +extern SrsPps* _srs_pps_rhnack; +extern SrsPps* _srs_pps_rmnack; + +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) +extern SrsPps* _srs_pps_recvfrom; +extern SrsPps* _srs_pps_recvfrom_eagain; +extern SrsPps* _srs_pps_sendto; +extern SrsPps* _srs_pps_sendto_eagain; + +extern SrsPps* _srs_pps_read; +extern SrsPps* _srs_pps_read_eagain; +extern SrsPps* _srs_pps_readv; +extern SrsPps* _srs_pps_readv_eagain; +extern SrsPps* _srs_pps_writev; +extern SrsPps* _srs_pps_writev_eagain; + +extern SrsPps* _srs_pps_recvmsg; +extern SrsPps* _srs_pps_recvmsg_eagain; +extern SrsPps* _srs_pps_sendmsg; +extern SrsPps* _srs_pps_sendmsg_eagain; + +extern SrsPps* _srs_pps_epoll; +extern SrsPps* _srs_pps_epoll_zero; +extern SrsPps* _srs_pps_epoll_shake; +extern SrsPps* _srs_pps_epoll_spin; + +extern SrsPps* _srs_pps_sched_15ms; +extern SrsPps* _srs_pps_sched_20ms; +extern SrsPps* _srs_pps_sched_25ms; +extern SrsPps* _srs_pps_sched_30ms; +extern SrsPps* _srs_pps_sched_35ms; +extern SrsPps* _srs_pps_sched_40ms; +extern SrsPps* _srs_pps_sched_80ms; +extern SrsPps* _srs_pps_sched_160ms; +extern SrsPps* _srs_pps_sched_s; +#endif + +extern SrsPps* _srs_pps_clock_15ms; +extern SrsPps* _srs_pps_clock_20ms; +extern SrsPps* _srs_pps_clock_25ms; +extern SrsPps* _srs_pps_clock_30ms; +extern SrsPps* _srs_pps_clock_35ms; +extern SrsPps* _srs_pps_clock_40ms; +extern SrsPps* _srs_pps_clock_80ms; +extern SrsPps* _srs_pps_clock_160ms; +extern SrsPps* _srs_pps_timer_s; + +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) +extern SrsPps* _srs_pps_thread_run; +extern SrsPps* _srs_pps_thread_idle; +extern SrsPps* _srs_pps_thread_yield; +extern SrsPps* _srs_pps_thread_yield2; +#endif + +extern SrsPps* _srs_pps_rpkts; +extern SrsPps* _srs_pps_addrs; +extern SrsPps* _srs_pps_fast_addrs; + +extern SrsPps* _srs_pps_spkts; + +extern SrsPps* _srs_pps_sstuns; +extern SrsPps* _srs_pps_srtcps; +extern SrsPps* _srs_pps_srtps; + +extern SrsPps* _srs_pps_pli; +extern SrsPps* _srs_pps_twcc; +extern SrsPps* _srs_pps_rr; +extern SrsPps* _srs_pps_pub; +extern SrsPps* _srs_pps_conn; + +extern SrsPps* _srs_pps_rstuns; +extern SrsPps* _srs_pps_rrtps; +extern SrsPps* _srs_pps_rrtcps; + +extern SrsPps* _srs_pps_aloss2; + +extern SrsPps* _srs_pps_cids_get; +extern SrsPps* _srs_pps_cids_set; + +extern SrsPps* _srs_pps_objs_msgs; + +extern SrsPps* _srs_pps_objs_rtps; +extern SrsPps* _srs_pps_objs_rraw; +extern SrsPps* _srs_pps_objs_rfua; +extern SrsPps* _srs_pps_objs_rbuf; +extern SrsPps* _srs_pps_objs_rothers; +extern SrsPps* _srs_pps_objs_drop; SrsCircuitBreaker::SrsCircuitBreaker() { @@ -151,13 +255,123 @@ srs_error_t srs_thread_initialize() { srs_error_t err = srs_success; - // init st + // The clock wall object. + _srs_clock = new SrsWallClock(); + + // The pps cids depends by st init. + _srs_pps_cids_get = new SrsPps(); + _srs_pps_cids_set = new SrsPps(); + + // Initialize ST, which depends on pps cids. if ((err = srs_st_init()) != srs_success) { return srs_error_wrap(err, "initialize st failed"); } + // The global hybrid server. _srs_hybrid = new SrsHybridServer(); + // Initialize global pps, which depends on _srs_clock + _srs_pps_ids = new SrsPps(); + _srs_pps_fids = new SrsPps(); + _srs_pps_fids_level0 = new SrsPps(); + _srs_pps_dispose = new SrsPps(); + + _srs_pps_timer = new SrsPps(); + + _srs_pps_snack = new SrsPps(); + _srs_pps_snack2 = new SrsPps(); + _srs_pps_snack3 = new SrsPps(); + _srs_pps_snack4 = new SrsPps(); + _srs_pps_sanack = new SrsPps(); + _srs_pps_svnack = new SrsPps(); + + _srs_pps_rnack = new SrsPps(); + _srs_pps_rnack2 = new SrsPps(); + _srs_pps_rhnack = new SrsPps(); + _srs_pps_rmnack = new SrsPps(); + +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) + _srs_pps_recvfrom = new SrsPps(); + _srs_pps_recvfrom_eagain = new SrsPps(); + _srs_pps_sendto = new SrsPps(); + _srs_pps_sendto_eagain = new SrsPps(); + + _srs_pps_read = new SrsPps(); + _srs_pps_read_eagain = new SrsPps(); + _srs_pps_readv = new SrsPps(); + _srs_pps_readv_eagain = new SrsPps(); + _srs_pps_writev = new SrsPps(); + _srs_pps_writev_eagain = new SrsPps(); + + _srs_pps_recvmsg = new SrsPps(); + _srs_pps_recvmsg_eagain = new SrsPps(); + _srs_pps_sendmsg = new SrsPps(); + _srs_pps_sendmsg_eagain = new SrsPps(); + + _srs_pps_epoll = new SrsPps(); + _srs_pps_epoll_zero = new SrsPps(); + _srs_pps_epoll_shake = new SrsPps(); + _srs_pps_epoll_spin = new SrsPps(); + + _srs_pps_sched_15ms = new SrsPps(); + _srs_pps_sched_20ms = new SrsPps(); + _srs_pps_sched_25ms = new SrsPps(); + _srs_pps_sched_30ms = new SrsPps(); + _srs_pps_sched_35ms = new SrsPps(); + _srs_pps_sched_40ms = new SrsPps(); + _srs_pps_sched_80ms = new SrsPps(); + _srs_pps_sched_160ms = new SrsPps(); + _srs_pps_sched_s = new SrsPps(); +#endif + + _srs_pps_clock_15ms = new SrsPps(); + _srs_pps_clock_20ms = new SrsPps(); + _srs_pps_clock_25ms = new SrsPps(); + _srs_pps_clock_30ms = new SrsPps(); + _srs_pps_clock_35ms = new SrsPps(); + _srs_pps_clock_40ms = new SrsPps(); + _srs_pps_clock_80ms = new SrsPps(); + _srs_pps_clock_160ms = new SrsPps(); + _srs_pps_timer_s = new SrsPps(); + +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) + _srs_pps_thread_run = new SrsPps(); + _srs_pps_thread_idle = new SrsPps(); + _srs_pps_thread_yield = new SrsPps(); + _srs_pps_thread_yield2 = new SrsPps(); +#endif + + _srs_pps_rpkts = new SrsPps(); + _srs_pps_addrs = new SrsPps(); + _srs_pps_fast_addrs = new SrsPps(); + + _srs_pps_spkts = new SrsPps(); + + _srs_pps_sstuns = new SrsPps(); + _srs_pps_srtcps = new SrsPps(); + _srs_pps_srtps = new SrsPps(); + + _srs_pps_pli = new SrsPps(); + _srs_pps_twcc = new SrsPps(); + _srs_pps_rr = new SrsPps(); + _srs_pps_pub = new SrsPps(); + _srs_pps_conn = new SrsPps(); + + _srs_pps_rstuns = new SrsPps(); + _srs_pps_rrtps = new SrsPps(); + _srs_pps_rrtcps = new SrsPps(); + + _srs_pps_aloss2 = new SrsPps(); + + _srs_pps_objs_msgs = new SrsPps(); + + _srs_pps_objs_rtps = new SrsPps(); + _srs_pps_objs_rraw = new SrsPps(); + _srs_pps_objs_rfua = new SrsPps(); + _srs_pps_objs_rbuf = new SrsPps(); + _srs_pps_objs_rothers = new SrsPps(); + _srs_pps_objs_drop = new SrsPps(); + return err; } diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index d66816a79..0a34c0034 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -43,7 +43,7 @@ using namespace std; #include -SrsPps* _srs_pps_objs_msgs = new SrsPps(); +SrsPps* _srs_pps_objs_msgs = NULL; SrsMessageHeader::SrsMessageHeader() { diff --git a/trunk/src/kernel/srs_kernel_kbps.cpp b/trunk/src/kernel/srs_kernel_kbps.cpp index fbaf2074a..fb82c96bb 100644 --- a/trunk/src/kernel/srs_kernel_kbps.cpp +++ b/trunk/src/kernel/srs_kernel_kbps.cpp @@ -61,7 +61,7 @@ void srs_pps_update(SrsRateSample& sample, int64_t nn, srs_utime_t now) SrsPps::SrsPps() { - clk_ = NULL; + clk_ = _srs_clock; sugar = 0; } @@ -69,11 +69,6 @@ SrsPps::~SrsPps() { } -void SrsPps::set_clock(SrsWallClock* clk) -{ - clk_ = clk; -} - void SrsPps::update() { update(sugar); @@ -81,10 +76,7 @@ void SrsPps::update() void SrsPps::update(int64_t nn) { - // Lazy setup the clock. - if (!clk_) { - clk_ = _srs_clock; - } + srs_assert(clk_); srs_utime_t now = clk_->now(); @@ -129,5 +121,5 @@ srs_utime_t SrsWallClock::now() return srs_get_system_time(); } -SrsWallClock* _srs_clock = new SrsWallClock(); +SrsWallClock* _srs_clock = NULL; diff --git a/trunk/src/kernel/srs_kernel_kbps.hpp b/trunk/src/kernel/srs_kernel_kbps.hpp index c10d8317e..db97f965b 100644 --- a/trunk/src/kernel/srs_kernel_kbps.hpp +++ b/trunk/src/kernel/srs_kernel_kbps.hpp @@ -63,9 +63,6 @@ public: public: SrsPps(); virtual ~SrsPps(); -private: - // Setup the clock, use global clock if not set. - void set_clock(SrsWallClock* clk); public: // Update with the nn which is target. void update(); diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 5474d9106..ef5b840fb 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -36,12 +36,12 @@ using namespace std; #include -SrsPps* _srs_pps_objs_rtps = new SrsPps(); -SrsPps* _srs_pps_objs_rraw = new SrsPps(); -SrsPps* _srs_pps_objs_rfua = new SrsPps(); -SrsPps* _srs_pps_objs_rbuf = new SrsPps(); -SrsPps* _srs_pps_objs_rothers = new SrsPps(); -SrsPps* _srs_pps_objs_drop = new SrsPps(); +SrsPps* _srs_pps_objs_rtps = NULL; +SrsPps* _srs_pps_objs_rraw = NULL; +SrsPps* _srs_pps_objs_rfua = NULL; +SrsPps* _srs_pps_objs_rbuf = NULL; +SrsPps* _srs_pps_objs_rothers = NULL; +SrsPps* _srs_pps_objs_drop = NULL; /* @see https://tools.ietf.org/html/rfc1889#section-5.1 0 1 2 3 diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 727c41b45..e719a3684 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -92,7 +92,10 @@ srs_error_t do_main(int argc, char** argv) if ((err = srs_thread_initialize()) != srs_success) { return srs_error_wrap(err, "thread init"); } - + + // For background context id. + _srs_context->set_id(_srs_context->generate_id()); + // TODO: support both little and big endian. srs_assert(srs_is_little_endian()); @@ -220,10 +223,8 @@ srs_error_t do_main(int argc, char** argv) return err; } -int main(int argc, char** argv) { - // For background context id. - _srs_context->set_id(_srs_context->generate_id()); - +int main(int argc, char** argv) +{ srs_error_t err = do_main(argc, argv); if (err != srs_success) { diff --git a/trunk/src/protocol/srs_service_log.cpp b/trunk/src/protocol/srs_service_log.cpp index 4c30d9450..6f6b416a3 100644 --- a/trunk/src/protocol/srs_service_log.cpp +++ b/trunk/src/protocol/srs_service_log.cpp @@ -35,8 +35,8 @@ using namespace std; #include -SrsPps* _srs_pps_cids_get = new SrsPps(); -SrsPps* _srs_pps_cids_set = new SrsPps(); +SrsPps* _srs_pps_cids_get = NULL; +SrsPps* _srs_pps_cids_set = NULL; #define SRS_BASIC_LOG_SIZE 8192 From 8b58d18a5a7a01887efdad85d9fa08e6c88e9a2f Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 May 2021 11:25:48 +0800 Subject: [PATCH 4/5] Refine init of global objects --- trunk/src/app/srs_app_pithy_print.cpp | 2 +- trunk/src/app/srs_app_rtc_server.cpp | 6 ++-- trunk/src/app/srs_app_rtc_source.cpp | 9 ++---- trunk/src/app/srs_app_source.cpp | 15 +++------- trunk/src/app/srs_app_threads.cpp | 40 +++++++++++++++++++++++-- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 10 +++---- 6 files changed, 53 insertions(+), 29 deletions(-) diff --git a/trunk/src/app/srs_app_pithy_print.cpp b/trunk/src/app/srs_app_pithy_print.cpp index 40c1a9b4b..75bd95be5 100644 --- a/trunk/src/app/srs_app_pithy_print.cpp +++ b/trunk/src/app/srs_app_pithy_print.cpp @@ -166,7 +166,7 @@ bool SrsErrorPithyPrint::can_print(int error_code, uint32_t* pnn) } // The global stage manager for pithy print, multiple stages. -static SrsStageManager* _srs_stages = new SrsStageManager(); +SrsStageManager* _srs_stages = NULL; SrsPithyPrint::SrsPithyPrint(int _stage_id) { diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index 335bfe722..c71e94b8f 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -132,10 +132,10 @@ void SrsRtcBlackhole::sendto(void* data, int len) srs_sendto(blackhole_stfd, data, len, (sockaddr*)blackhole_addr, sizeof(sockaddr_in), SRS_UTIME_NO_TIMEOUT); } -SrsRtcBlackhole* _srs_blackhole = new SrsRtcBlackhole(); +SrsRtcBlackhole* _srs_blackhole = NULL; // @global dtls certficate for rtc module. -SrsDtlsCertificate* _srs_rtc_dtls_certificate = new SrsDtlsCertificate(); +SrsDtlsCertificate* _srs_rtc_dtls_certificate = NULL; // TODO: Should support error response. // For STUN packet, 0x00 is binding request, 0x01 is binding success response. @@ -777,5 +777,5 @@ void RtcServerAdapter::stop() { } -SrsResourceManager* _srs_rtc_manager = new SrsResourceManager("RTC", true); +SrsResourceManager* _srs_rtc_manager = NULL; diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index a2ff017c4..de2be5499 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -249,7 +249,7 @@ void SrsRtcConsumer::on_stream_change(SrsRtcStreamDescription* desc) SrsRtcStreamManager::SrsRtcStreamManager() { - lock = NULL; + lock = srs_mutex_new(); } SrsRtcStreamManager::~SrsRtcStreamManager() @@ -261,11 +261,6 @@ srs_error_t SrsRtcStreamManager::fetch_or_create(SrsRequest* r, SrsRtcStream** p { srs_error_t err = srs_success; - // Lazy create lock, because ST is not ready in SrsRtcStreamManager constructor. - if (!lock) { - lock = srs_mutex_new(); - } - // Use lock to protect coroutine switch. // @bug https://github.com/ossrs/srs/issues/1230 SrsLocker(lock); @@ -315,7 +310,7 @@ SrsRtcStream* SrsRtcStreamManager::fetch(SrsRequest* r) return source; } -SrsRtcStreamManager* _srs_rtc_sources = new SrsRtcStreamManager(); +SrsRtcStreamManager* _srs_rtc_sources = NULL; ISrsRtcPublishStream::ISrsRtcPublishStream() { diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index ce09e6614..5f0ce3313 100755 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1684,17 +1684,18 @@ srs_error_t SrsMetaCache::update_vsh(SrsSharedPtrMessage* msg) return vformat->on_video(msg); } -SrsSourceManager* _srs_sources = new SrsSourceManager(); +SrsSourceManager* _srs_sources = NULL; SrsSourceManager::SrsSourceManager() { - lock = NULL; - timer_ = NULL; + lock = srs_mutex_new(); + timer_ = new SrsHourGlass("sources", this, 1 * SRS_UTIME_SECONDS); } SrsSourceManager::~SrsSourceManager() { srs_mutex_destroy(lock); + srs_freep(timer_); } srs_error_t SrsSourceManager::initialize() @@ -1706,11 +1707,6 @@ srs_error_t SrsSourceManager::fetch_or_create(SrsRequest* r, ISrsSourceHandler* { srs_error_t err = srs_success; - // Lazy create lock, because ST is not ready in SrsSourceManager constructor. - if (!lock) { - lock = srs_mutex_new(); - } - // Use lock to protect coroutine switch. // @bug https://github.com/ossrs/srs/issues/1230 // TODO: FIXME: Use smaller lock. @@ -1778,9 +1774,6 @@ srs_error_t SrsSourceManager::setup_ticks() { srs_error_t err = srs_success; - srs_freep(timer_); - timer_ = new SrsHourGlass("sources", this, 1 * SRS_UTIME_SECONDS); - if ((err = timer_->tick(1, 1 * SRS_UTIME_SECONDS)) != srs_success) { return srs_error_wrap(err, "tick"); } diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index fabaff593..014e7ecad 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -27,10 +27,30 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include using namespace std; +extern SrsStageManager* _srs_stages; +extern SrsRtcBlackhole* _srs_blackhole; +extern SrsResourceManager* _srs_rtc_manager; + +extern SrsRtpObjectCacheManager* _srs_rtp_cache; +extern SrsRtpObjectCacheManager* _srs_rtp_raw_cache; +extern SrsRtpObjectCacheManager* _srs_rtp_fua_cache; + +extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers; +extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs; + +extern SrsResourceManager* _srs_rtc_manager; +extern SrsDtlsCertificate* _srs_rtc_dtls_certificate; + #include extern SrsPps* _srs_pps_snack2; @@ -249,7 +269,7 @@ srs_error_t SrsCircuitBreaker::on_timer(srs_utime_t interval) return err; } -SrsCircuitBreaker* _srs_circuit_breaker = new SrsCircuitBreaker(); +SrsCircuitBreaker* _srs_circuit_breaker = NULL; srs_error_t srs_thread_initialize() { @@ -267,8 +287,24 @@ srs_error_t srs_thread_initialize() return srs_error_wrap(err, "initialize st failed"); } - // The global hybrid server. + // The global objects which depends on ST. _srs_hybrid = new SrsHybridServer(); + _srs_rtc_sources = new SrsRtcStreamManager(); + _srs_sources = new SrsSourceManager(); + _srs_stages = new SrsStageManager(); + _srs_blackhole = new SrsRtcBlackhole(); + _srs_rtc_manager = new SrsResourceManager("RTC", true); + _srs_circuit_breaker = new SrsCircuitBreaker(); + + _srs_rtp_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpPacket2)); + _srs_rtp_raw_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpRawPayload)); + _srs_rtp_fua_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpFUAPayload2)); + + _srs_rtp_msg_cache_buffers = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage) + kRtpPacketSize); + _srs_rtp_msg_cache_objs = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage)); + + _srs_rtc_manager = new SrsResourceManager("RTC", true); + _srs_rtc_dtls_certificate = new SrsDtlsCertificate(); // Initialize global pps, which depends on _srs_clock _srs_pps_ids = new SrsPps(); diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index ef5b840fb..bbe2c6f2c 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -1081,12 +1081,12 @@ bool SrsRtpPacket2::is_keyframe() return false; } -SrsRtpObjectCacheManager* _srs_rtp_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpPacket2)); -SrsRtpObjectCacheManager* _srs_rtp_raw_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpRawPayload)); -SrsRtpObjectCacheManager* _srs_rtp_fua_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpFUAPayload2)); +SrsRtpObjectCacheManager* _srs_rtp_cache = NULL; +SrsRtpObjectCacheManager* _srs_rtp_raw_cache = NULL; +SrsRtpObjectCacheManager* _srs_rtp_fua_cache = NULL; -SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage) + kRtpPacketSize); -SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage)); +SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers = NULL; +SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs = NULL; SrsRtpRawPayload::SrsRtpRawPayload() { From 4cf6da107ced252be1ff7b7b769b697a170fab0a Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 8 May 2021 11:29:19 +0800 Subject: [PATCH 5/5] Refine init of global objects --- trunk/src/app/srs_app_threads.cpp | 9 +++++++++ trunk/src/main/srs_main_server.cpp | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index 014e7ecad..898b711ef 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -37,6 +37,10 @@ #include using namespace std; +extern ISrsLog* _srs_log; +extern ISrsContext* _srs_context; +extern SrsConfig* _srs_config; + extern SrsStageManager* _srs_stages; extern SrsRtcBlackhole* _srs_blackhole; extern SrsResourceManager* _srs_rtc_manager; @@ -275,6 +279,11 @@ srs_error_t srs_thread_initialize() { srs_error_t err = srs_success; + // Root global objects. + _srs_log = new SrsFileLog(); + _srs_context = new SrsThreadContext(); + _srs_config = new SrsConfig(); + // The clock wall object. _srs_clock = new SrsWallClock(); diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index e719a3684..b9efd927f 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -70,10 +70,10 @@ srs_error_t run_hybrid_server(); void show_macro_features(); // @global log and context. -ISrsLog* _srs_log = new SrsFileLog(); -ISrsContext* _srs_context = new SrsThreadContext(); +ISrsLog* _srs_log = NULL; +ISrsContext* _srs_context = NULL; // @global config object for app module. -SrsConfig* _srs_config = new SrsConfig(); +SrsConfig* _srs_config = NULL; // @global version of srs, which can grep keyword "XCORE" extern const char* _srs_version;