4
Fork 0
CronosAgent/RingBuffer.c
Artem Prilutskiy 8798385d40 1. Fixed issue with length field of keep-alive packet
2. Extended amount of elements in RingBuffer, reduced item length
3. Added system information into keep-alive
4. Updated version number
2016-08-11 09:13:10 +03:00

47 lines
1.1 KiB
C

#include "RingBuffer.h"
#include <string.h>
#include <unistd.h>
void PokeData(struct RingBuffer* buffer, uint32_t number, uint8_t* data, size_t length)
{
number %= BUFFER_LENGTH;
buffer->delay += buffer->marks == 0; // Postpone processing if buffer empty
buffer->marks |= 1 << number; // Set processing mark for the record
struct BufferRecord* record = buffer->records + number;
record->length = length;
memcpy(record->data, data, length);
}
void ProcessBuffer(struct RingBuffer* buffer, int handle, struct sockaddr_in* address)
{
if (buffer->marks == 0)
{
// Nothing to process
return;
}
if (buffer->delay > 0)
{
// Processing was postponed
buffer->delay --;
return;
}
size_t mark = 1 << buffer->index;
if (buffer->marks & mark)
{
// Transmit scheduled data
struct BufferRecord* record = buffer->records + buffer->index;
sendto(handle, record->data, record->length, 0, (struct sockaddr*)address, sizeof(struct sockaddr_in));
// Clear processing mark
buffer->marks ^= mark;
}
buffer->index ++;
buffer->index %= BUFFER_LENGTH;
}