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

async call worker fast execute tasks.

This commit is contained in:
winlin 2015-09-17 11:57:17 +08:00
parent 087f7740b7
commit 7b2b11e932
3 changed files with 30 additions and 9 deletions

2
trunk/auto/auto_headers.sh Executable file → Normal file
View file

@ -257,7 +257,9 @@ echo "\"" >> $SRS_AUTO_HEADERS_H
# new empty line to auto headers file.
echo "" >> $SRS_AUTO_HEADERS_H
#####################################################################################
# auto header EOF.
#####################################################################################
echo "#endif" >> $SRS_AUTO_HEADERS_H
echo "" >> $SRS_AUTO_HEADERS_H

View file

@ -42,6 +42,7 @@ ISrsAsyncCallTask::~ISrsAsyncCallTask()
SrsAsyncCallWorker::SrsAsyncCallWorker()
{
pthread = new SrsReusableThread("async", this, SRS_AUTO_ASYNC_CALLBACL_SLEEP_US);
wait = st_cond_new();
}
SrsAsyncCallWorker::~SrsAsyncCallWorker()
@ -54,6 +55,8 @@ SrsAsyncCallWorker::~SrsAsyncCallWorker()
srs_freep(task);
}
tasks.clear();
st_cond_destroy(wait);
}
int SrsAsyncCallWorker::execute(ISrsAsyncCallTask* t)
@ -61,10 +64,16 @@ int SrsAsyncCallWorker::execute(ISrsAsyncCallTask* t)
int ret = ERROR_SUCCESS;
tasks.push_back(t);
st_cond_signal(wait);
return ret;
}
int SrsAsyncCallWorker::count()
{
return (int)tasks.size();
}
int SrsAsyncCallWorker::start()
{
return pthread->start();
@ -72,23 +81,30 @@ int SrsAsyncCallWorker::start()
void SrsAsyncCallWorker::stop()
{
st_cond_signal(wait);
pthread->stop();
}
int SrsAsyncCallWorker::cycle()
{
int ret = ERROR_SUCCESS;
std::vector<ISrsAsyncCallTask*> copies = tasks;
tasks.clear();
std::vector<ISrsAsyncCallTask*>::iterator it;
for (it = copies.begin(); it != copies.end(); ++it) {
ISrsAsyncCallTask* task = *it;
if ((ret = task->call()) != ERROR_SUCCESS) {
srs_warn("ignore async callback %s, ret=%d", task->to_string().c_str(), ret);
while (pthread->can_loop()) {
if (tasks.empty()) {
st_cond_wait(wait);
}
std::vector<ISrsAsyncCallTask*> copies = tasks;
tasks.clear();
std::vector<ISrsAsyncCallTask*>::iterator it;
for (it = copies.begin(); it != copies.end(); ++it) {
ISrsAsyncCallTask* task = *it;
if ((ret = task->call()) != ERROR_SUCCESS) {
srs_warn("ignore async callback %s, ret=%d", task->to_string().c_str(), ret);
}
srs_freep(task);
}
srs_freep(task);
}
return ret;

View file

@ -70,12 +70,15 @@ class SrsAsyncCallWorker : public ISrsReusableThreadHandler
{
private:
SrsReusableThread* pthread;
protected:
std::vector<ISrsAsyncCallTask*> tasks;
st_cond_t wait;
public:
SrsAsyncCallWorker();
virtual ~SrsAsyncCallWorker();
public:
virtual int execute(ISrsAsyncCallTask* t);
virtual int count();
public:
virtual int start();
virtual void stop();