Skip to content

Commit

Permalink
refine the thread, set to disposed when terminate normally
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Sep 14, 2015
1 parent 83a9ff9 commit eb578b4
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 34 deletions.
80 changes: 47 additions & 33 deletions trunk/src/app/srs_app_thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ namespace internal {
really_terminated = true;
_cid = -1;
_joinable = joinable;
disposed = false;

// in start(), the thread cycle method maybe stop and remove the thread itself,
// and the thread start() is waiting for the _cid, and segment fault then.
Expand Down Expand Up @@ -115,38 +116,15 @@ namespace internal {

void SrsThread::stop()
{
if (tid) {
loop = false;

// the interrupt will cause the socket to read/write error,
// which will terminate the cycle thread.
st_thread_interrupt(tid);

// when joinable, wait util quit.
if (_joinable) {
// wait the thread to exit.
int ret = st_thread_join(tid, NULL);
if (ret) {
srs_warn("core: ignore join thread failed.");
}
}

// wait the thread actually terminated.
// sometimes the thread join return -1, for example,
// when thread use st_recvfrom, the thread join return -1.
// so here, we use a variable to ensure the thread stopped.
// @remark even the thread not joinable, we must ensure the thread stopped when stop.
while (!really_terminated) {
st_usleep(10 * 1000);

if (really_terminated) {
break;
}
srs_warn("core: wait thread to actually terminated");
}

tid = NULL;
if (!tid) {
return;
}

loop = false;

dispose();

tid = NULL;
}

bool SrsThread::can_loop()
Expand All @@ -159,6 +137,42 @@ namespace internal {
loop = false;
}

void SrsThread::dispose()
{
if (disposed) {
return;
}

// the interrupt will cause the socket to read/write error,
// which will terminate the cycle thread.
st_thread_interrupt(tid);

// when joinable, wait util quit.
if (_joinable) {
// wait the thread to exit.
int ret = st_thread_join(tid, NULL);
if (ret) {
srs_warn("core: ignore join thread failed.");
}
}

// wait the thread actually terminated.
// sometimes the thread join return -1, for example,
// when thread use st_recvfrom, the thread join return -1.
// so here, we use a variable to ensure the thread stopped.
// @remark even the thread not joinable, we must ensure the thread stopped when stop.
while (!really_terminated) {
st_usleep(10 * 1000);

if (really_terminated) {
break;
}
srs_warn("core: wait thread to actually terminated");
}

disposed = true;
}

void SrsThread::thread_cycle()
{
int ret = ERROR_SUCCESS;
Expand Down Expand Up @@ -218,8 +232,8 @@ namespace internal {
handler->on_thread_stop();
srs_info("thread %s cycle finished", _name);

// when thread terminated normally, set the tid to NULL.
tid = NULL;
// when thread terminated normally, also disposed.
disposed = true;
}

void* SrsThread::thread_fun(void* arg)
Expand Down
2 changes: 2 additions & 0 deletions trunk/src/app/srs_app_thread.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ namespace internal {
bool really_terminated;
bool _joinable;
const char* _name;
bool disposed;
private:
ISrsThreadHandler* handler;
int64_t cycle_interval_us;
Expand Down Expand Up @@ -154,6 +155,7 @@ namespace internal {
*/
virtual void stop_loop();
private:
virtual void dispose();
virtual void thread_cycle();
static void* thread_fun(void* arg);
};
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/protocol/srs_rtmp_handshake.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -905,7 +905,7 @@ namespace _srs_internal
}

// client c1 time and version
time = ::time(NULL);
time = (int32_t)::time(NULL);
version = 0x80000702; // client c1 version

// generate signature by schema
Expand Down

0 comments on commit eb578b4

Please sign in to comment.