正在显示
3 个修改的文件
包含
50 行增加
和
34 行删除
| @@ -66,6 +66,7 @@ namespace internal { | @@ -66,6 +66,7 @@ namespace internal { | ||
| 66 | really_terminated = true; | 66 | really_terminated = true; |
| 67 | _cid = -1; | 67 | _cid = -1; |
| 68 | _joinable = joinable; | 68 | _joinable = joinable; |
| 69 | + disposed = false; | ||
| 69 | 70 | ||
| 70 | // in start(), the thread cycle method maybe stop and remove the thread itself, | 71 | // in start(), the thread cycle method maybe stop and remove the thread itself, |
| 71 | // and the thread start() is waiting for the _cid, and segment fault then. | 72 | // and the thread start() is waiting for the _cid, and segment fault then. |
| @@ -115,38 +116,15 @@ namespace internal { | @@ -115,38 +116,15 @@ namespace internal { | ||
| 115 | 116 | ||
| 116 | void SrsThread::stop() | 117 | void SrsThread::stop() |
| 117 | { | 118 | { |
| 118 | - if (tid) { | ||
| 119 | - loop = false; | ||
| 120 | - | ||
| 121 | - // the interrupt will cause the socket to read/write error, | ||
| 122 | - // which will terminate the cycle thread. | ||
| 123 | - st_thread_interrupt(tid); | ||
| 124 | - | ||
| 125 | - // when joinable, wait util quit. | ||
| 126 | - if (_joinable) { | ||
| 127 | - // wait the thread to exit. | ||
| 128 | - int ret = st_thread_join(tid, NULL); | ||
| 129 | - if (ret) { | ||
| 130 | - srs_warn("core: ignore join thread failed."); | ||
| 131 | - } | ||
| 132 | - } | ||
| 133 | - | ||
| 134 | - // wait the thread actually terminated. | ||
| 135 | - // sometimes the thread join return -1, for example, | ||
| 136 | - // when thread use st_recvfrom, the thread join return -1. | ||
| 137 | - // so here, we use a variable to ensure the thread stopped. | ||
| 138 | - // @remark even the thread not joinable, we must ensure the thread stopped when stop. | ||
| 139 | - while (!really_terminated) { | ||
| 140 | - st_usleep(10 * 1000); | ||
| 141 | - | ||
| 142 | - if (really_terminated) { | ||
| 143 | - break; | ||
| 144 | - } | ||
| 145 | - srs_warn("core: wait thread to actually terminated"); | ||
| 146 | - } | ||
| 147 | - | ||
| 148 | - tid = NULL; | 119 | + if (!tid) { |
| 120 | + return; | ||
| 149 | } | 121 | } |
| 122 | + | ||
| 123 | + loop = false; | ||
| 124 | + | ||
| 125 | + dispose(); | ||
| 126 | + | ||
| 127 | + tid = NULL; | ||
| 150 | } | 128 | } |
| 151 | 129 | ||
| 152 | bool SrsThread::can_loop() | 130 | bool SrsThread::can_loop() |
| @@ -159,6 +137,42 @@ namespace internal { | @@ -159,6 +137,42 @@ namespace internal { | ||
| 159 | loop = false; | 137 | loop = false; |
| 160 | } | 138 | } |
| 161 | 139 | ||
| 140 | + void SrsThread::dispose() | ||
| 141 | + { | ||
| 142 | + if (disposed) { | ||
| 143 | + return; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + // the interrupt will cause the socket to read/write error, | ||
| 147 | + // which will terminate the cycle thread. | ||
| 148 | + st_thread_interrupt(tid); | ||
| 149 | + | ||
| 150 | + // when joinable, wait util quit. | ||
| 151 | + if (_joinable) { | ||
| 152 | + // wait the thread to exit. | ||
| 153 | + int ret = st_thread_join(tid, NULL); | ||
| 154 | + if (ret) { | ||
| 155 | + srs_warn("core: ignore join thread failed."); | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + // wait the thread actually terminated. | ||
| 160 | + // sometimes the thread join return -1, for example, | ||
| 161 | + // when thread use st_recvfrom, the thread join return -1. | ||
| 162 | + // so here, we use a variable to ensure the thread stopped. | ||
| 163 | + // @remark even the thread not joinable, we must ensure the thread stopped when stop. | ||
| 164 | + while (!really_terminated) { | ||
| 165 | + st_usleep(10 * 1000); | ||
| 166 | + | ||
| 167 | + if (really_terminated) { | ||
| 168 | + break; | ||
| 169 | + } | ||
| 170 | + srs_warn("core: wait thread to actually terminated"); | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + disposed = true; | ||
| 174 | + } | ||
| 175 | + | ||
| 162 | void SrsThread::thread_cycle() | 176 | void SrsThread::thread_cycle() |
| 163 | { | 177 | { |
| 164 | int ret = ERROR_SUCCESS; | 178 | int ret = ERROR_SUCCESS; |
| @@ -218,8 +232,8 @@ namespace internal { | @@ -218,8 +232,8 @@ namespace internal { | ||
| 218 | handler->on_thread_stop(); | 232 | handler->on_thread_stop(); |
| 219 | srs_info("thread %s cycle finished", _name); | 233 | srs_info("thread %s cycle finished", _name); |
| 220 | 234 | ||
| 221 | - // when thread terminated normally, set the tid to NULL. | ||
| 222 | - tid = NULL; | 235 | + // when thread terminated normally, also disposed. |
| 236 | + disposed = true; | ||
| 223 | } | 237 | } |
| 224 | 238 | ||
| 225 | void* SrsThread::thread_fun(void* arg) | 239 | void* SrsThread::thread_fun(void* arg) |
| @@ -100,6 +100,7 @@ namespace internal { | @@ -100,6 +100,7 @@ namespace internal { | ||
| 100 | bool really_terminated; | 100 | bool really_terminated; |
| 101 | bool _joinable; | 101 | bool _joinable; |
| 102 | const char* _name; | 102 | const char* _name; |
| 103 | + bool disposed; | ||
| 103 | private: | 104 | private: |
| 104 | ISrsThreadHandler* handler; | 105 | ISrsThreadHandler* handler; |
| 105 | int64_t cycle_interval_us; | 106 | int64_t cycle_interval_us; |
| @@ -154,6 +155,7 @@ namespace internal { | @@ -154,6 +155,7 @@ namespace internal { | ||
| 154 | */ | 155 | */ |
| 155 | virtual void stop_loop(); | 156 | virtual void stop_loop(); |
| 156 | private: | 157 | private: |
| 158 | + virtual void dispose(); | ||
| 157 | virtual void thread_cycle(); | 159 | virtual void thread_cycle(); |
| 158 | static void* thread_fun(void* arg); | 160 | static void* thread_fun(void* arg); |
| 159 | }; | 161 | }; |
| @@ -905,7 +905,7 @@ namespace _srs_internal | @@ -905,7 +905,7 @@ namespace _srs_internal | ||
| 905 | } | 905 | } |
| 906 | 906 | ||
| 907 | // client c1 time and version | 907 | // client c1 time and version |
| 908 | - time = ::time(NULL); | 908 | + time = (int32_t)::time(NULL); |
| 909 | version = 0x80000702; // client c1 version | 909 | version = 0x80000702; // client c1 version |
| 910 | 910 | ||
| 911 | // generate signature by schema | 911 | // generate signature by schema |
-
请 注册 或 登录 后发表评论