mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-14 11:33:43 +00:00
notify parent using SIGUSR2
This commit is contained in:
@@ -50,6 +50,7 @@
|
|||||||
#include "../tools.h"
|
#include "../tools.h"
|
||||||
#include "../threading.h"
|
#include "../threading.h"
|
||||||
#include "../logging.h"
|
#include "../logging.h"
|
||||||
|
#include "../process.h"
|
||||||
#include "../picture.h"
|
#include "../picture.h"
|
||||||
#include "../encoder.h"
|
#include "../encoder.h"
|
||||||
#include "../stream.h"
|
#include "../stream.h"
|
||||||
@@ -176,6 +177,9 @@ int http_server_listen(struct http_server_t *server) {
|
|||||||
EXPOSED(expose_begin_ts) = get_now_monotonic();
|
EXPOSED(expose_begin_ts) = get_now_monotonic();
|
||||||
EXPOSED(expose_cmp_ts) = EXPOSED(expose_begin_ts);
|
EXPOSED(expose_cmp_ts) = EXPOSED(expose_begin_ts);
|
||||||
EXPOSED(expose_end_ts) = EXPOSED(expose_begin_ts);
|
EXPOSED(expose_end_ts) = EXPOSED(expose_begin_ts);
|
||||||
|
// See _http_exposed_refresh()
|
||||||
|
EXPOSED(notify_last_width) = EXPOSED(picture->width);
|
||||||
|
EXPOSED(notify_last_height) = EXPOSED(picture->height);
|
||||||
# undef EXPOSED
|
# undef EXPOSED
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -791,6 +795,25 @@ static void _http_exposed_refresh(UNUSED int fd, UNUSED short what, void *v_serv
|
|||||||
# undef UNLOCK_STREAM
|
# undef UNLOCK_STREAM
|
||||||
|
|
||||||
_http_queue_send_stream(server, stream_updated, picture_updated);
|
_http_queue_send_stream(server, stream_updated, picture_updated);
|
||||||
|
|
||||||
|
# define EXPOSED(_next) server->run->exposed->_next
|
||||||
|
|
||||||
|
if (
|
||||||
|
picture_updated
|
||||||
|
&& server->notify_parent
|
||||||
|
&& (
|
||||||
|
EXPOSED(notify_last_online) != EXPOSED(online)
|
||||||
|
|| EXPOSED(notify_last_width) != EXPOSED(picture->width)
|
||||||
|
|| EXPOSED(notify_last_height) != EXPOSED(picture->height)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
EXPOSED(notify_last_online) = EXPOSED(online);
|
||||||
|
EXPOSED(notify_last_width) = EXPOSED(picture->width);
|
||||||
|
EXPOSED(notify_last_height) = EXPOSED(picture->height);
|
||||||
|
process_notify_parent();
|
||||||
|
}
|
||||||
|
|
||||||
|
# undef EXPOSED
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _expose_new_picture_unsafe(struct http_server_t *server) {
|
static bool _expose_new_picture_unsafe(struct http_server_t *server) {
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ struct exposed_t {
|
|||||||
long double expose_cmp_ts;
|
long double expose_cmp_ts;
|
||||||
long double expose_end_ts;
|
long double expose_end_ts;
|
||||||
long double last_as_blank_ts;
|
long double last_as_blank_ts;
|
||||||
|
|
||||||
|
bool notify_last_online;
|
||||||
|
unsigned notify_last_width;
|
||||||
|
unsigned notify_last_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct http_server_runtime_t {
|
struct http_server_runtime_t {
|
||||||
@@ -100,6 +104,8 @@ struct http_server_t {
|
|||||||
unsigned fake_width;
|
unsigned fake_width;
|
||||||
unsigned fake_height;
|
unsigned fake_height;
|
||||||
|
|
||||||
|
bool notify_parent;
|
||||||
|
|
||||||
struct http_server_runtime_t *run;
|
struct http_server_runtime_t *run;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ enum _OPT_VALUES {
|
|||||||
#ifdef WITH_SETPROCTITLE
|
#ifdef WITH_SETPROCTITLE
|
||||||
_O_PROCESS_NAME_PREFIX,
|
_O_PROCESS_NAME_PREFIX,
|
||||||
#endif
|
#endif
|
||||||
|
_O_NOTIFY_PARENT,
|
||||||
|
|
||||||
_O_LOG_LEVEL,
|
_O_LOG_LEVEL,
|
||||||
_O_PERF,
|
_O_PERF,
|
||||||
@@ -180,6 +181,7 @@ static const struct option _LONG_OPTS[] = {
|
|||||||
#ifdef WITH_SETPROCTITLE
|
#ifdef WITH_SETPROCTITLE
|
||||||
{"process-name-prefix", required_argument, NULL, _O_PROCESS_NAME_PREFIX},
|
{"process-name-prefix", required_argument, NULL, _O_PROCESS_NAME_PREFIX},
|
||||||
#endif
|
#endif
|
||||||
|
{"notify-parent", no_argument, NULL, _O_NOTIFY_PARENT},
|
||||||
|
|
||||||
{"log-level", required_argument, NULL, _O_LOG_LEVEL},
|
{"log-level", required_argument, NULL, _O_LOG_LEVEL},
|
||||||
{"perf", no_argument, NULL, _O_PERF},
|
{"perf", no_argument, NULL, _O_PERF},
|
||||||
@@ -396,6 +398,7 @@ int options_parse(struct options_t *options, struct device_t *dev, struct encode
|
|||||||
# ifdef WITH_SETPROCTITLE
|
# ifdef WITH_SETPROCTITLE
|
||||||
case _O_PROCESS_NAME_PREFIX: OPT_SET(process_name_prefix, optarg);
|
case _O_PROCESS_NAME_PREFIX: OPT_SET(process_name_prefix, optarg);
|
||||||
# endif
|
# endif
|
||||||
|
case _O_NOTIFY_PARENT: OPT_SET(server->notify_parent, true);
|
||||||
|
|
||||||
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
case _O_LOG_LEVEL: OPT_NUMBER("--log-level", log_level, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, 0);
|
||||||
case _O_PERF: OPT_SET(log_level, LOG_LEVEL_PERF);
|
case _O_PERF: OPT_SET(log_level, LOG_LEVEL_PERF);
|
||||||
@@ -633,6 +636,8 @@ static void _help(struct device_t *dev, struct encoder_t *encoder, struct http_s
|
|||||||
#ifdef WITH_SETPROCTITLE
|
#ifdef WITH_SETPROCTITLE
|
||||||
printf(" --process-name-prefix <str> ── Set process name prefix which will be displayed in the process list\n");
|
printf(" --process-name-prefix <str> ── Set process name prefix which will be displayed in the process list\n");
|
||||||
printf(" like '<str>: ustreamer --blah-blah-blah'. Default: disabled.\n\n");
|
printf(" like '<str>: ustreamer --blah-blah-blah'. Default: disabled.\n\n");
|
||||||
|
printf(" --notify-parent ────────────── Send SIGUSR2 to the parent process when the stream parameters are changed.\n");
|
||||||
|
printf(" Checking changes is performed for the online flag and image resolution.\n\n");
|
||||||
#endif
|
#endif
|
||||||
printf("Logging options:\n");
|
printf("Logging options:\n");
|
||||||
printf("════════════════\n");
|
printf("════════════════\n");
|
||||||
|
|||||||
@@ -22,6 +22,12 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
# define HAS_PDEATHSIG
|
# define HAS_PDEATHSIG
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
@@ -32,19 +38,14 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAS_PDEATHSIG
|
|
||||||
# include <signal.h>
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#ifdef WITH_SETPROCTITLE
|
#ifdef WITH_SETPROCTITLE
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
# if defined(__linux__)
|
# if defined(__linux__)
|
||||||
# include <bsd/unistd.h>
|
# include <bsd/unistd.h>
|
||||||
# include <sys/types.h>
|
|
||||||
# elif (defined(__FreeBSD__) || defined(__DragonFly__))
|
# elif (defined(__FreeBSD__) || defined(__DragonFly__))
|
||||||
# include <unistd.h>
|
//# include <unistd.h>
|
||||||
# include <sys/types.h>
|
//# include <sys/types.h>
|
||||||
# elif (defined(__NetBSD__) || defined(__OpenBSD__)) // setproctitle() placed in stdlib.h
|
# elif (defined(__NetBSD__) || defined(__OpenBSD__)) // setproctitle() placed in stdlib.h
|
||||||
# else
|
# else
|
||||||
# error setproctitle() not implemented, you can disable it using WITH_SETPROCTITLE=0
|
# error setproctitle() not implemented, you can disable it using WITH_SETPROCTITLE=0
|
||||||
@@ -72,6 +73,7 @@ extern char **environ;
|
|||||||
|
|
||||||
#ifdef HAS_PDEATHSIG
|
#ifdef HAS_PDEATHSIG
|
||||||
INLINE int process_track_parent_death(void) {
|
INLINE int process_track_parent_death(void) {
|
||||||
|
pid_t parent = getppid();
|
||||||
int signum = SIGTERM;
|
int signum = SIGTERM;
|
||||||
# if defined(__linux__)
|
# if defined(__linux__)
|
||||||
int retval = prctl(PR_SET_PDEATHSIG, signum);
|
int retval = prctl(PR_SET_PDEATHSIG, signum);
|
||||||
@@ -85,8 +87,8 @@ INLINE int process_track_parent_death(void) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kill(getppid(), 0) < 0) {
|
if (kill(parent, 0) < 0) {
|
||||||
LOG_PERROR("The parent process is already dead");
|
LOG_PERROR("The parent process %d is already dead", parent);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,3 +130,11 @@ INLINE void process_set_name_prefix(int argc, char *argv[], const char *prefix)
|
|||||||
free(cmdline);
|
free(cmdline);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
INLINE void process_notify_parent(void) {
|
||||||
|
pid_t parent = getppid();
|
||||||
|
|
||||||
|
if (kill(parent, SIGUSR2) < 0) {
|
||||||
|
LOG_PERROR("Can't send SIGUSR2 to the parent process %d", parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user