mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #907, Wrap ST, only use in service ST.
This commit is contained in:
parent
54411e0768
commit
1bf99e8f3e
49 changed files with 340 additions and 513 deletions
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include <srs_app_st.hpp>
|
||||
|
||||
#include <st.h>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
|
@ -65,7 +66,7 @@ int SrsCoroutine::start()
|
|||
return ret;
|
||||
}
|
||||
|
||||
if((trd = st_thread_create(pfn, this, 1, 0)) == NULL){
|
||||
if((trd = (srs_thread_t)st_thread_create(pfn, this, 1, 0)) == NULL){
|
||||
ret = ERROR_ST_CREATE_CYCLE_THREAD;
|
||||
srs_error("Thread.start: Create thread failed. ret=%d", ret);
|
||||
return ret;
|
||||
|
@ -86,7 +87,7 @@ void SrsCoroutine::stop()
|
|||
interrupt();
|
||||
|
||||
void* res = NULL;
|
||||
int ret = st_thread_join(trd, &res);
|
||||
int ret = st_thread_join((st_thread_t)trd, &res);
|
||||
srs_info("Thread.stop: Terminated, ret=%d, err=%d", ret, err);
|
||||
srs_assert(!ret);
|
||||
|
||||
|
@ -109,7 +110,7 @@ void SrsCoroutine::interrupt()
|
|||
|
||||
srs_info("Thread.interrupt: Interrupt thread, err=%d", err);
|
||||
err = (err == ERROR_SUCCESS? ERROR_THREAD_INTERRUPED:err);
|
||||
st_thread_interrupt(trd);
|
||||
st_thread_interrupt((st_thread_t)trd);
|
||||
}
|
||||
|
||||
int SrsCoroutine::pull()
|
||||
|
@ -145,180 +146,3 @@ void* SrsCoroutine::pfn(void* arg)
|
|||
return res;
|
||||
}
|
||||
|
||||
namespace internal
|
||||
{
|
||||
ISrsThreadHandler::ISrsThreadHandler()
|
||||
{
|
||||
}
|
||||
|
||||
ISrsThreadHandler::~ISrsThreadHandler()
|
||||
{
|
||||
}
|
||||
|
||||
void ISrsThreadHandler::on_thread_start()
|
||||
{
|
||||
}
|
||||
|
||||
int ISrsThreadHandler::on_before_cycle()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ISrsThreadHandler::on_end_cycle()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ISrsThreadHandler::on_thread_stop()
|
||||
{
|
||||
}
|
||||
|
||||
SrsThread::SrsThread(const char* n, ISrsThreadHandler* h, int64_t ims, bool j)
|
||||
{
|
||||
name = n;
|
||||
handler = h;
|
||||
cims = ims;
|
||||
|
||||
trd = NULL;
|
||||
loop = false;
|
||||
context_id = -1;
|
||||
joinable = j;
|
||||
}
|
||||
|
||||
SrsThread::~SrsThread()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
int SrsThread::cid()
|
||||
{
|
||||
return context_id;
|
||||
}
|
||||
|
||||
int SrsThread::start()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
if(trd) {
|
||||
srs_info("thread %s already running.", name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
loop = true;
|
||||
|
||||
if((trd = st_thread_create(pfn, this, (joinable? 1:0), 0)) == NULL){
|
||||
ret = ERROR_ST_CREATE_CYCLE_THREAD;
|
||||
srs_error("st_thread_create failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void SrsThread::stop()
|
||||
{
|
||||
if (!trd) {
|
||||
return;
|
||||
}
|
||||
|
||||
// notify the cycle to stop loop.
|
||||
loop = false;
|
||||
|
||||
// the interrupt will cause the socket to read/write error,
|
||||
// which will terminate the cycle thread.
|
||||
st_thread_interrupt(trd);
|
||||
|
||||
// when joinable, wait util quit.
|
||||
if (joinable) {
|
||||
// wait the thread to exit.
|
||||
int ret = st_thread_join(trd, NULL);
|
||||
srs_assert(ret == ERROR_SUCCESS);
|
||||
}
|
||||
|
||||
trd = NULL;
|
||||
}
|
||||
|
||||
bool SrsThread::can_loop()
|
||||
{
|
||||
return loop;
|
||||
}
|
||||
|
||||
void SrsThread::stop_loop()
|
||||
{
|
||||
loop = false;
|
||||
}
|
||||
|
||||
void SrsThread::cycle()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// TODO: FIXME: it's better for user to specifies the cid,
|
||||
// because sometimes we need to merge cid, for example,
|
||||
// the publish thread should use the same cid of connection.
|
||||
_srs_context->generate_id();
|
||||
srs_info("thread %s cycle start", name);
|
||||
context_id = _srs_context->get_id();
|
||||
|
||||
srs_assert(handler);
|
||||
handler->on_thread_start();
|
||||
|
||||
while (loop) {
|
||||
if ((ret = handler->on_before_cycle()) != ERROR_SUCCESS) {
|
||||
srs_warn("thread %s on before cycle failed, ignored and retry, ret=%d", name, ret);
|
||||
goto failed;
|
||||
}
|
||||
srs_info("thread %s on before cycle success", name);
|
||||
|
||||
if ((ret = handler->cycle()) != ERROR_SUCCESS) {
|
||||
if (!srs_is_client_gracefully_close(ret) && !srs_is_system_control_error(ret)) {
|
||||
srs_warn("thread %s cycle failed, ignored and retry, ret=%d", name, ret);
|
||||
}
|
||||
goto failed;
|
||||
}
|
||||
srs_info("thread %s cycle success", name);
|
||||
|
||||
if ((ret = handler->on_end_cycle()) != ERROR_SUCCESS) {
|
||||
srs_warn("thread %s on end cycle failed, ignored and retry, ret=%d", name, ret);
|
||||
goto failed;
|
||||
}
|
||||
srs_info("thread %s on end cycle success", name);
|
||||
|
||||
failed:
|
||||
if (!loop) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Should never use no timeout, just ignore it.
|
||||
// to improve performance, donot sleep when interval is zero.
|
||||
// @see: https://github.com/ossrs/srs/issues/237
|
||||
if (cims != 0 && cims != SRS_CONSTS_NO_TMMS) {
|
||||
st_usleep(cims * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
srs_info("thread %s cycle finished", name);
|
||||
// @remark in this callback, user may delete this, so never use this->xxx anymore.
|
||||
handler->on_thread_stop();
|
||||
}
|
||||
|
||||
void* SrsThread::pfn(void* arg)
|
||||
{
|
||||
SrsThread* obj = (SrsThread*)arg;
|
||||
srs_assert(obj);
|
||||
|
||||
obj->cycle();
|
||||
|
||||
// delete cid for valgrind to detect memory leak.
|
||||
SrsThreadContext* ctx = dynamic_cast<SrsThreadContext*>(_srs_context);
|
||||
if (ctx) {
|
||||
ctx->clear_cid();
|
||||
}
|
||||
|
||||
st_thread_exit(NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue