void sxe_ring_buffer_join(void * base, SXE_RING_BUFFER_CONTEXT * context, bool replay_half) { SXEE80("sxe_ring_buffer_join()"); context->itteration = SXE_RING_BUFFER_ITERATION; context->data_block = SXE_RING_BUFFER_CURRENT; context->data_block_len = 0; if (replay_half) { if (SXE_RING_BUFFER_CURRENT - SXE_RING_BUFFER_ARRAY_BASE >= (int)(SXE_RING_BUFFER_SIZE / 2)) { // If the current pointer is over half way through SXEL90("Current pointer is more then half way through ring"); context->data_block = SXE_RING_BUFFER_CURRENT - (unsigned)(SXE_RING_BUFFER_SIZE / 2); } else if (SXE_RING_BUFFER_ITERATION == 0) { // First iteration, and havn't writen a half ring yet, go to the start of the array context->data_block = SXE_RING_BUFFER_ARRAY_BASE; } else { // else we have to go back an itteration SXEL90("Current pointer is less then half way through ring"); SXEL90("Going back an itteration"); context->itteration--; context->data_block = SXE_RING_BUFFER_CURRENT + (int)((SXE_RING_BUFFER_WRITEN_END - SXE_RING_BUFFER_ARRAY_BASE + 1) / 2); } } SXEL92("context data_block: %p, itteration: %u", context->data_block, context->itteration); SXER80("return"); }
void sxe_ring_buffer_force_ring_wrap(void * base) { SXEE80("sxe_ring_buffer_force_ring_wrap()"); SXE_RING_BUFFER_WRITEN_END = SXE_RING_BUFFER_CURRENT - 1; SXE_RING_BUFFER_CURRENT = SXE_RING_BUFFER_ARRAY_BASE; SXE_RING_BUFFER_ITERATION++; SXER80("return"); }
void sxe_ring_buffer_next_writable_block(void * base, SXE_RING_BUFFER_CONTEXT * context) { SXEE80("sxe_ring_buffer_next_writable_block()"); context->writable_block = SXE_RING_BUFFER_CURRENT; context->writable_block_len = SXE_RING_BUFFER_END - SXE_RING_BUFFER_CURRENT + 1; SXEA10(context->writable_block_len != 0, "The writable block length is not zero"); SXEL92("Writable block: %p, Writable block length: %u", context->writable_block, context->writable_block_len); SXER80("return"); }
static int sxe_sync_ev_socket(void) { int sock; SXEE80("sxe_sync_ev_socket()"); SXEA11((sock = socket(AF_INET, SOCK_DGRAM, 0)) != SXE_SOCKET_INVALID, "Error creating sync socket: %s", sxe_socket_get_last_error_as_str()); SXEA12(sxe_socket_set_nonblock(sock, 1) >= 0, "socket %d: couldn't set non-blocking flag: %s", sock, sxe_socket_get_last_error_as_str()); SXER81("return sock=%d", sock); return sock; }
static SXE_RETURN sxe_ring_buffer_check_over_run(void * base, SXE_RING_BUFFER_CONTEXT * context) { SXE_RETURN result = SXE_RETURN_OK; SXEE80("sxe_ring_buffer_check_over_run()"); SXEL92("ring context data_block: %p, itteration: %u", SXE_RING_BUFFER_CURRENT, SXE_RING_BUFFER_ITERATION); SXEL92("user context data_block: %p, itteration: %u", context->data_block, context->itteration); if ( (SXE_RING_BUFFER_ITERATION > (context->itteration + 1)) || ((SXE_RING_BUFFER_ITERATION > context->itteration) && (SXE_RING_BUFFER_CURRENT > context->data_block))) { SXEL90("This reader has fallen behind the writer!"); result = SXE_RETURN_ERROR_INTERNAL; SXEL90("Moving data_block to the start of the ring"); context->data_block = SXE_RING_BUFFER_CURRENT; context->itteration = SXE_RING_BUFFER_ITERATION; context->data_block_len = 0; } SXER81("return %s", sxe_return_to_string(result)); return result; }
SXE_RETURN sxe_ring_buffer_next_block(void * base, SXE_RING_BUFFER_CONTEXT * context) { SXE_RETURN result = SXE_RETURN_OK; SXEE80("sxe_ring_buffer_next_block()"); if ((result = sxe_ring_buffer_check_over_run(base, context)) == SXE_RETURN_ERROR_INTERNAL) { goto SXE_ERROR_OUT; } if (SXE_RING_BUFFER_CURRENT > context->data_block) { SXEL90("Reading up to the head of the ring"); context->data_block_len = SXE_RING_BUFFER_CURRENT - context->data_block; } else if (SXE_RING_BUFFER_CURRENT <= context->data_block && SXE_RING_BUFFER_ITERATION == context->itteration + 1 && SXE_RING_BUFFER_WRITEN_END == context->data_block - 1) { SXEL90("The ring was forced wrapped while context was at the head"); SXEL90("Wrap the ring and read up to the head"); context->data_block = SXE_RING_BUFFER_ARRAY_BASE; context->itteration++; context->data_block_len = SXE_RING_BUFFER_CURRENT - context->data_block; } else if (SXE_RING_BUFFER_ITERATION > context->itteration) { SXEL90("Reading to the end of the ring"); context->data_block_len = SXE_RING_BUFFER_WRITEN_END - context->data_block + 1; } else { SXEL90("Nothing to read"); } SXE_EARLY_OR_ERROR_OUT: SXEL93("context data_block: %p, data_block_len: %u itteration: %u", context->data_block, context->data_block_len, context->itteration); SXER81("return %s", sxe_return_to_string(result)); return result; }