diff --git a/README.md b/README.md
index c2d1b3240..ba25489d1 100755
--- a/README.md
+++ b/README.md
@@ -208,6 +208,7 @@ Supported operating systems and hardware:
* 2013-10-17, Created.
## History
+* v1.0, 2014-09-30, fix [#162](https://github.com/winlinvip/simple-rtmp-server/issues/162), failed if no epoll. 0.9.222.
* 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.
* v1.0, 2014-09-26, fix hls bug, refine config and log, according to clion of jetbrains. 0.9.216.
* 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.
diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp
index 2c58cb58c..e0834aae4 100644
--- a/trunk/src/app/srs_app_server.cpp
+++ b/trunk/src/app/srs_app_server.cpp
@@ -528,20 +528,11 @@ int SrsServer::initialize_st()
{
int ret = ERROR_SUCCESS;
- // use linux epoll.
- if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {
- ret = ERROR_ST_SET_EPOLL;
- srs_error("st_set_eventsys use linux epoll failed. ret=%d", ret);
+ // init st
+ if ((ret = srs_init_st()) != ERROR_SUCCESS) {
+ srs_error("init st failed. ret=%d", ret);
return ret;
}
- srs_verbose("st_set_eventsys use linux epoll success");
-
- if(st_init() != 0){
- ret = ERROR_ST_INITIALIZE;
- srs_error("st_init failed. ret=%d", ret);
- return ret;
- }
- srs_verbose("st_init success");
// @remark, st alloc segment use mmap, which only support 32757 threads,
// if need to support more, for instance, 100k threads, define the macro MALLOC_STACK.
diff --git a/trunk/src/app/srs_app_st.cpp b/trunk/src/app/srs_app_st.cpp
index 916893186..7c0e41678 100644
--- a/trunk/src/app/srs_app_st.cpp
+++ b/trunk/src/app/srs_app_st.cpp
@@ -23,6 +23,52 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include
+#include
+#include
+
+#include
+bool srs_st_epoll_is_supported(void)
+{
+ struct epoll_event ev;
+
+ ev.events = EPOLLIN;
+ ev.data.ptr = NULL;
+ /* Guaranteed to fail */
+ epoll_ctl(-1, EPOLL_CTL_ADD, -1, &ev);
+
+ return (errno != ENOSYS);
+}
+
+int srs_init_st()
+{
+ int ret = ERROR_SUCCESS;
+
+ // check epoll, some old linux donot support epoll.
+ // @see https://github.com/winlinvip/simple-rtmp-server/issues/162
+ if (!srs_st_epoll_is_supported()) {
+ ret = ERROR_ST_SET_EPOLL;
+ srs_error("epoll required. ret=%d", ret);
+ return ret;
+ }
+
+ // use linux epoll.
+ if (st_set_eventsys(ST_EVENTSYS_ALT) == -1) {
+ ret = ERROR_ST_SET_EPOLL;
+ srs_error("st_set_eventsys use linux epoll failed. ret=%d", ret);
+ return ret;
+ }
+ srs_verbose("st_set_eventsys use linux epoll success");
+
+ if(st_init() != 0){
+ ret = ERROR_ST_INITIALIZE;
+ srs_error("st_init failed. ret=%d", ret);
+ return ret;
+ }
+ srs_verbose("st_init success");
+
+ return ret;
+}
+
void srs_close_stfd(st_netfd_t& stfd)
{
if (stfd) {
diff --git a/trunk/src/app/srs_app_st.hpp b/trunk/src/app/srs_app_st.hpp
index 81e725fcf..366abca0a 100644
--- a/trunk/src/app/srs_app_st.hpp
+++ b/trunk/src/app/srs_app_st.hpp
@@ -32,6 +32,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include
+// initialize st, requires epoll.
+extern int srs_init_st();
+
// close the netfd, and close the underlayer fd.
extern void srs_close_stfd(st_netfd_t& stfd);
diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp
index e0ed138b6..af99bc8a4 100644
--- a/trunk/src/core/srs_core.hpp
+++ b/trunk/src/core/srs_core.hpp
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version
#define VERSION_MAJOR "0"
#define VERSION_MINOR "9"
-#define VERSION_REVISION "221"
+#define VERSION_REVISION "222"
#define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
// server info.
#define RTMP_SIG_SRS_KEY "SRS"