diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index 5a6a49807..40d888881 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -66,29 +66,35 @@ int SrsRecvThread::cycle() { int ret = ERROR_SUCCESS; - if (!handler->can_handle()) { - st_usleep(timeout * 1000); - return ret; - } - - SrsMessage* msg = NULL; - - if ((ret = rtmp->recv_message(&msg)) != ERROR_SUCCESS) { - if (!srs_is_client_gracefully_close(ret)) { - srs_error("recv client control message failed. ret=%d", ret); + while (trd->can_loop()) { + if (!handler->can_handle()) { + st_usleep(timeout * 1000); + continue; } - - // we use no timeout to recv, should never got any error. - trd->stop_loop(); + + SrsMessage* msg = NULL; - // notice the handler got a recv error. - handler->on_recv_error(ret); - - return ret; + // recv and handle message + ret = rtmp->recv_message(&msg); + if (ret == ERROR_SUCCESS) { + ret = handler->handle(msg); + } + + if (ret != ERROR_SUCCESS) { + if (!srs_is_client_gracefully_close(ret)) { + srs_error("thread process message failed. ret=%d", ret); + } + + // we use no timeout to recv, should never got any error. + trd->stop_loop(); + + // notice the handler got a recv error. + handler->on_recv_error(ret); + + return ret; + } + srs_verbose("thread loop recv message. ret=%d", ret); } - srs_verbose("play loop recv message. ret=%d", ret); - - handler->handle(msg); return ret; } @@ -263,21 +269,13 @@ int SrsPublishRecvThread::handle(SrsMessage* msg) _nb_msgs++; - // the rtmp connection will handle this message, - // quit the thread loop when error. - recv_error_code = ret = _conn->handle_publish_message(_source, msg, _is_fmle, _is_edge); - - // when error, use stop loop to terminate the thread normally, - // for we are in the thread loop now, and should never use stop() to terminate it. - if (ret != ERROR_SUCCESS) { - trd.stop_loop(); - } + // the rtmp connection will handle this message + ret = _conn->handle_publish_message(_source, msg, _is_fmle, _is_edge); // must always free it, // the source will copy it if need to use. srs_freep(msg); - - // TODO: FIXME: implements it. + return ret; } diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 6fa3d0f00..1bea57bce 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 46 +#define VERSION_REVISION 47 // server info. #define RTMP_SIG_SRS_KEY "SRS" #define RTMP_SIG_SRS_ROLE "origin/edge server"