1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

for bug #237, refine the thread loop for publish thread. 2.0.47

This commit is contained in:
winlin 2014-12-02 19:28:36 +08:00
parent 24a6a723ee
commit 463e1fbc41
2 changed files with 30 additions and 32 deletions

View file

@ -66,29 +66,35 @@ int SrsRecvThread::cycle()
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (!handler->can_handle()) { while (trd->can_loop()) {
st_usleep(timeout * 1000); if (!handler->can_handle()) {
return ret; st_usleep(timeout * 1000);
} continue;
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);
} }
// we use no timeout to recv, should never got any error. SrsMessage* msg = NULL;
trd->stop_loop();
// notice the handler got a recv error. // recv and handle message
handler->on_recv_error(ret); ret = rtmp->recv_message(&msg);
if (ret == ERROR_SUCCESS) {
return ret; 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; return ret;
} }
@ -263,21 +269,13 @@ int SrsPublishRecvThread::handle(SrsMessage* msg)
_nb_msgs++; _nb_msgs++;
// the rtmp connection will handle this message, // the rtmp connection will handle this message
// quit the thread loop when error. ret = _conn->handle_publish_message(_source, msg, _is_fmle, _is_edge);
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();
}
// must always free it, // must always free it,
// the source will copy it if need to use. // the source will copy it if need to use.
srs_freep(msg); srs_freep(msg);
// TODO: FIXME: implements it.
return ret; return ret;
} }

View file

@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version // current release version
#define VERSION_MAJOR 2 #define VERSION_MAJOR 2
#define VERSION_MINOR 0 #define VERSION_MINOR 0
#define VERSION_REVISION 46 #define VERSION_REVISION 47
// server info. // server info.
#define RTMP_SIG_SRS_KEY "SRS" #define RTMP_SIG_SRS_KEY "SRS"
#define RTMP_SIG_SRS_ROLE "origin/edge server" #define RTMP_SIG_SRS_ROLE "origin/edge server"