added protocol version to memsink

This commit is contained in:
Devaev Maxim
2021-01-20 02:21:03 +03:00
parent 9be264e176
commit 5f11caf6fc
2 changed files with 19 additions and 9 deletions

View File

@@ -147,6 +147,7 @@ int memsink_server_put(memsink_s *sink, const frame_s *frame) {
sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic());
memcpy(sink->mem->data, frame->data, frame->used);
sink->mem->magic = MEMSINK_MAGIC;
sink->mem->version = MEMSINK_VERSION;
# undef COPY
if (flock(sink->fd, LOCK_UN) < 0) {
@@ -177,10 +178,15 @@ int memsink_client_get(memsink_s *sink, frame_s *frame) { // cppcheck-suppress u
return -1;
}
bool updated = false;
int retval = -2; // Not updated
if (sink->mem->magic == MEMSINK_MAGIC) {
updated = (sink->mem->id != sink->last_id);
if (updated) {
if (sink->mem->version != MEMSINK_VERSION) {
LOG_ERROR("%s-sink: Protocol version mismatch: sink=%u, required=%u",
sink->name, sink->mem->version, MEMSINK_VERSION);
retval = -1;
goto done;
}
if (sink->mem->id != sink->last_id) { // When updated
# define COPY(_field) frame->_field = sink->mem->_field
sink->last_id = sink->mem->id;
COPY(width);
@@ -193,15 +199,17 @@ int memsink_client_get(memsink_s *sink, frame_s *frame) { // cppcheck-suppress u
COPY(encode_end_ts);
frame_set_data(frame, sink->mem->data, sink->mem->used);
# undef COPY
retval = 0;
}
sink->mem->last_client_ts = get_now_monotonic();
}
if (flock(sink->fd, LOCK_UN) < 0) {
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
return -1;
}
return (updated ? 0 : -2);
done:
if (flock(sink->fd, LOCK_UN) < 0) {
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
return -1;
}
return retval;
}
static int _flock_timedwait_monotonic(int fd, long double timeout) {

View File

@@ -39,7 +39,8 @@
#include "frame.h"
#define MEMSINK_MAGIC ((uint64_t)0xCAFEBABECAFEBABE)
#define MEMSINK_MAGIC ((uint64_t)0xCAFEBABECAFEBABE)
#define MEMSINK_VERSION ((uint32_t)1)
#ifndef CFG_MEMSINK_MAX_DATA
# define CFG_MEMSINK_MAX_DATA 33554432
@@ -49,6 +50,7 @@
typedef struct {
uint64_t magic;
uint32_t version;
uint64_t id;
size_t used;
unsigned width;