fix #713, refine source to avoid critical fetch and create. 2.0.222
正在显示
5 个修改的文件
包含
19 行增加
和
32 行删除
| @@ -344,6 +344,7 @@ Remark: | @@ -344,6 +344,7 @@ Remark: | ||
| 344 | 344 | ||
| 345 | ## History | 345 | ## History |
| 346 | 346 | ||
| 347 | +* v2.0, 2016-12-13, fix #713, refine source to avoid critical fetch and create. 2.0.222 | ||
| 347 | * <strong>v2.0, 2016-11-09, [2.0 beta2(2.0.221)][r2.0b2] released. 86691 lines.</strong> | 348 | * <strong>v2.0, 2016-11-09, [2.0 beta2(2.0.221)][r2.0b2] released. 86691 lines.</strong> |
| 348 | * v2.0, 2016-11-05, fix #654, crash when source cleanup for edge. 2.0.221 | 349 | * v2.0, 2016-11-05, fix #654, crash when source cleanup for edge. 2.0.221 |
| 349 | * v2.0, 2016-10-26, fix #666, crash when source cleanup for http-flv. 2.0.220 | 350 | * v2.0, 2016-10-26, fix #666, crash when source cleanup for http-flv. 2.0.220 |
| @@ -1228,11 +1228,9 @@ int SrsHttpStreamServer::hijack(ISrsHttpMessage* request, ISrsHttpHandler** ph) | @@ -1228,11 +1228,9 @@ int SrsHttpStreamServer::hijack(ISrsHttpMessage* request, ISrsHttpHandler** ph) | ||
| 1228 | } | 1228 | } |
| 1229 | } | 1229 | } |
| 1230 | 1230 | ||
| 1231 | - SrsSource* s = SrsSource::fetch(r); | ||
| 1232 | - if (!s) { | ||
| 1233 | - if ((ret = SrsSource::create(r, server, server, &s)) != ERROR_SUCCESS) { | ||
| 1234 | - return ret; | ||
| 1235 | - } | 1231 | + SrsSource* s = NULL; |
| 1232 | + if ((ret = SrsSource::fetch_or_create(r, server, server, &s)) != ERROR_SUCCESS) { | ||
| 1233 | + return ret; | ||
| 1236 | } | 1234 | } |
| 1237 | srs_assert(s != NULL); | 1235 | srs_assert(s != NULL); |
| 1238 | 1236 |
| @@ -486,11 +486,9 @@ int SrsRtmpConn::stream_service_cycle() | @@ -486,11 +486,9 @@ int SrsRtmpConn::stream_service_cycle() | ||
| 486 | rtmp->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); | 486 | rtmp->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); |
| 487 | 487 | ||
| 488 | // find a source to serve. | 488 | // find a source to serve. |
| 489 | - SrsSource* source = SrsSource::fetch(req); | ||
| 490 | - if (!source) { | ||
| 491 | - if ((ret = SrsSource::create(req, server, server, &source)) != ERROR_SUCCESS) { | ||
| 492 | - return ret; | ||
| 493 | - } | 489 | + SrsSource* source = NULL; |
| 490 | + if ((ret = SrsSource::fetch_or_create(req, server, server, &source)) != ERROR_SUCCESS) { | ||
| 491 | + return ret; | ||
| 494 | } | 492 | } |
| 495 | srs_assert(source != NULL); | 493 | srs_assert(source != NULL); |
| 496 | 494 |
| @@ -731,17 +731,23 @@ ISrsSourceHandler::~ISrsSourceHandler() | @@ -731,17 +731,23 @@ ISrsSourceHandler::~ISrsSourceHandler() | ||
| 731 | 731 | ||
| 732 | std::map<std::string, SrsSource*> SrsSource::pool; | 732 | std::map<std::string, SrsSource*> SrsSource::pool; |
| 733 | 733 | ||
| 734 | -int SrsSource::create(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh, SrsSource** pps) | 734 | +int SrsSource::fetch_or_create(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh, SrsSource** pps) |
| 735 | { | 735 | { |
| 736 | int ret = ERROR_SUCCESS; | 736 | int ret = ERROR_SUCCESS; |
| 737 | 737 | ||
| 738 | + SrsSource* source = NULL; | ||
| 739 | + if ((source = fetch(r)) != NULL) { | ||
| 740 | + *pps = source; | ||
| 741 | + return ret; | ||
| 742 | + } | ||
| 743 | + | ||
| 738 | string stream_url = r->get_stream_url(); | 744 | string stream_url = r->get_stream_url(); |
| 739 | string vhost = r->vhost; | 745 | string vhost = r->vhost; |
| 740 | 746 | ||
| 741 | // should always not exists for create a source. | 747 | // should always not exists for create a source. |
| 742 | srs_assert (pool.find(stream_url) == pool.end()); | 748 | srs_assert (pool.find(stream_url) == pool.end()); |
| 743 | 749 | ||
| 744 | - SrsSource* source = new SrsSource(); | 750 | + source = new SrsSource(); |
| 745 | if ((ret = source->initialize(r, h, hh)) != ERROR_SUCCESS) { | 751 | if ((ret = source->initialize(r, h, hh)) != ERROR_SUCCESS) { |
| 746 | srs_freep(source); | 752 | srs_freep(source); |
| 747 | return ret; | 753 | return ret; |
| @@ -774,20 +780,6 @@ SrsSource* SrsSource::fetch(SrsRequest* r) | @@ -774,20 +780,6 @@ SrsSource* SrsSource::fetch(SrsRequest* r) | ||
| 774 | return source; | 780 | return source; |
| 775 | } | 781 | } |
| 776 | 782 | ||
| 777 | -SrsSource* SrsSource::fetch(std::string vhost, std::string app, std::string stream) | ||
| 778 | -{ | ||
| 779 | - SrsSource* source = NULL; | ||
| 780 | - string stream_url = srs_generate_stream_url(vhost, app, stream); | ||
| 781 | - | ||
| 782 | - if (pool.find(stream_url) == pool.end()) { | ||
| 783 | - return NULL; | ||
| 784 | - } | ||
| 785 | - | ||
| 786 | - source = pool[stream_url]; | ||
| 787 | - | ||
| 788 | - return source; | ||
| 789 | -} | ||
| 790 | - | ||
| 791 | void SrsSource::dispose_all() | 783 | void SrsSource::dispose_all() |
| 792 | { | 784 | { |
| 793 | std::map<std::string, SrsSource*>::iterator it; | 785 | std::map<std::string, SrsSource*>::iterator it; |
| @@ -418,22 +418,20 @@ private: | @@ -418,22 +418,20 @@ private: | ||
| 418 | static std::map<std::string, SrsSource*> pool; | 418 | static std::map<std::string, SrsSource*> pool; |
| 419 | public: | 419 | public: |
| 420 | /** | 420 | /** |
| 421 | - * find stream by vhost/app/stream. | 421 | + * create source when fetch from cache failed. |
| 422 | * @param r the client request. | 422 | * @param r the client request. |
| 423 | * @param h the event handler for source. | 423 | * @param h the event handler for source. |
| 424 | * @param hh the event handler for hls. | 424 | * @param hh the event handler for hls. |
| 425 | * @param pps the matched source, if success never be NULL. | 425 | * @param pps the matched source, if success never be NULL. |
| 426 | */ | 426 | */ |
| 427 | - static int create(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh, SrsSource** pps); | 427 | + static int fetch_or_create(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh, SrsSource** pps); |
| 428 | +private: | ||
| 428 | /** | 429 | /** |
| 429 | * get the exists source, NULL when not exists. | 430 | * get the exists source, NULL when not exists. |
| 430 | * update the request and return the exists source. | 431 | * update the request and return the exists source. |
| 431 | */ | 432 | */ |
| 432 | static SrsSource* fetch(SrsRequest* r); | 433 | static SrsSource* fetch(SrsRequest* r); |
| 433 | - /** | ||
| 434 | - * get the exists source by stream info(vhost, app, stream), NULL when not exists. | ||
| 435 | - */ | ||
| 436 | - static SrsSource* fetch(std::string vhost, std::string app, std::string stream); | 434 | +public: |
| 437 | /** | 435 | /** |
| 438 | * dispose and cycle all sources. | 436 | * dispose and cycle all sources. |
| 439 | */ | 437 | */ |
-
请 注册 或 登录 后发表评论