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:
parent
a14220d4fb
commit
d0dff2d332
5 changed files with 166 additions and 15 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue