winlin

refine code for reload http api/stream

@@ -48,14 +48,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -48,14 +48,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
48 #define SERVER_LISTEN_BACKLOG 512 48 #define SERVER_LISTEN_BACKLOG 512
49 #define SRS_TIME_RESOLUTION_MS 500 49 #define SRS_TIME_RESOLUTION_MS 500
50 50
51 -SrsListener::SrsListener(SrsServer* _server, SrsListenerType _type) 51 +SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
52 { 52 {
53 fd = -1; 53 fd = -1;
54 stfd = NULL; 54 stfd = NULL;
55 55
56 - port = 0;  
57 - server = _server;  
58 - type = _type; 56 + _port = 0;
  57 + _server = server;
  58 + _type = type;
59 59
60 pthread = new SrsThread(this, 0); 60 pthread = new SrsThread(this, 0);
61 } 61 }
@@ -72,11 +72,16 @@ SrsListener::~SrsListener() @@ -72,11 +72,16 @@ SrsListener::~SrsListener()
72 close(fd); 72 close(fd);
73 } 73 }
74 74
75 -int SrsListener::listen(int _port) 75 +SrsListenerType SrsListener::type()
  76 +{
  77 + return _type;
  78 +}
  79 +
  80 +int SrsListener::listen(int port)
76 { 81 {
77 int ret = ERROR_SUCCESS; 82 int ret = ERROR_SUCCESS;
78 83
79 - port = _port; 84 + _port = port;
80 85
81 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 86 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
82 ret = ERROR_SOCKET_CREATE; 87 ret = ERROR_SOCKET_CREATE;
@@ -95,7 +100,7 @@ int SrsListener::listen(int _port) @@ -95,7 +100,7 @@ int SrsListener::listen(int _port)
95 100
96 sockaddr_in addr; 101 sockaddr_in addr;
97 addr.sin_family = AF_INET; 102 addr.sin_family = AF_INET;
98 - addr.sin_port = htons(port); 103 + addr.sin_port = htons(_port);
99 addr.sin_addr.s_addr = INADDR_ANY; 104 addr.sin_addr.s_addr = INADDR_ANY;
100 if (bind(fd, (const sockaddr*)&addr, sizeof(sockaddr_in)) == -1) { 105 if (bind(fd, (const sockaddr*)&addr, sizeof(sockaddr_in)) == -1) {
101 ret = ERROR_SOCKET_BIND; 106 ret = ERROR_SOCKET_BIND;
@@ -124,14 +129,14 @@ int SrsListener::listen(int _port) @@ -124,14 +129,14 @@ int SrsListener::listen(int _port)
124 } 129 }
125 srs_verbose("create st listen thread success."); 130 srs_verbose("create st listen thread success.");
126 131
127 - srs_trace("server started, listen at port=%d, type=%d, fd=%d", port, type, fd); 132 + srs_trace("server started, listen at port=%d, type=%d, fd=%d", _port, _type, fd);
128 133
129 return ret; 134 return ret;
130 } 135 }
131 136
132 void SrsListener::on_thread_start() 137 void SrsListener::on_thread_start()
133 { 138 {
134 - srs_trace("listen cycle start, port=%d, type=%d, fd=%d", port, type, fd); 139 + srs_trace("listen cycle start, port=%d, type=%d, fd=%d", _port, _type, fd);
135 } 140 }
136 141
137 int SrsListener::cycle() 142 int SrsListener::cycle()
@@ -147,7 +152,7 @@ int SrsListener::cycle() @@ -147,7 +152,7 @@ int SrsListener::cycle()
147 } 152 }
148 srs_verbose("get a client. fd=%d", st_netfd_fileno(client_stfd)); 153 srs_verbose("get a client. fd=%d", st_netfd_fileno(client_stfd));
149 154
150 - if ((ret = server->accept_client(type, client_stfd)) != ERROR_SUCCESS) { 155 + if ((ret = _server->accept_client(_type, client_stfd)) != ERROR_SUCCESS) {
151 srs_warn("accept client error. ret=%d", ret); 156 srs_warn("accept client error. ret=%d", ret);
152 return ret; 157 return ret;
153 } 158 }
@@ -188,7 +193,9 @@ SrsServer::~SrsServer() @@ -188,7 +193,9 @@ SrsServer::~SrsServer()
188 conns.clear(); 193 conns.clear();
189 } 194 }
190 195
191 - close_listeners(); 196 + close_listeners(SrsListenerRtmpStream);
  197 + close_listeners(SrsListenerHttpApi);
  198 + close_listeners(SrsListenerHttpStream);
