static void async_callback(struct libusb_transfer *transfer)
{
    if (libusb_state != LIB_USB_TRANSFERS_ALLOCATED)  return;
    int r;
    // log_info("begin async_callback endpoint %x, status %x, actual length %u", transfer->endpoint, transfer->status, transfer->actual_length );

    if (transfer->status == LIBUSB_TRANSFER_COMPLETED) {
        queue_transfer(transfer);
    } else if (transfer->status == LIBUSB_TRANSFER_STALL){
        log_info("-> Transfer stalled, trying again");
        r = libusb_clear_halt(handle, transfer->endpoint);
        if (r) {
            log_error("Error rclearing halt %d", r);
        }
        r = libusb_submit_transfer(transfer);
        if (r) {
            log_error("Error re-submitting transfer %d", r);
        }
    } else {
        log_info("async_callback. not data -> resubmit transfer, endpoint %x, status %x, length %u", transfer->endpoint, transfer->status, transfer->actual_length);
        // No usable data, just resubmit packet
        r = libusb_submit_transfer(transfer);
        if (r) {
            log_error("Error re-submitting transfer %d", r);
        }
    }
    // log_info("end async_callback");
}
예제 #2
0
파일: SPI.cpp 프로젝트: sg-/mbed-drivers
int SPI::transfer(const Buffer& tx, const Buffer& rx, const event_callback_t& callback, int event) {
    if (spi_active(&_spi)) {
        return queue_transfer(tx, rx, callback, event);
    }
    start_transfer(tx, rx, callback, event);
    return 0;
}
예제 #3
0
파일: echidna.c 프로젝트: hyeshik/echidna
static int
handle_input_from_worker_line(SESSION *sess, WORKER *worker)
{
    char *head, *tail, *cur, *leftend, *rightend;

    head = cur = worker->inbuf->data + worker->inbuf->front;
    leftend = worker->inbuf->data;
    rightend = worker->inbuf->data + worker->inbuf->size;
    tail = worker->inbuf->data + worker->inbuf->rear;

    while (cur != tail) {
        if (*cur == '\n') {
            qsize_t recordsize;

            worker->lineno++;
            recordsize = (head <= cur ? cur + 1 - head :
                            (rightend - head) + (cur + 1 - leftend));

            if (queue_transfer(sess->outbuf, worker->inbuf, recordsize) == -1)
                break; /* TODO: handle records way too big in outbuf. */

            head = cur + 1;
        }

        if (++cur == rightend)
            cur = leftend;
    }

    return 0;
}
예제 #4
0
파일: SPI.cpp 프로젝트: hasnainvirk/mbed-os
int SPI::transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t& callback, int event)
{
    if (spi_active(&_spi)) {
        return queue_transfer(tx_buffer, tx_length, rx_buffer, rx_length, bit_width, callback, event);
    }
    start_transfer(tx_buffer, tx_length, rx_buffer, rx_length, bit_width, callback, event);
    return 0;
}
예제 #5
0
파일: echidna.c 프로젝트: hyeshik/echidna
static int
handle_input_from_worker_fastq(SESSION *sess, WORKER *worker)
{
    char *head, *tail, *cur, *leftend, *rightend;
    int line_in_record;

    head = cur = worker->inbuf->data + worker->inbuf->front;
    leftend = worker->inbuf->data;
    rightend = worker->inbuf->data + worker->inbuf->size;
    tail = worker->inbuf->data + worker->inbuf->rear;

    line_in_record = 0;

    while (cur != tail) {
        if (*cur == '\n' && ++line_in_record == 4) {
            qsize_t recordsize;

            recordsize = (head <= cur ? cur + 1 - head :
                          (rightend - head) + (cur + 1 - leftend));

            if (*head != '@')
                error(0, "(worker %d) Unaligned FASTQ input at"
                        " line no %d\n", worker->workerid, worker->lineno);

            if (queue_transfer(sess->outbuf, worker->inbuf, recordsize) == -1)
                break;
            /* TODO: handle records way too big in outbuf. */
            //errx(13, "line %ld: found a too large record. (1)\n",
            //         sess->lineno);

            // intended duplication of code for optimized running
            cur++;
            if (cur == rightend)
                cur = leftend;

            head = cur;
            worker->lineno += 4;
            line_in_record = 0;

            if (head != leftend + worker->inbuf->front)
                error(0, "Internal programming error: head and front "
                         "mismatching - %p, %p, %d\n",
                         head, leftend, worker->inbuf->front);
        }
        else {
            cur++;
            if (cur == rightend)
                cur = leftend;
        }
    }

    return 0;
}
예제 #6
0
파일: echidna.c 프로젝트: hyeshik/echidna
static int
handle_input_from_stdin_fasta(SESSION *sess)
{
    char *head, *tail, *cur, *leftend, *rightend;
    int i, header_read;

    head = cur = sess->inbuf->data + sess->inbuf->front;
    leftend = sess->inbuf->data;
    rightend = sess->inbuf->data + sess->inbuf->size;
    tail = sess->inbuf->data + sess->inbuf->rear;

    header_read = sess->inbuf->flags;

    while (cur != tail) {
        if (*cur == '\n')
            sess->lineno++;

        if (!header_read) {
            if (*cur == '\n')
                header_read = 1;
        }
        else if (*cur == '>') {
            qsize_t recordsize;

            recordsize = (head <= cur ? cur - head : (rightend - head) + (cur - leftend));

            for (i = 0; i < sess->num_workers; i++) {
                int wselected=(sess->rr_next + i) % sess->num_workers;

                if (queue_transfer(sess->workers[wselected].outbuf,
                                   sess->inbuf, recordsize) != -1) {
                    sess->rr_next = (sess->rr_next+1) % sess->num_workers;
                    break;
                }
                /* TODO: handle records way too big in outbuf. */
            }

            if (i == sess->num_workers) /* all buffers are full */
                break;

            head = cur;
            header_read = 0;
        }

        if (++cur == rightend)
            cur = leftend;
    }

    sess->inbuf->flags = header_read;
    return 0;
}
예제 #7
0
파일: echidna.c 프로젝트: hyeshik/echidna
static int
handle_input_from_stdin_fastq(SESSION *sess)
{
    char *head, *tail, *cur, *corner;
    int i, line_in_record;

    head = cur = sess->inbuf->data + sess->inbuf->front;
    corner = sess->inbuf->data + sess->inbuf->size;
    tail = sess->inbuf->data + sess->inbuf->rear;

    line_in_record = 0;

    while (cur != tail) {
        if (*cur == '\n' && ++line_in_record == 4) {
            qsize_t recordsize;

            recordsize = (head <= cur ? cur + 1 - head :
                          (corner - head) + (cur + 1 - sess->inbuf->data));

            for (i = 0; i < sess->num_workers; i++) {
                int wselected=(sess->rr_next + i) % sess->num_workers;

                if (*head != '@')
                    error(0, "Unaligned FASTQ input at line %d\n",
                          sess->lineno);

                if (queue_transfer(sess->workers[wselected].outbuf,
                                   sess->inbuf, recordsize) != -1) {
                    sess->rr_next = (sess->rr_next+1) % sess->num_workers;
                    break;
                }
                /* TODO: handle records way too big in outbuf. */
                //errx(13, "line %ld: found a too large record. (1)\n",
                //         sess->lineno);
            }

            if (i == sess->num_workers) /* all buffers are full */
                break;

            // intended duplication of code for optimized running
            cur++;
            if (cur == corner)
                cur = sess->inbuf->data;

            head = cur;
            sess->lineno += 4;
            line_in_record = 0;

            if (head != sess->inbuf->data + sess->inbuf->front)
                error(0, "Internal programming error: head and front "
                         "mismatching - %p, %p, %d\n",
                         head, sess->inbuf->data, sess->inbuf->front);
        }
        else {
            cur++;
            if (cur == corner)
                cur = sess->inbuf->data;
        }
    }

    return 0;
}