diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index a43e08800..6a8d3100c 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -91,8 +91,8 @@ srs_error_t SrsServerAdapter::run() return srs_error_wrap(err, "ingest"); } - if ((err = srs->cycle()) != srs_success) { - return srs_error_wrap(err, "main cycle"); + if ((err = srs->start()) != srs_success) { + return srs_error_wrap(err, "start"); } return err; @@ -151,29 +151,17 @@ srs_error_t SrsHybridServer::run() { srs_error_t err = srs_success; - // TODO: FIXME: Identify master server directly. - // Run master server in this main thread. - SrsServerAdapter* master_server = NULL; - vector::iterator it; for (it = servers.begin(); it != servers.end(); ++it) { ISrsHybridServer* server = *it; - if (!master_server) { - master_server = dynamic_cast(server); - if (master_server) { - continue; - } - } - if ((err = server->run()) != srs_success) { return srs_error_wrap(err, "run server"); } } - if (master_server) { - return master_server->run(); - } + // Wait for all server to quit. + srs_thread_exit(NULL); return err; } diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index f2c2c314f..d3d520ba1 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -728,6 +728,7 @@ SrsServer::SrsServer() http_server = new SrsHttpServer(this); http_heartbeat = new SrsHttpHeartbeat(); ingester = new SrsIngester(); + trd_ = new SrsSTCoroutine("srs", this, _srs_context->get_id()); } SrsServer::~SrsServer() @@ -738,7 +739,9 @@ SrsServer::~SrsServer() void SrsServer::destroy() { srs_warn("start destroy server"); - + + srs_freep(trd_); + dispose(); srs_freep(http_api_mux); @@ -1101,6 +1104,17 @@ srs_error_t SrsServer::ingest() return err; } +srs_error_t SrsServer::start() +{ + srs_error_t err = srs_success; + + if ((err = trd_->start()) != srs_success) { + return srs_error_wrap(err, "start"); + } + + return err; +} + srs_error_t SrsServer::cycle() { srs_error_t err = srs_success; @@ -1249,6 +1263,10 @@ srs_error_t SrsServer::do_cycle() int dynamic_max = srs_max(max, heartbeat_max_resolution); for (int i = 0; i < dynamic_max; i++) { + if ((err = trd_->pull()) != srs_success) { + return srs_error_wrap(err, "pull"); + } + srs_usleep(SRS_SYS_CYCLE_INTERVAL); // asprocess check. diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 60a69d517..ea83417fc 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -260,7 +260,8 @@ public: // TODO: FIXME: Rename to SrsLiveServer. // SRS RTMP server, initialize and listen, start connection service thread, destroy client. -class SrsServer : virtual public ISrsReloadHandler, virtual public ISrsSourceHandler, virtual public ISrsResourceManager +class SrsServer : virtual public ISrsReloadHandler, virtual public ISrsSourceHandler + , virtual public ISrsResourceManager, virtual public ISrsCoroutineHandler { private: // TODO: FIXME: Extract an HttpApiServer. @@ -269,6 +270,7 @@ private: SrsHttpHeartbeat* http_heartbeat; SrsIngester* ingester; SrsResourceManager* conn_manager; + SrsCoroutine* trd_; private: // The pid file fd, lock the file write when server is running. // @remark the init.d script should cleanup the pid file, when stop service, @@ -315,6 +317,9 @@ public: virtual srs_error_t register_signal(); virtual srs_error_t http_handle(); virtual srs_error_t ingest(); + virtual srs_error_t start(); +// interface ISrsCoroutineHandler +public: virtual srs_error_t cycle(); // server utilities. public: diff --git a/trunk/src/protocol/srs_service_st.cpp b/trunk/src/protocol/srs_service_st.cpp index 0e2c4f586..99cf856af 100644 --- a/trunk/src/protocol/srs_service_st.cpp +++ b/trunk/src/protocol/srs_service_st.cpp @@ -151,6 +151,11 @@ srs_thread_t srs_thread_self() return (srs_thread_t)st_thread_self(); } +void srs_thread_exit(void* retval) +{ + st_thread_exit(retval); +} + srs_error_t srs_tcp_connect(string server, int port, srs_utime_t tm, srs_netfd_t* pstfd) { st_utime_t timeout = ST_UTIME_NO_TIMEOUT; diff --git a/trunk/src/protocol/srs_service_st.hpp b/trunk/src/protocol/srs_service_st.hpp index ed86737d6..263bb5104 100644 --- a/trunk/src/protocol/srs_service_st.hpp +++ b/trunk/src/protocol/srs_service_st.hpp @@ -57,6 +57,7 @@ extern srs_error_t srs_fd_keepalive(int fd); // Get current coroutine/thread. extern srs_thread_t srs_thread_self(); +extern void srs_thread_exit(void* retval); // For client, to open socket and connect to server. // @param tm The timeout in srs_utime_t.