1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

fix bug #34: convert signal to io. 0.9.85

This commit is contained in:
winlin 2014-04-30 11:26:32 +08:00
parent a14220d4fb
commit d0dff2d332
5 changed files with 166 additions and 15 deletions

View file

@ -70,6 +70,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_MEMINFO_RESOLUTION_TIMES
#define SRS_SYS_MEMINFO_RESOLUTION_TIMES 60
#define SRS_SIGNAL_THREAD_INTERVAL (int64_t)(100*1000LL)
SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
{
fd = -1;
@ -184,12 +186,117 @@ int SrsListener::cycle()
return ret;
}
SrsSignalManager* SrsSignalManager::instance = NULL;
SrsSignalManager::SrsSignalManager(SrsServer* server)
{
SrsSignalManager::instance = this;
_server = server;
sig_pipe[0] = sig_pipe[1] = -1;
pthread = new SrsThread(this, SRS_SIGNAL_THREAD_INTERVAL);
signal_read_stfd = NULL;
}
SrsSignalManager::~SrsSignalManager()
{
pthread->stop();
srs_freep(pthread);
srs_close_stfd(signal_read_stfd);
if (sig_pipe[0] > 0) {
::close(sig_pipe[0]);
}
if (sig_pipe[1] > 0) {
::close(sig_pipe[1]);
}
}
int SrsSignalManager::initialize()
{
int ret = ERROR_SUCCESS;
return ret;
}
int SrsSignalManager::start()
{
int ret = ERROR_SUCCESS;
/**
* Note that if multiple processes are used (see below),
* the signal pipe should be initialized after the fork(2) call
* so that each process has its own private pipe.
*/
struct sigaction sa;
/* Create signal pipe */
if (pipe(sig_pipe) < 0) {
ret = ERROR_SYSTEM_CREATE_PIPE;
srs_error("create signal manager pipe failed. ret=%d", ret);
return ret;
}
/* Install sig_catcher() as a signal handler */
sa.sa_handler = SrsSignalManager::sig_catcher;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGNAL_RELOAD, &sa, NULL);
sa.sa_handler = SrsSignalManager::sig_catcher;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGTERM, &sa, NULL);
sa.sa_handler = SrsSignalManager::sig_catcher;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
return pthread->start();
}
int SrsSignalManager::cycle()
{
int ret = ERROR_SUCCESS;
if (signal_read_stfd == NULL) {
signal_read_stfd = st_netfd_open(sig_pipe[0]);
}
int signo;
/* Read the next signal from the pipe */
st_read(signal_read_stfd, &signo, sizeof(int), ST_UTIME_NO_TIMEOUT);
/* Process signal synchronously */
_server->on_signal(signo);
return ret;
}
void SrsSignalManager::sig_catcher(int signo)
{
int err;
/* Save errno to restore it after the write() */
err = errno;
/* write() is reentrant/async-safe */
int fd = SrsSignalManager::instance->sig_pipe[1];
write(fd, &signo, sizeof(int));
errno = err;
}
SrsServer::SrsServer()
{
signal_reload = false;
signal_gmc_stop = false;
pid_fd = -1;
signal_manager = new SrsSignalManager(this);
// donot new object in constructor,
// for some global instance is not ready now,
// new these objects in initialize instead.
@ -226,6 +333,8 @@ SrsServer::~SrsServer()
pid_fd = -1;
}
srs_freep(signal_manager);
#ifdef SRS_AUTO_HTTP_API
srs_freep(http_api_handler);
#endif
@ -276,6 +385,11 @@ int SrsServer::initialize()
return ret;
}
int SrsServer::initialize_signal()
{
return signal_manager->initialize();
}
int SrsServer::acquire_pid_file()
{
int ret = ERROR_SUCCESS;
@ -397,6 +511,12 @@ int SrsServer::listen()
return ret;
}
int SrsServer::register_signal()
{
// start signal process thread.
return signal_manager->start();
}
int SrsServer::ingest()
{
int ret = ERROR_SUCCESS;