int InputZeroMQReader::GetNextFrame(void* buffer)
{
    const size_t framesize = 6144;

    if (not worker_.is_running()) {
        return 0;
    }

    std::shared_ptr<std::vector<uint8_t> > incoming;

    /* Do some prebuffering because reads will happen in bursts
     * (4 ETI frames in TM1) and we should make sure that
     * we can serve the data required for a full transmission frame.
     */
    if (in_messages_.size() < 4) {
        const size_t prebuffering = 10;
        etiLog.log(trace, "ZMQ,wait1");
        in_messages_.wait_and_pop(incoming, prebuffering);
    }
    else {
        etiLog.log(trace, "ZMQ,wait2");
        in_messages_.wait_and_pop(incoming);
    }
    etiLog.log(trace, "ZMQ,pop");

    if (not worker_.is_running()) {
        throw zmq_input_overflow();
    }

    memcpy(buffer, &incoming->front(), framesize);

    return framesize;
}
Example #2
0
int InputZeroMQReader::GetNextFrame(void* buffer)
{
    const size_t framesize = 6144;

    uint8_t* incoming;
    in_messages_.wait_and_pop(incoming);

    if (! workerdata_.running) {
        throw zmq_input_overflow();
    }

    memcpy(buffer, incoming, framesize);

    delete incoming;

    return framesize;
}