From 92ff097d7ee769de1b3a3040e1bdf62935e28905 Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Thu, 8 Apr 2021 08:42:53 +0300 Subject: [PATCH] show memsink has_client in the /state --- src/libs/memsink.c | 9 +++++---- src/libs/memsink.h | 3 ++- src/ustreamer/http/server.c | 27 +++++++++++++++++++++++++++ src/ustreamer/stream.c | 4 ++-- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/libs/memsink.c b/src/libs/memsink.c index a5db912..c24f8f9 100644 --- a/src/libs/memsink.c +++ b/src/libs/memsink.c @@ -37,6 +37,7 @@ memsink_s *memsink_init( sink->timeout = timeout; sink->fd = -1; sink->mem = MAP_FAILED; + atomic_init(&sink->has_clients, false); LOG_INFO("Using %s-sink: %s", name, obj); @@ -92,16 +93,16 @@ bool memsink_server_check(memsink_s *sink, const frame_s *frame) { if (flock(sink->fd, LOCK_EX | LOCK_NB) < 0) { if (errno == EWOULDBLOCK) { - sink->has_clients = true; + atomic_store(&sink->has_clients, true); return true; } LOG_PERROR("%s-sink: Can't lock memory", sink->name); return false; } - sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()); + atomic_store(&sink->has_clients, (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic())); - bool retval = (sink->has_clients || !FRAME_COMPARE_META_USED_NOTS(sink->mem, frame)); + bool retval = (atomic_load(&sink->has_clients) || !FRAME_COMPARE_META_USED_NOTS(sink->mem, frame)); if (flock(sink->fd, LOCK_UN) < 0) { LOG_PERROR("%s-sink: Can't unlock memory", sink->name); @@ -133,7 +134,7 @@ int memsink_server_put(memsink_s *sink, const frame_s *frame) { sink->mem->magic = MEMSINK_MAGIC; sink->mem->version = MEMSINK_VERSION; - sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()); + atomic_store(&sink->has_clients, (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic())); if (flock(sink->fd, LOCK_UN) < 0) { LOG_PERROR("%s-sink: Can't unlock memory", sink->name); diff --git a/src/libs/memsink.h b/src/libs/memsink.h index 8a74e55..072d123 100644 --- a/src/libs/memsink.h +++ b/src/libs/memsink.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -51,7 +52,7 @@ typedef struct { int fd; memsink_shared_s *mem; uint64_t last_id; - bool has_clients; // Only for server + atomic_bool has_clients; // Only for server } memsink_s; diff --git a/src/ustreamer/http/server.c b/src/ustreamer/http/server.c index ac6ca32..1b60810 100644 --- a/src/ustreamer/http/server.c +++ b/src/ustreamer/http/server.c @@ -342,6 +342,7 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server) encoder_type_to_string(enc_type), enc_quality )); + # ifdef WITH_OMX if (STREAM(run->h264)) { assert(evbuffer_add_printf(buf, @@ -352,6 +353,32 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server) )); } # endif + + if ( + STREAM(sink) +# ifdef WITH_OMX + || STREAM(h264_sink) +# endif + ) { + assert(evbuffer_add_printf(buf, " \"sinks\": {")); + if (STREAM(sink)) { + assert(evbuffer_add_printf(buf, + "\"jpeg\": {\"has_clients\": %s}", + bool_to_string(atomic_load(&STREAM(sink->has_clients))) + )); + } +# ifdef WITH_OMX + if (STREAM(h264_sink)) { + assert(evbuffer_add_printf(buf, + "%s\"h264\": {\"has_clients\": %s}", + (STREAM(sink) ? ", " : ""), + bool_to_string(atomic_load(&STREAM(h264_sink->has_clients))) + )); + } +# endif + assert(evbuffer_add_printf(buf, "},")); + } + assert(evbuffer_add_printf(buf, " \"source\": {\"resolution\": {\"width\": %u, \"height\": %u}," " \"online\": %s, \"desired_fps\": %u, \"captured_fps\": %u}," diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index f39761c..6a9c4ab 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -136,9 +136,9 @@ void stream_loop(stream_s *stream) { && !atomic_load(&RUN(stop)) && !atomic_load(&RUN(video->has_clients)) // has_clients синков НЕ обновляются в реальном времени - && (stream->sink == NULL || !stream->sink->has_clients) + && (stream->sink == NULL || !atomic_load(&stream->sink->has_clients)) # ifdef WITH_OMX - && (RUN(h264) == NULL || /*RUN(h264->sink) == NULL ||*/ !RUN(h264->sink->has_clients)) + && (RUN(h264) == NULL || /*RUN(h264->sink) == NULL ||*/ !atomic_load(&RUN(h264->sink->has_clients))) # endif ) { usleep(100000);