From 1f1776a0d8aa4f4d03ea6ca631a1dcf390ababf8 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 9 Jun 2015 14:38:05 +0800 Subject: [PATCH] fix the export project bug. wakeup connection when dispose server. --- trunk/auto/generate-srs-librtmp-single.sh | 4 +-- trunk/src/app/srs_app_rtmp_conn.cpp | 13 +++++++++ trunk/src/app/srs_app_rtmp_conn.hpp | 5 ++++ trunk/src/app/srs_app_source.cpp | 26 +++++++++++------ trunk/src/app/srs_app_source.hpp | 34 ++++++++++++++++++----- 5 files changed, 65 insertions(+), 17 deletions(-) diff --git a/trunk/auto/generate-srs-librtmp-single.sh b/trunk/auto/generate-srs-librtmp-single.sh index ce03b8f33..390e438ca 100755 --- a/trunk/auto/generate-srs-librtmp-single.sh +++ b/trunk/auto/generate-srs-librtmp-single.sh @@ -80,7 +80,7 @@ function build_module_hpp() } SRS_LIBRTMP_OBJS="${CORE_OBJS[@]}" && build_module_hpp SRS_LIBRTMP_OBJS="${KERNEL_OBJS[@]}" && build_module_hpp -SRS_LIBRTMP_OBJS="${RTMP_OBJS[@]}" && build_module_hpp +SRS_LIBRTMP_OBJS="${PROTOCOL_OBJS[@]}" && build_module_hpp SRS_LIBRTMP_OBJS="${LIBS_OBJS[@]}" && build_module_hpp # module to cpp files. function build_module_cpp() @@ -99,7 +99,7 @@ function build_module_cpp() } SRS_LIBRTMP_OBJS="${CORE_OBJS[@]}" && build_module_cpp SRS_LIBRTMP_OBJS="${KERNEL_OBJS[@]}" && build_module_cpp -SRS_LIBRTMP_OBJS="${RTMP_OBJS[@]}" && build_module_cpp +SRS_LIBRTMP_OBJS="${PROTOCOL_OBJS[@]}" && build_module_cpp SRS_LIBRTMP_OBJS="${LIBS_OBJS[@]}" && build_module_cpp # create example.cpp diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index a72dcfc9e..b2c73307e 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -88,6 +88,7 @@ SrsRtmpConn::SrsRtmpConn(SrsServer* svr, st_netfd_t c) duration = 0; kbps = new SrsKbps(); kbps->set_io(skt, skt); + wakable = NULL; mw_sleep = SRS_PERF_MW_SLEEP; mw_enabled = false; @@ -110,6 +111,16 @@ SrsRtmpConn::~SrsRtmpConn() srs_freep(kbps); } +void SrsRtmpConn::dispose() +{ + SrsConnection::dispose(); + + // wakeup the handler which need to notice. + if (wakable) { + wakable->wakeup(); + } +} + // TODO: return detail message when error for client. int SrsRtmpConn::do_cycle() { @@ -597,7 +608,9 @@ int SrsRtmpConn::playing(SrsSource* source) } // delivery messages for clients playing stream. + wakable = consumer; ret = do_playing(source, consumer, &trd); + wakable = NULL; // stop isolate recv thread trd.stop(); diff --git a/trunk/src/app/srs_app_rtmp_conn.hpp b/trunk/src/app/srs_app_rtmp_conn.hpp index 39aad6e0e..96db60ac7 100644 --- a/trunk/src/app/srs_app_rtmp_conn.hpp +++ b/trunk/src/app/srs_app_rtmp_conn.hpp @@ -53,6 +53,7 @@ class SrsSharedPtrMessage; class SrsQueueRecvThread; class SrsPublishRecvThread; class SrsSecurity; +class ISrsWakable; /** * the client provides the main logic control for RTMP clients. @@ -70,6 +71,8 @@ private: SrsRefer* refer; SrsBandwidth* bandwidth; SrsSecurity* security; + // the wakable handler, maybe NULL. + ISrsWakable* wakable; // elapse duration in ms // for live play duration, for instance, rtmpdump to record. // @see https://github.com/simple-rtmp-server/srs/issues/47 @@ -85,6 +88,8 @@ private: public: SrsRtmpConn(SrsServer* svr, st_netfd_t c); virtual ~SrsRtmpConn(); +public: + virtual void dispose(); protected: virtual int do_cycle(); // interface ISrsReloadHandler diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 32b9cae39..caea50ec8 100755 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -423,6 +423,14 @@ void SrsMessageQueue::clear() av_start_time = av_end_time = -1; } +ISrsWakable::ISrsWakable() +{ +} + +ISrsWakable::~ISrsWakable() +{ +} + SrsConsumer::SrsConsumer(SrsSource* _source) { source = _source; @@ -551,14 +559,6 @@ void SrsConsumer::wait(int nb_msgs, int duration) // use cond block wait for high performance mode. st_cond_wait(mw_wait); } - -void SrsConsumer::wakeup() -{ - if (mw_waiting) { - st_cond_signal(mw_wait); - mw_waiting = false; - } -} #endif int SrsConsumer::on_play_client_pause(bool is_pause) @@ -571,6 +571,16 @@ int SrsConsumer::on_play_client_pause(bool is_pause) return ret; } +void SrsConsumer::wakeup() +{ +#ifdef SRS_PERF_QUEUE_COND_WAIT + if (mw_waiting) { + st_cond_signal(mw_wait); + mw_waiting = false; + } +#endif +} + SrsGopCache::SrsGopCache() { cached_video_count = 0; diff --git a/trunk/src/app/srs_app_source.hpp b/trunk/src/app/srs_app_source.hpp index 95eda44ea..b72caaa6a 100644 --- a/trunk/src/app/srs_app_source.hpp +++ b/trunk/src/app/srs_app_source.hpp @@ -196,10 +196,28 @@ private: virtual void clear(); }; +/** + * the wakable used for some object + * which is waiting on cond. + */ +class ISrsWakable +{ +public: + ISrsWakable(); + virtual ~ISrsWakable(); +public: + /** + * when the consumer(for player) got msg from recv thread, + * it must be processed for maybe it's a close msg, so the cond + * wait must be wakeup. + */ + virtual void wakeup() = 0; +}; + /** * the consumer for SrsSource, that is a play client. */ -class SrsConsumer +class SrsConsumer : public ISrsWakable { private: SrsRtmpJitter* jitter; @@ -257,17 +275,19 @@ public: * @param duration the messgae duration to wait. */ virtual void wait(int nb_msgs, int duration); - /** - * when the consumer(for player) got msg from recv thread, - * it must be processed for maybe it's a close msg, so the cond - * wait must be wakeup. - */ - virtual void wakeup(); #endif /** * when client send the pause message. */ virtual int on_play_client_pause(bool is_pause); +// ISrsWakable +public: + /** + * when the consumer(for player) got msg from recv thread, + * it must be processed for maybe it's a close msg, so the cond + * wait must be wakeup. + */ + virtual void wakeup(); }; /**