示例#1
0
ssize_t device_write_consumer(gpointer devicep, queue_buffer_t *buffer) {
    Device* device;
    size_t write_size;
    gsize block_size;

    device = DEVICE(devicep);

    block_size = device->block_size;
    write_size = MIN(buffer->data_size, block_size);

    /* we assume that the queueing module is providing us with
     * appropriately-sized blocks until the last block. */
    if (device_write_block(device, write_size,
                           buffer->data + buffer->offset)) {
        /* Success! */
        return write_size;
    } else {
        /* Nope, really an error. */
        return -1;
    }
}
示例#2
0
static gboolean
do_block(
    XferDestDevice *self,
    guint size,
    gpointer data)
{
    XferElement *elt = XFER_ELEMENT(self);

    if (device_write_block(self->device, size, data) != WRITE_SUCCEED) {
	xfer_cancel_with_error(elt, "%s: %s",
		self->device->device_name, device_error_or_status(self->device));
	wait_until_xfer_cancelled(elt->xfer);
	return FALSE;
    }

    /* check for LEOM */
    if (self->cancel_at_leom && self->device->is_eom) {
	xfer_cancel_with_error(elt, "%s: LEOM detected", self->device->device_name);
	wait_until_xfer_cancelled(elt->xfer);
	return FALSE;
    }

    return TRUE;
}