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"); }
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; }
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; }
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; }
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; }
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; }
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; }