mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Cleanup server for GMC, by WaitGroup to destroy. (#2247). v4.0.206
This commit is contained in:
parent
73c1392748
commit
63da0dca92
18 changed files with 114 additions and 42 deletions
|
@ -136,7 +136,7 @@ srs_error_t SrsServerAdapter::initialize()
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrsServerAdapter::run()
|
||||
srs_error_t SrsServerAdapter::run(SrsWaitGroup* wg)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
|
@ -173,7 +173,7 @@ srs_error_t SrsServerAdapter::run()
|
|||
return srs_error_wrap(err, "ingest");
|
||||
}
|
||||
|
||||
if ((err = srs->start()) != srs_success) {
|
||||
if ((err = srs->start(wg)) != srs_success) {
|
||||
return srs_error_wrap(err, "start");
|
||||
}
|
||||
|
||||
|
@ -182,6 +182,7 @@ srs_error_t SrsServerAdapter::run()
|
|||
|
||||
void SrsServerAdapter::stop()
|
||||
{
|
||||
srs->stop();
|
||||
}
|
||||
|
||||
SrsServer* SrsServerAdapter::instance()
|
||||
|
@ -264,17 +265,20 @@ srs_error_t SrsHybridServer::run()
|
|||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
// Wait for all servers which need to do cleanup.
|
||||
SrsWaitGroup wg;
|
||||
|
||||
vector<ISrsHybridServer*>::iterator it;
|
||||
for (it = servers.begin(); it != servers.end(); ++it) {
|
||||
ISrsHybridServer* server = *it;
|
||||
|
||||
if ((err = server->run()) != srs_success) {
|
||||
if ((err = server->run(&wg)) != srs_success) {
|
||||
return srs_error_wrap(err, "run server");
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for all server to quit.
|
||||
srs_usleep(SRS_UTIME_NO_TIMEOUT);
|
||||
wg.wait();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <srs_app_hourglass.hpp>
|
||||
|
||||
class SrsServer;
|
||||
class SrsWaitGroup;
|
||||
|
||||
// The hibrid server interfaces, we could register many servers.
|
||||
class ISrsHybridServer
|
||||
|
@ -25,7 +26,7 @@ public:
|
|||
// Only ST initialized before each server, we could fork processes as such.
|
||||
virtual srs_error_t initialize() = 0;
|
||||
// Run each server, should never block except the SRS master server.
|
||||
virtual srs_error_t run() = 0;
|
||||
virtual srs_error_t run(SrsWaitGroup* wg) = 0;
|
||||
// Stop each server, should do cleanup, for example, kill processes forked by server.
|
||||
virtual void stop() = 0;
|
||||
};
|
||||
|
@ -40,7 +41,7 @@ public:
|
|||
virtual ~SrsServerAdapter();
|
||||
public:
|
||||
virtual srs_error_t initialize();
|
||||
virtual srs_error_t run();
|
||||
virtual srs_error_t run(SrsWaitGroup* wg);
|
||||
virtual void stop();
|
||||
public:
|
||||
virtual SrsServer* instance();
|
||||
|
|
|
@ -295,11 +295,11 @@ void SrsRtcServer::set_handler(ISrsRtcServerHandler* h)
|
|||
void SrsRtcServer::set_hijacker(ISrsRtcServerHijacker* h)
|
||||
{
|
||||
hijacker = h;
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcServer::exec_async_work(ISrsAsyncCallTask * t)
|
||||
{
|
||||
return async->execute(t);
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcServer::exec_async_work(ISrsAsyncCallTask * t)
|
||||
{
|
||||
return async->execute(t);
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcServer::listen_udp()
|
||||
|
@ -698,7 +698,7 @@ srs_error_t RtcServerAdapter::initialize()
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t RtcServerAdapter::run()
|
||||
srs_error_t RtcServerAdapter::run(SrsWaitGroup* wg)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ class SrsRequest;
|
|||
class SrsSdp;
|
||||
class SrsRtcSource;
|
||||
class SrsResourceManager;
|
||||
class SrsWaitGroup;
|
||||
|
||||
// The UDP black hole, for developer to use wireshark to catch plaintext packets.
|
||||
// For example, server receive UDP packets at udp://8000, and forward the plaintext packet to black hole,
|
||||
|
@ -137,7 +138,7 @@ public:
|
|||
virtual ~RtcServerAdapter();
|
||||
public:
|
||||
virtual srs_error_t initialize();
|
||||
virtual srs_error_t run();
|
||||
virtual srs_error_t run(SrsWaitGroup* wg);
|
||||
virtual void stop();
|
||||
};
|
||||
|
||||
|
|
|
@ -242,6 +242,8 @@ SrsSignalManager::SrsSignalManager(SrsServer* s)
|
|||
|
||||
SrsSignalManager::~SrsSignalManager()
|
||||
{
|
||||
srs_freep(trd);
|
||||
|
||||
srs_close_stfd(signal_read_stfd);
|
||||
|
||||
if (sig_pipe[0] > 0) {
|
||||
|
@ -250,8 +252,6 @@ SrsSignalManager::~SrsSignalManager()
|
|||
if (sig_pipe[1] > 0) {
|
||||
::close(sig_pipe[1]);
|
||||
}
|
||||
|
||||
srs_freep(trd);
|
||||
}
|
||||
|
||||
srs_error_t SrsSignalManager::initialize()
|
||||
|
@ -528,6 +528,7 @@ SrsServer::SrsServer()
|
|||
ingester = new SrsIngester();
|
||||
trd_ = new SrsSTCoroutine("srs", this, _srs_context->get_id());
|
||||
timer_ = NULL;
|
||||
wg_ = NULL;
|
||||
}
|
||||
|
||||
SrsServer::~SrsServer()
|
||||
|
@ -890,7 +891,7 @@ srs_error_t SrsServer::ingest()
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrsServer::start()
|
||||
srs_error_t SrsServer::start(SrsWaitGroup* wg)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
|
@ -906,31 +907,25 @@ srs_error_t SrsServer::start()
|
|||
return srs_error_wrap(err, "tick");
|
||||
}
|
||||
|
||||
// OK, we start SRS server.
|
||||
wg_ = wg;
|
||||
wg->add(1);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrsServer::cycle()
|
||||
void SrsServer::stop()
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
// Start the inotify auto reload by watching config file.
|
||||
SrsInotifyWorker inotify(this);
|
||||
if ((err = inotify.start()) != srs_success) {
|
||||
return srs_error_wrap(err, "start inotify");
|
||||
}
|
||||
|
||||
// Do server main cycle.
|
||||
err = do_cycle();
|
||||
|
||||
#ifdef SRS_GPERF_MC
|
||||
destroy();
|
||||
|
||||
|
||||
// remark, for gmc, never invoke the exit().
|
||||
srs_warn("sleep a long time for system st-threads to cleanup.");
|
||||
srs_usleep(3 * 1000 * 1000);
|
||||
srs_warn("system quit");
|
||||
|
||||
return err;
|
||||
// For GCM, cleanup done.
|
||||
return;
|
||||
#endif
|
||||
|
||||
// quit normally.
|
||||
|
@ -949,12 +944,27 @@ srs_error_t SrsServer::cycle()
|
|||
}
|
||||
|
||||
srs_trace("srs terminated");
|
||||
|
||||
|
||||
// for valgrind to detect.
|
||||
srs_freep(_srs_config);
|
||||
srs_freep(_srs_log);
|
||||
}
|
||||
|
||||
exit(0);
|
||||
srs_error_t SrsServer::cycle()
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
// Start the inotify auto reload by watching config file.
|
||||
SrsInotifyWorker inotify(this);
|
||||
if ((err = inotify.start()) != srs_success) {
|
||||
return srs_error_wrap(err, "start inotify");
|
||||
}
|
||||
|
||||
// Do server main cycle.
|
||||
err = do_cycle();
|
||||
|
||||
// OK, SRS server is done.
|
||||
wg_->done();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ class SrsTcpListener;
|
|||
class SrsAppCasterFlv;
|
||||
class SrsResourceManager;
|
||||
class SrsLatestVersion;
|
||||
class SrsWaitGroup;
|
||||
|
||||
// The listener type for server to identify the connection,
|
||||
// that is, use different type to process the connection.
|
||||
|
@ -204,6 +205,7 @@ private:
|
|||
SrsResourceManager* conn_manager;
|
||||
SrsCoroutine* trd_;
|
||||
SrsHourGlass* timer_;
|
||||
SrsWaitGroup* wg_;
|
||||
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,
|
||||
|
@ -252,7 +254,9 @@ public:
|
|||
virtual srs_error_t register_signal();
|
||||
virtual srs_error_t http_handle();
|
||||
virtual srs_error_t ingest();
|
||||
virtual srs_error_t start();
|
||||
public:
|
||||
virtual srs_error_t start(SrsWaitGroup* wg);
|
||||
void stop();
|
||||
// interface ISrsCoroutineHandler
|
||||
public:
|
||||
virtual srs_error_t cycle();
|
||||
|
|
|
@ -297,3 +297,35 @@ void* SrsFastCoroutine::pfn(void* arg)
|
|||
return (void*)err;
|
||||
}
|
||||
|
||||
SrsWaitGroup::SrsWaitGroup()
|
||||
{
|
||||
nn_ = 0;
|
||||
done_ = srs_cond_new();
|
||||
}
|
||||
|
||||
SrsWaitGroup::~SrsWaitGroup()
|
||||
{
|
||||
wait();
|
||||
srs_cond_destroy(done_);
|
||||
}
|
||||
|
||||
void SrsWaitGroup::add(int n)
|
||||
{
|
||||
nn_ += n;
|
||||
}
|
||||
|
||||
void SrsWaitGroup::done()
|
||||
{
|
||||
nn_--;
|
||||
if (nn_ <= 0) {
|
||||
srs_cond_signal(done_);
|
||||
}
|
||||
}
|
||||
|
||||
void SrsWaitGroup::wait()
|
||||
{
|
||||
if (nn_ > 0) {
|
||||
srs_cond_wait(done_);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -189,5 +189,23 @@ private:
|
|||
static void* pfn(void* arg);
|
||||
};
|
||||
|
||||
// Like goroytine sync.WaitGroup.
|
||||
class SrsWaitGroup
|
||||
{
|
||||
private:
|
||||
int nn_;
|
||||
srs_cond_t done_;
|
||||
public:
|
||||
SrsWaitGroup();
|
||||
virtual ~SrsWaitGroup();
|
||||
public:
|
||||
// When start for n coroutines.
|
||||
void add(int n);
|
||||
// When coroutine is done.
|
||||
void done();
|
||||
// Wait for all corotine to be done.
|
||||
void wait();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -9,6 +9,6 @@
|
|||
|
||||
#define VERSION_MAJOR 4
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_REVISION 211
|
||||
#define VERSION_REVISION 212
|
||||
|
||||
#endif
|
||||
|
|
|
@ -323,7 +323,7 @@ srs_error_t SrtServerAdapter::initialize()
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrtServerAdapter::run()
|
||||
srs_error_t SrtServerAdapter::run(SrsWaitGroup* wg)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <srs_app_hybrid.hpp>
|
||||
|
||||
class srt_handle;
|
||||
class SrsWaitGroup;
|
||||
|
||||
class srt_server {
|
||||
public:
|
||||
|
@ -59,7 +60,7 @@ public:
|
|||
virtual ~SrtServerAdapter();
|
||||
public:
|
||||
virtual srs_error_t initialize();
|
||||
virtual srs_error_t run();
|
||||
virtual srs_error_t run(SrsWaitGroup* wg);
|
||||
virtual void stop();
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue