refine the thread, set to disposed when terminate normally

pull/483/head
winlin 10 years ago
parent 83a9ff9f5d
commit eb578b4a39

@ -66,6 +66,7 @@ namespace internal {
really_terminated = true; really_terminated = true;
_cid = -1; _cid = -1;
_joinable = joinable; _joinable = joinable;
disposed = false;
// in start(), the thread cycle method maybe stop and remove the thread itself, // 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. // and the thread start() is waiting for the _cid, and segment fault then.
@ -115,8 +116,32 @@ namespace internal {
void SrsThread::stop() void SrsThread::stop()
{ {
if (tid) { if (!tid) {
return;
}
loop = false;
dispose();
tid = NULL;
}
bool SrsThread::can_loop()
{
return loop;
}
void SrsThread::stop_loop()
{
loop = false; loop = false;
}
void SrsThread::dispose()
{
if (disposed) {
return;
}
// the interrupt will cause the socket to read/write error, // the interrupt will cause the socket to read/write error,
// which will terminate the cycle thread. // which will terminate the cycle thread.
@ -145,18 +170,7 @@ namespace internal {
srs_warn("core: wait thread to actually terminated"); srs_warn("core: wait thread to actually terminated");
} }
tid = NULL; disposed = true;
}
}
bool SrsThread::can_loop()
{
return loop;
}
void SrsThread::stop_loop()
{
loop = false;
} }
void SrsThread::thread_cycle() void SrsThread::thread_cycle()
@ -218,8 +232,8 @@ namespace internal {
handler->on_thread_stop(); handler->on_thread_stop();
srs_info("thread %s cycle finished", _name); srs_info("thread %s cycle finished", _name);
// when thread terminated normally, set the tid to NULL. // when thread terminated normally, also disposed.
tid = NULL; disposed = true;
} }
void* SrsThread::thread_fun(void* arg) void* SrsThread::thread_fun(void* arg)

@ -100,6 +100,7 @@ namespace internal {
bool really_terminated; bool really_terminated;
bool _joinable; bool _joinable;
const char* _name; const char* _name;
bool disposed;
private: private:
ISrsThreadHandler* handler; ISrsThreadHandler* handler;
int64_t cycle_interval_us; int64_t cycle_interval_us;
@ -154,6 +155,7 @@ namespace internal {
*/ */
virtual void stop_loop(); virtual void stop_loop();
private: private:
virtual void dispose();
virtual void thread_cycle(); virtual void thread_cycle();
static void* thread_fun(void* arg); static void* thread_fun(void* arg);
}; };

@ -905,7 +905,7 @@ namespace _srs_internal
} }
// client c1 time and version // client c1 time and version
time = ::time(NULL); time = (int32_t)::time(NULL);
version = 0x80000702; // client c1 version version = 0x80000702; // client c1 version
// generate signature by schema // generate signature by schema

Loading…
Cancel
Save