winlin

fix bug #162, requires epoll. 0.9.222

@@ -208,6 +208,7 @@ Supported operating systems and hardware: @@ -208,6 +208,7 @@ Supported operating systems and hardware:
208 * 2013-10-17, Created.<br/> 208 * 2013-10-17, Created.<br/>
209 209
210 ## History 210 ## History
  211 +* v1.0, 2014-09-30, fix [#162](https://github.com/winlinvip/simple-rtmp-server/issues/162), failed if no epoll. 0.9.222.
211 * v1.0, 2014-09-30, fix [#180](https://github.com/winlinvip/simple-rtmp-server/issues/180), crash for multiple edge publishing the same stream. 0.9.220. 212 * v1.0, 2014-09-30, fix [#180](https://github.com/winlinvip/simple-rtmp-server/issues/180), crash for multiple edge publishing the same stream. 0.9.220.
212 * v1.0, 2014-09-26, fix hls bug, refine config and log, according to clion of jetbrains. 0.9.216. 213 * v1.0, 2014-09-26, fix hls bug, refine config and log, according to clion of jetbrains. 0.9.216.
213 * v1.0, 2014-09-25, fix [#177](https://github.com/winlinvip/simple-rtmp-server/issues/177), dvr segment add config dvr_wait_keyframe. 0.9.213. 214 * v1.0, 2014-09-25, fix [#177](https://github.com/winlinvip/simple-rtmp-server/issues/177), dvr segment add config dvr_wait_keyframe. 0.9.213.
@@ -528,20 +528,11 @@ int SrsServer::initialize_st() @@ -528,20 +528,11 @@ int SrsServer::initialize_st()
528 { 528 {
529 int ret = ERROR_SUCCESS; 529 int ret = ERROR_SUCCESS;
530 530
531 - // use linux epoll.  
532 - if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {  
533 - ret = ERROR_ST_SET_EPOLL;  
534 - srs_error("st_set_eventsys use linux epoll failed. ret=%d", ret); 531 + // init st
  532 + if ((ret = srs_init_st()) != ERROR_SUCCESS) {
  533 + srs_error("init st failed. ret=%d", ret);
535 return ret; 534 return ret;
536 } 535 }
537 - srs_verbose("st_set_eventsys use linux epoll success");  
538 -  
539 - if(st_init() != 0){  
540 - ret = ERROR_ST_INITIALIZE;  
541 - srs_error("st_init failed. ret=%d", ret);  
542 - return ret;  
543 - }  
544 - srs_verbose("st_init success");  
545 536
546 // @remark, st alloc segment use mmap, which only support 32757 threads, 537 // @remark, st alloc segment use mmap, which only support 32757 threads,
547 // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK. 538 // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK.
@@ -23,6 +23,52 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -23,6 +23,52 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 23
24 #include <srs_app_st.hpp> 24 #include <srs_app_st.hpp>
25 25
  26 +#include <srs_kernel_error.hpp>
  27 +#include <srs_kernel_log.hpp>
  28 +
  29 +#include <sys/epoll.h>
  30 +bool srs_st_epoll_is_supported(void)
  31 +{
  32 + struct epoll_event ev;
  33 +
  34 + ev.events = EPOLLIN;
  35 + ev.data.ptr = NULL;
  36 + /* Guaranteed to fail */
  37 + epoll_ctl(-1, EPOLL_CTL_ADD, -1, &ev);
  38 +
  39 + return (errno != ENOSYS);
  40 +}
  41 +
  42 +int srs_init_st()
  43 +{
  44 + int ret = ERROR_SUCCESS;
  45 +
  46 + // check epoll, some old linux donot support epoll.
  47 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/162
  48 + if (!srs_st_epoll_is_supported()) {
  49 + ret = ERROR_ST_SET_EPOLL;
  50 + srs_error("epoll required. ret=%d", ret);
  51 + return ret;
  52 + }
  53 +
  54 + // use linux epoll.
  55 + if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {
  56 + ret = ERROR_ST_SET_EPOLL;
  57 + srs_error("st_set_eventsys use linux epoll failed. ret=%d", ret);
  58 + return ret;
  59 + }
  60 + srs_verbose("st_set_eventsys use linux epoll success");
  61 +
  62 + if(st_init() != 0){
  63 + ret = ERROR_ST_INITIALIZE;
  64 + srs_error("st_init failed. ret=%d", ret);
  65 + return ret;
  66 + }
  67 + srs_verbose("st_init success");
  68 +
  69 + return ret;
  70 +}
  71 +
26 void srs_close_stfd(st_netfd_t& stfd) 72 void srs_close_stfd(st_netfd_t& stfd)
27 { 73 {
28 if (stfd) { 74 if (stfd) {
@@ -32,6 +32,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -32,6 +32,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 32
33 #include <st.h> 33 #include <st.h>
34 34
  35 +// initialize st, requires epoll.
  36 +extern int srs_init_st();
  37 +
35 // close the netfd, and close the underlayer fd. 38 // close the netfd, and close the underlayer fd.
36 extern void srs_close_stfd(st_netfd_t& stfd); 39 extern void srs_close_stfd(st_netfd_t& stfd);
37 40
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "221" 34 +#define VERSION_REVISION "222"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"