正在显示
5 个修改的文件
包含
49 行增加
和
11 行删除
| @@ -403,6 +403,10 @@ int SrsFFMPEG::start() | @@ -403,6 +403,10 @@ int SrsFFMPEG::start() | ||
| 403 | 403 | ||
| 404 | // child process: ffmpeg encoder engine. | 404 | // child process: ffmpeg encoder engine. |
| 405 | if (pid == 0) { | 405 | if (pid == 0) { |
| 406 | + // ignore the SIGINT and SIGTERM | ||
| 407 | + signal(SIGINT, SIG_IGN); | ||
| 408 | + signal(SIGTERM, SIG_IGN); | ||
| 409 | + | ||
| 406 | // redirect logs to file. | 410 | // redirect logs to file. |
| 407 | int log_fd = -1; | 411 | int log_fd = -1; |
| 408 | int flags = O_CREAT|O_WRONLY|O_APPEND; | 412 | int flags = O_CREAT|O_WRONLY|O_APPEND; |
| @@ -159,6 +159,11 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest | @@ -159,6 +159,11 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest | ||
| 159 | return ret; | 159 | return ret; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | +void SrsIngester::dispose() | ||
| 163 | +{ | ||
| 164 | + stop(); | ||
| 165 | +} | ||
| 166 | + | ||
| 162 | void SrsIngester::stop() | 167 | void SrsIngester::stop() |
| 163 | { | 168 | { |
| 164 | pthread->stop(); | 169 | pthread->stop(); |
| @@ -70,6 +70,8 @@ public: | @@ -70,6 +70,8 @@ public: | ||
| 70 | SrsIngester(); | 70 | SrsIngester(); |
| 71 | virtual ~SrsIngester(); | 71 | virtual ~SrsIngester(); |
| 72 | public: | 72 | public: |
| 73 | + virtual void dispose(); | ||
| 74 | +public: | ||
| 73 | virtual int start(); | 75 | virtual int start(); |
| 74 | virtual void stop(); | 76 | virtual void stop(); |
| 75 | // interface ISrsReusableThreadHandler. | 77 | // interface ISrsReusableThreadHandler. |
| @@ -480,6 +480,7 @@ SrsServer::SrsServer() | @@ -480,6 +480,7 @@ SrsServer::SrsServer() | ||
| 480 | { | 480 | { |
| 481 | signal_reload = false; | 481 | signal_reload = false; |
| 482 | signal_gmc_stop = false; | 482 | signal_gmc_stop = false; |
| 483 | + signal_gracefully_quit = false; | ||
| 483 | pid_fd = -1; | 484 | pid_fd = -1; |
| 484 | 485 | ||
| 485 | signal_manager = NULL; | 486 | signal_manager = NULL; |
| @@ -519,7 +520,7 @@ void SrsServer::destroy() | @@ -519,7 +520,7 @@ void SrsServer::destroy() | ||
| 519 | close_listeners(SrsListenerHttpStream); | 520 | close_listeners(SrsListenerHttpStream); |
| 520 | 521 | ||
| 521 | #ifdef SRS_AUTO_INGEST | 522 | #ifdef SRS_AUTO_INGEST |
| 522 | - ingester->stop(); | 523 | + ingester->dispose(); |
| 523 | #endif | 524 | #endif |
| 524 | 525 | ||
| 525 | #ifdef SRS_AUTO_HTTP_API | 526 | #ifdef SRS_AUTO_HTTP_API |
| @@ -555,6 +556,18 @@ void SrsServer::destroy() | @@ -555,6 +556,18 @@ void SrsServer::destroy() | ||
| 555 | // and segment fault. | 556 | // and segment fault. |
| 556 | } | 557 | } |
| 557 | 558 | ||
| 559 | +void SrsServer::dispose() | ||
| 560 | +{ | ||
| 561 | + _srs_config->unsubscribe(this); | ||
| 562 | + | ||
| 563 | +#ifdef SRS_AUTO_INGEST | ||
| 564 | + ingester->dispose(); | ||
| 565 | + srs_trace("gracefully cleanup ingesters"); | ||
| 566 | +#endif | ||
| 567 | + | ||
| 568 | + srs_trace("terminate server"); | ||
| 569 | +} | ||
| 570 | + | ||
| 558 | int SrsServer::initialize(ISrsServerCycle* cycle_handler) | 571 | int SrsServer::initialize(ISrsServerCycle* cycle_handler) |
| 559 | { | 572 | { |
| 560 | int ret = ERROR_SUCCESS; | 573 | int ret = ERROR_SUCCESS; |
| @@ -831,6 +844,7 @@ int SrsServer::cycle() | @@ -831,6 +844,7 @@ int SrsServer::cycle() | ||
| 831 | srs_warn("system quit"); | 844 | srs_warn("system quit"); |
| 832 | #else | 845 | #else |
| 833 | srs_warn("main cycle terminated, system quit normally."); | 846 | srs_warn("main cycle terminated, system quit normally."); |
| 847 | + dispose(); | ||
| 834 | exit(0); | 848 | exit(0); |
| 835 | #endif | 849 | #endif |
| 836 | 850 | ||
| @@ -877,9 +891,9 @@ void SrsServer::on_signal(int signo) | @@ -877,9 +891,9 @@ void SrsServer::on_signal(int signo) | ||
| 877 | return; | 891 | return; |
| 878 | } | 892 | } |
| 879 | 893 | ||
| 880 | - if (signo == SIGTERM) { | ||
| 881 | - srs_trace("user terminate program"); | ||
| 882 | - exit(0); | 894 | + if (signo == SIGTERM && !signal_gracefully_quit) { |
| 895 | + srs_trace("user terminate program, gracefully quit."); | ||
| 896 | + signal_gracefully_quit = true; | ||
| 883 | return; | 897 | return; |
| 884 | } | 898 | } |
| 885 | } | 899 | } |
| @@ -903,7 +917,7 @@ int SrsServer::do_cycle() | @@ -903,7 +917,7 @@ int SrsServer::do_cycle() | ||
| 903 | 917 | ||
| 904 | // the deamon thread, update the time cache | 918 | // the deamon thread, update the time cache |
| 905 | while (true) { | 919 | while (true) { |
| 906 | - if(handler && (ret = handler->on_cycle(conns.size())) != ERROR_SUCCESS){ | 920 | + if(handler && (ret = handler->on_cycle((int)conns.size())) != ERROR_SUCCESS){ |
| 907 | srs_error("cycle handle failed. ret=%d", ret); | 921 | srs_error("cycle handle failed. ret=%d", ret); |
| 908 | return ret; | 922 | return ret; |
| 909 | } | 923 | } |
| @@ -917,12 +931,18 @@ int SrsServer::do_cycle() | @@ -917,12 +931,18 @@ int SrsServer::do_cycle() | ||
| 917 | 931 | ||
| 918 | for (int i = 0; i < temp_max; i++) { | 932 | for (int i = 0; i < temp_max; i++) { |
| 919 | st_usleep(SRS_SYS_CYCLE_INTERVAL * 1000); | 933 | st_usleep(SRS_SYS_CYCLE_INTERVAL * 1000); |
| 934 | + | ||
| 935 | + // gracefully quit for SIGINT or SIGTERM. | ||
| 936 | + if (signal_gracefully_quit) { | ||
| 937 | + srs_trace("cleanup for gracefully terminate."); | ||
| 938 | + return ret; | ||
| 939 | + } | ||
| 920 | 940 | ||
| 921 | -// for gperf heap checker, | ||
| 922 | -// @see: research/gperftools/heap-checker/heap_checker.cc | ||
| 923 | -// if user interrupt the program, exit to check mem leak. | ||
| 924 | -// but, if gperf, use reload to ensure main return normally, | ||
| 925 | -// because directly exit will cause core-dump. | 941 | + // for gperf heap checker, |
| 942 | + // @see: research/gperftools/heap-checker/heap_checker.cc | ||
| 943 | + // if user interrupt the program, exit to check mem leak. | ||
| 944 | + // but, if gperf, use reload to ensure main return normally, | ||
| 945 | + // because directly exit will cause core-dump. | ||
| 926 | #ifdef SRS_AUTO_GPERF_MC | 946 | #ifdef SRS_AUTO_GPERF_MC |
| 927 | if (signal_gmc_stop) { | 947 | if (signal_gmc_stop) { |
| 928 | srs_warn("gmc got singal to stop server."); | 948 | srs_warn("gmc got singal to stop server."); |
| @@ -930,6 +950,7 @@ int SrsServer::do_cycle() | @@ -930,6 +950,7 @@ int SrsServer::do_cycle() | ||
| 930 | } | 950 | } |
| 931 | #endif | 951 | #endif |
| 932 | 952 | ||
| 953 | + // do reload the config. | ||
| 933 | if (signal_reload) { | 954 | if (signal_reload) { |
| 934 | signal_reload = false; | 955 | signal_reload = false; |
| 935 | srs_info("get signal reload, to reload the config."); | 956 | srs_info("get signal reload, to reload the config."); |
| @@ -275,16 +275,22 @@ private: | @@ -275,16 +275,22 @@ private: | ||
| 275 | */ | 275 | */ |
| 276 | bool signal_reload; | 276 | bool signal_reload; |
| 277 | bool signal_gmc_stop; | 277 | bool signal_gmc_stop; |
| 278 | + bool signal_gracefully_quit; | ||
| 278 | public: | 279 | public: |
| 279 | SrsServer(); | 280 | SrsServer(); |
| 280 | virtual ~SrsServer(); | 281 | virtual ~SrsServer(); |
| 281 | -public: | 282 | +private: |
| 282 | /** | 283 | /** |
| 283 | * the destroy is for gmc to analysis the memory leak, | 284 | * the destroy is for gmc to analysis the memory leak, |
| 284 | * if not destroy global/static data, the gmc will warning memory leak. | 285 | * if not destroy global/static data, the gmc will warning memory leak. |
| 285 | * in service, server never destroy, directly exit when restart. | 286 | * in service, server never destroy, directly exit when restart. |
| 286 | */ | 287 | */ |
| 287 | virtual void destroy(); | 288 | virtual void destroy(); |
| 289 | + /** | ||
| 290 | + * when SIGTERM, SRS should do cleanup, for example, | ||
| 291 | + * to stop all ingesters, cleanup HLS and dvr. | ||
| 292 | + */ | ||
| 293 | + virtual void dispose(); | ||
| 288 | // server startup workflow, @see run_master() | 294 | // server startup workflow, @see run_master() |
| 289 | public: | 295 | public: |
| 290 | virtual int initialize(ISrsServerCycle* cycle_handler); | 296 | virtual int initialize(ISrsServerCycle* cycle_handler); |
-
请 注册 或 登录 后发表评论