Exemplo n.º 1
0
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");
}
Exemplo n.º 2
0
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");
}
Exemplo n.º 3
0
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");
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}