From a5a96491a37cdb19c3d96e5ee747743a3c1b3011 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 22:03:00 +0800 Subject: [PATCH] For #2194, yield for timer, for live publisher --- trunk/src/app/srs_app_recv_thread.cpp | 10 +++++++++- trunk/src/app/srs_app_recv_thread.hpp | 1 + trunk/src/app/srs_app_rtmp_conn.cpp | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index bc063da26..5887b3710 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -288,7 +288,8 @@ SrsPublishRecvThread::SrsPublishRecvThread(SrsRtmpServer* rtmp_sdk, SrsRequest* _conn = conn; _source = source; - + + nn_msgs_for_yield_ = 0; recv_error = srs_success; _nb_msgs = 0; video_frames = 0; @@ -401,6 +402,13 @@ srs_error_t SrsPublishRecvThread::consume(SrsCommonMessage* msg) if (err != srs_success) { return srs_error_wrap(err, "handle publish message"); } + + // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777463768 + if (++nn_msgs_for_yield_ >= 15) { + nn_msgs_for_yield_ = 0; + srs_thread_yield(); + } return err; } diff --git a/trunk/src/app/srs_app_recv_thread.hpp b/trunk/src/app/srs_app_recv_thread.hpp index c61cf33ed..13e55fe79 100644 --- a/trunk/src/app/srs_app_recv_thread.hpp +++ b/trunk/src/app/srs_app_recv_thread.hpp @@ -144,6 +144,7 @@ class SrsPublishRecvThread : virtual public ISrsMessagePumper, virtual public IS #endif { private: + uint32_t nn_msgs_for_yield_; SrsRecvThread trd; SrsRtmpServer* rtmp; SrsRequest* req; diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 06e86d3c3..2acec6814 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -828,6 +828,7 @@ srs_error_t SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, Sr } // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777437476 srs_thread_yield(); }