/** * Dequeue the next buffer from a queue and return it. * This functions sets buffer's internal data pointer * to the beginning of serialized data by calling aura_buffer_rewind() internally * @param head * @return */ struct aura_buffer *aura_dequeue_buffer(struct list_head *head) { struct aura_buffer *ret; ret = aura_peek_buffer(head); if (ret) { list_del(head->next); aura_buffer_rewind(ret); } return ret; }
static void susb_handle_event(struct aura_node *node, enum node_event evt, const struct aura_pollfds *fd) { struct aura_buffer *buf; struct usb_dev_info *inf = aura_get_transportdata(node); ncusb_handle_events_nonblock_once(node, inf->ctx, inf->timer); if (inf->cbusy) return; if (evt == NODE_EVENT_STARTED) { aura_etable_activate(inf->etbl); /* Activate our export table * Hack: Since libusb tends to send and receive data in one buffer, * we need to adjust argument buffer to fit in return values as well. * It helps us to avoid needless copying. */ int i; for (i = 0; i < inf->etbl->next; i++) { struct aura_object *tmp; tmp = &inf->etbl->objects[i]; tmp->arglen += tmp->retlen; } inf->etbl = NULL; ncusb_watch_for_device(inf->ctx, &inf->dev_descr); ncusb_start_descriptor_watching(node, inf->ctx); slog(1, SLOG_INFO, "usb: Now looking for a device %x:%x %s/%s/%s", inf->dev_descr.vid, inf->dev_descr.pid, inf->dev_descr.vendor, inf->dev_descr.product, inf->dev_descr.serial); } else if (inf->state == SUSB_DEVICE_RESTART) { susb_offline_transport(inf); } else if (inf->state == SUSB_DEVICE_OPERATIONAL) { buf = aura_peek_buffer(&node->outbound_buffers); if (buf) susb_issue_call(node, buf); } }