192 199
193 if (pid_fd > 0) { 200 if (pid_fd > 0) {
194 ::close(pid_fd); 201 ::close(pid_fd);
@@ -351,50 +358,17 @@ int SrsServer::listen() @@ -351,50 +358,17 @@ int SrsServer::listen()
351 { 358 {
352 int ret = ERROR_SUCCESS; 359 int ret = ERROR_SUCCESS;
353 360
354 - SrsConfDirective* conf = NULL;  
355 -  
356 - // stream service port.  
357 - conf = _srs_config->get_listen();  
358 - srs_assert(conf);  
359 -  
360 - close_listeners();  
361 -  
362 - for (int i = 0; i < (int)conf->args.size(); i++) {  
363 - SrsListener* listener = new SrsListener(this, SrsListenerRtmpStream);  
364 - listeners.push_back(listener);  
365 -  
366 - int port = ::atoi(conf->args.at(i).c_str());  
367 - if ((ret = listener->listen(port)) != ERROR_SUCCESS) {  
368 - srs_error("RTMP stream listen at port %d failed. ret=%d", port, ret);  
369 - return ret;  
370 - } 361 + if ((ret = listen_rtmp()) != ERROR_SUCCESS) {
  362 + return ret;
371 } 363 }
372 -  
373 -#ifdef SRS_HTTP_API  
374 - if (_srs_config->get_http_api_enabled()) {  
375 - SrsListener* listener = new SrsListener(this, SrsListenerHttpApi);  
376 - listeners.push_back(listener);  
377 -  
378 - int port = _srs_config->get_http_api_listen();  
379 - if ((ret = listener->listen(port)) != ERROR_SUCCESS) {  
380 - srs_error("HTTP api listen at port %d failed. ret=%d", port, ret);  
381 - return ret;  
382 - } 364 +
  365 + if ((ret = listen_http_api()) != ERROR_SUCCESS) {
  366 + return ret;
383 } 367 }
384 -#endif  
385 368
386 -#ifdef SRS_HTTP_SERVER  
387 - if (_srs_config->get_http_stream_enabled()) {  
388 - SrsListener* listener = new SrsListener(this, SrsListenerHttpStream);  
389 - listeners.push_back(listener);  
390 -  
391 - int port = _srs_config->get_http_stream_listen();  
392 - if ((ret = listener->listen(port)) != ERROR_SUCCESS) {  
393 - srs_error("HTTP stream listen at port %d failed. ret=%d", port, ret);  
394 - return ret;  
395 - } 369 + if ((ret = listen_http_stream()) != ERROR_SUCCESS) {
  370 + return ret;
396 } 371 }
397 -#endif  
398 372
399 return ret; 373 return ret;
400 } 374 }
@@ -492,14 +466,86 @@ void SrsServer::on_signal(int signo) @@ -492,14 +466,86 @@ void SrsServer::on_signal(int signo)
492 } 466 }
493 } 467 }
494 468
495 -void SrsServer::close_listeners() 469 +int SrsServer::listen_rtmp()
  470 +{
  471 + int ret = ERROR_SUCCESS;
  472 +
  473 + // stream service port.
  474 + SrsConfDirective* conf = _srs_config->get_listen();
  475 + srs_assert(conf);
  476 +
  477 + close_listeners(SrsListenerRtmpStream);
  478 +
  479 + for (int i = 0; i < (int)conf->args.size(); i++) {
  480 + SrsListener* listener = new SrsListener(this, SrsListenerRtmpStream);
  481 + listeners.push_back(listener);
  482 +
  483 + int port = ::atoi(conf->args.at(i).c_str());
  484 + if ((ret = listener->listen(port)) != ERROR_SUCCESS) {
  485 + srs_error("RTMP stream listen at port %d failed. ret=%d", port, ret);
  486 + return ret;
  487 + }
  488 + }
  489 +
  490 + return ret;
  491 +}
  492 +
  493 +int SrsServer::listen_http_api()
  494 +{
  495 + int ret = ERROR_SUCCESS;
  496 +
  497 +#ifdef SRS_HTTP_API
  498 + close_listeners(SrsListenerHttpApi);
  499 + if (_srs_config->get_http_api_enabled()) {
  500 + SrsListener* listener = new SrsListener(this, SrsListenerHttpApi);
  501 + listeners.push_back(listener);
  502 +
  503 + int port = _srs_config->get_http_api_listen();
  504 + if ((ret = listener->listen(port)) != ERROR_SUCCESS) {
  505 + srs_error("HTTP api listen at port %d failed. ret=%d", port, ret);
  506 + return ret;
  507 + }
  508 + }
  509 +#endif
  510 +
  511 + return ret;
  512 +}
  513 +
  514 +int SrsServer::listen_http_stream()
  515 +{
  516 + int ret = ERROR_SUCCESS;
  517 +
  518 +#ifdef SRS_HTTP_SERVER
  519 + close_listeners(SrsListenerHttpStream);
  520 + if (_srs_config->get_http_stream_enabled()) {
  521 + SrsListener* listener = new SrsListener(this, SrsListenerHttpStream);
  522 + listeners.push_back(listener);
  523 +
  524 + int port = _srs_config->get_http_stream_listen();
  525 + if ((ret = listener->listen(port)) != ERROR_SUCCESS) {
  526 + srs_error("HTTP stream listen at port %d failed. ret=%d", port, ret);
  527 + return ret;
  528 + }
  529 + }
  530 +#endif
  531 +
  532 + return ret;
  533 +}
  534 +
  535 +void SrsServer::close_listeners(SrsListenerType type)
