正在显示
6 个修改的文件
包含
48 行增加
和
31 行删除
| @@ -40,6 +40,7 @@ SrsConnection::SrsConnection(IConnectionManager* cm, st_netfd_t c) | @@ -40,6 +40,7 @@ SrsConnection::SrsConnection(IConnectionManager* cm, st_netfd_t c) | ||
| 40 | id = 0; | 40 | id = 0; |
| 41 | manager = cm; | 41 | manager = cm; |
| 42 | stfd = c; | 42 | stfd = c; |
| 43 | + disposed = false; | ||
| 43 | 44 | ||
| 44 | // the client thread should reap itself, | 45 | // the client thread should reap itself, |
| 45 | // so we never use joinable. | 46 | // so we never use joinable. |
| @@ -50,12 +51,24 @@ SrsConnection::SrsConnection(IConnectionManager* cm, st_netfd_t c) | @@ -50,12 +51,24 @@ SrsConnection::SrsConnection(IConnectionManager* cm, st_netfd_t c) | ||
| 50 | 51 | ||
| 51 | SrsConnection::~SrsConnection() | 52 | SrsConnection::~SrsConnection() |
| 52 | { | 53 | { |
| 54 | + dispose(); | ||
| 55 | + | ||
| 56 | + srs_freep(pthread); | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +void SrsConnection::dispose() | ||
| 60 | +{ | ||
| 61 | + if (disposed) { | ||
| 62 | + return; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + disposed = true; | ||
| 66 | + | ||
| 53 | /** | 67 | /** |
| 54 | * when delete the connection, stop the connection, | 68 | * when delete the connection, stop the connection, |
| 55 | * close the underlayer socket, delete the thread. | 69 | * close the underlayer socket, delete the thread. |
| 56 | */ | 70 | */ |
| 57 | srs_close_stfd(stfd); | 71 | srs_close_stfd(stfd); |
| 58 | - srs_freep(pthread); | ||
| 59 | } | 72 | } |
| 60 | 73 | ||
| 61 | int SrsConnection::start() | 74 | int SrsConnection::start() |
| @@ -83,11 +83,20 @@ protected: | @@ -83,11 +83,20 @@ protected: | ||
| 83 | * the ip of client. | 83 | * the ip of client. |
| 84 | */ | 84 | */ |
| 85 | std::string ip; | 85 | std::string ip; |
| 86 | + /** | ||
| 87 | + * whether the connection is disposed, | ||
| 88 | + * when disposed, connection should stop cycle and cleanup itself. | ||
| 89 | + */; | ||
| 90 | + bool disposed; | ||
| 86 | public: | 91 | public: |
| 87 | SrsConnection(IConnectionManager* cm, st_netfd_t c); | 92 | SrsConnection(IConnectionManager* cm, st_netfd_t c); |
| 88 | virtual ~SrsConnection(); | 93 | virtual ~SrsConnection(); |
| 89 | public: | 94 | public: |
| 90 | /** | 95 | /** |
| 96 | + * to dipose the connection. | ||
| 97 | + */ | ||
| 98 | + virtual void dispose(); | ||
| 99 | + /** | ||
| 91 | * start the client green thread. | 100 | * start the client green thread. |
| 92 | * when server get a client from listener, | 101 | * when server get a client from listener, |
| 93 | * 1. server will create an concrete connection(for instance, RTMP connection), | 102 | * 1. server will create an concrete connection(for instance, RTMP connection), |
| @@ -529,7 +529,7 @@ int SrsHttpApi::do_cycle() | @@ -529,7 +529,7 @@ int SrsHttpApi::do_cycle() | ||
| 529 | skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US); | 529 | skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US); |
| 530 | 530 | ||
| 531 | // process http messages. | 531 | // process http messages. |
| 532 | - for (;;) { | 532 | + while(!disposed) { |
| 533 | ISrsHttpMessage* req = NULL; | 533 | ISrsHttpMessage* req = NULL; |
| 534 | 534 | ||
| 535 | // get a http message | 535 | // get a http message |
| @@ -2533,7 +2533,7 @@ int SrsHttpConn::do_cycle() | @@ -2533,7 +2533,7 @@ int SrsHttpConn::do_cycle() | ||
| 2533 | skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US); | 2533 | skt.set_recv_timeout(SRS_HTTP_RECV_TIMEOUT_US); |
| 2534 | 2534 | ||
| 2535 | // process http messages. | 2535 | // process http messages. |
| 2536 | - for (;;) { | 2536 | + while (!disposed) { |
| 2537 | ISrsHttpMessage* req = NULL; | 2537 | ISrsHttpMessage* req = NULL; |
| 2538 | 2538 | ||
| 2539 | // get a http message | 2539 | // get a http message |
| @@ -320,7 +320,7 @@ int SrsRtmpConn::service_cycle() | @@ -320,7 +320,7 @@ int SrsRtmpConn::service_cycle() | ||
| 320 | } | 320 | } |
| 321 | srs_verbose("on_bw_done success"); | 321 | srs_verbose("on_bw_done success"); |
| 322 | 322 | ||
| 323 | - while (true) { | 323 | + while (!disposed) { |
| 324 | ret = stream_service_cycle(); | 324 | ret = stream_service_cycle(); |
| 325 | 325 | ||
| 326 | // stream service must terminated with error, never success. | 326 | // stream service must terminated with error, never success. |
| @@ -361,6 +361,8 @@ int SrsRtmpConn::service_cycle() | @@ -361,6 +361,8 @@ int SrsRtmpConn::service_cycle() | ||
| 361 | srs_error("control message(%d) reject as error. ret=%d", ret, ret); | 361 | srs_error("control message(%d) reject as error. ret=%d", ret, ret); |
| 362 | return ret; | 362 | return ret; |
| 363 | } | 363 | } |
| 364 | + | ||
| 365 | + return ret; | ||
| 364 | } | 366 | } |
| 365 | 367 | ||
| 366 | int SrsRtmpConn::stream_service_cycle() | 368 | int SrsRtmpConn::stream_service_cycle() |
| @@ -635,7 +637,7 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe | @@ -635,7 +637,7 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe | ||
| 635 | // set the sock options. | 637 | // set the sock options. |
| 636 | play_set_sock_options(); | 638 | play_set_sock_options(); |
| 637 | 639 | ||
| 638 | - while (true) { | 640 | + while (!disposed) { |
| 639 | // collect elapse for pithy print. | 641 | // collect elapse for pithy print. |
| 640 | pprint->elapse(); | 642 | pprint->elapse(); |
| 641 | 643 | ||
| @@ -865,7 +867,7 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) | @@ -865,7 +867,7 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) | ||
| 865 | } | 867 | } |
| 866 | 868 | ||
| 867 | int64_t nb_msgs = 0; | 869 | int64_t nb_msgs = 0; |
| 868 | - while (true) { | 870 | + while (!disposed) { |
| 869 | pprint->elapse(); | 871 | pprint->elapse(); |
| 870 | 872 | ||
| 871 | // cond wait for error. | 873 | // cond wait for error. |
| @@ -514,17 +514,7 @@ void SrsServer::destroy() | @@ -514,17 +514,7 @@ void SrsServer::destroy() | ||
| 514 | { | 514 | { |
| 515 | srs_warn("start destroy server"); | 515 | srs_warn("start destroy server"); |
| 516 | 516 | ||
| 517 | - _srs_config->unsubscribe(this); | ||
| 518 | - | ||
| 519 | - close_listeners(SrsListenerRtmpStream); | ||
| 520 | - close_listeners(SrsListenerHttpApi); | ||
| 521 | - close_listeners(SrsListenerHttpStream); | ||
| 522 | - | ||
| 523 | -#ifdef SRS_AUTO_INGEST | ||
| 524 | - ingester->dispose(); | ||
| 525 | -#endif | ||
| 526 | - | ||
| 527 | - SrsSource::dispose_all(); | 517 | + dispose(); |
| 528 | 518 | ||
| 529 | #ifdef SRS_AUTO_HTTP_API | 519 | #ifdef SRS_AUTO_HTTP_API |
| 530 | srs_freep(http_api_mux); | 520 | srs_freep(http_api_mux); |
| @@ -550,32 +540,35 @@ void SrsServer::destroy() | @@ -550,32 +540,35 @@ void SrsServer::destroy() | ||
| 550 | srs_freep(signal_manager); | 540 | srs_freep(signal_manager); |
| 551 | 541 | ||
| 552 | srs_freep(handler); | 542 | srs_freep(handler); |
| 553 | - | ||
| 554 | - // @remark never destroy the connections, | ||
| 555 | - // for it's still alive. | ||
| 556 | - | ||
| 557 | - // @remark never destroy the source, | ||
| 558 | - // when we free all sources, the fmle publish may retry | ||
| 559 | - // and segment fault. | ||
| 560 | - | ||
| 561 | -#ifdef SRS_MEM_WATCH | ||
| 562 | - srs_memory_report(); | ||
| 563 | -#endif | ||
| 564 | } | 543 | } |
| 565 | 544 | ||
| 566 | void SrsServer::dispose() | 545 | void SrsServer::dispose() |
| 567 | { | 546 | { |
| 568 | _srs_config->unsubscribe(this); | 547 | _srs_config->unsubscribe(this); |
| 569 | 548 | ||
| 549 | + // prevent fresh clients. | ||
| 550 | + close_listeners(SrsListenerRtmpStream); | ||
| 551 | + close_listeners(SrsListenerHttpApi); | ||
| 552 | + close_listeners(SrsListenerHttpStream); | ||
| 553 | + close_listeners(SrsListenerMpegTsOverUdp); | ||
| 554 | + close_listeners(SrsListenerRtsp); | ||
| 555 | + close_listeners(SrsListenerFlv); | ||
| 556 | + | ||
| 570 | #ifdef SRS_AUTO_INGEST | 557 | #ifdef SRS_AUTO_INGEST |
| 571 | ingester->dispose(); | 558 | ingester->dispose(); |
| 572 | - srs_trace("gracefully dispose ingesters"); | ||
| 573 | #endif | 559 | #endif |
| 574 | 560 | ||
| 575 | SrsSource::dispose_all(); | 561 | SrsSource::dispose_all(); |
| 576 | - srs_trace("gracefully dispose sources"); | ||
| 577 | 562 | ||
| 578 | - srs_trace("terminate server"); | 563 | + while (!conns.empty()) { |
| 564 | + std::vector<SrsConnection*>::iterator it; | ||
| 565 | + for (it = conns.begin(); it != conns.end(); ++it) { | ||
| 566 | + SrsConnection* conn = *it; | ||
| 567 | + conn->dispose(); | ||
| 568 | + } | ||
| 569 | + | ||
| 570 | + st_usleep(100 * 1000); | ||
| 571 | + } | ||
| 579 | 572 | ||
| 580 | #ifdef SRS_MEM_WATCH | 573 | #ifdef SRS_MEM_WATCH |
| 581 | srs_memory_report(); | 574 | srs_memory_report(); |
-
请 注册 或 登录 后发表评论