496 { 536 {
497 std::vector<SrsListener*>::iterator it; 537 std::vector<SrsListener*>::iterator it;
498 - for (it = listeners.begin(); it != listeners.end(); ++it) { 538 + for (it = listeners.begin(); it != listeners.end();) {
499 SrsListener* listener = *it; 539 SrsListener* listener = *it;
  540 +
  541 + if (listener->type() != type) {
  542 + ++it;
  543 + continue;
  544 + }
  545 +
500 srs_freep(listener); 546 srs_freep(listener);
  547 + it = listeners.erase(it);
501 } 548 }
502 - listeners.clear();  
503 } 549 }
504 550
505 int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) 551 int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd)
@@ -56,17 +56,18 @@ enum SrsListenerType @@ -56,17 +56,18 @@ enum SrsListenerType
56 class SrsListener : public ISrsThreadHandler 56 class SrsListener : public ISrsThreadHandler
57 { 57 {
58 public: 58 public:
59 - SrsListenerType type; 59 + SrsListenerType _type;
60 private: 60 private:
61 int fd; 61 int fd;
62 st_netfd_t stfd; 62 st_netfd_t stfd;
63 - int port;  
64 - SrsServer* server; 63 + int _port;
  64 + SrsServer* _server;
65 SrsThread* pthread; 65 SrsThread* pthread;
66 public: 66 public:
67 - SrsListener(SrsServer* _server, SrsListenerType _type); 67 + SrsListener(SrsServer* _server, SrsListenerType type);
68 virtual ~SrsListener(); 68 virtual ~SrsListener();
69 public: 69 public:
  70 + virtual SrsListenerType type();
70 virtual int listen(int port); 71 virtual int listen(int port);
71 // interface ISrsThreadHandler. 72 // interface ISrsThreadHandler.
72 public: 73 public:
@@ -106,7 +107,10 @@ public: @@ -106,7 +107,10 @@ public:
106 virtual void remove(SrsConnection* conn); 107 virtual void remove(SrsConnection* conn);
107 virtual void on_signal(int signo); 108 virtual void on_signal(int signo);
108 private: 109 private:
109 - virtual void close_listeners(); 110 + virtual int listen_rtmp();
  111 + virtual int listen_http_api();
  112 + virtual int listen_http_stream();
  113 + virtual void close_listeners(SrsListenerType type);
110 virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd); 114 virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd);
111 // interface ISrsThreadHandler. 115 // interface ISrsThreadHandler.
112 public: 116 public: