ssize_t iio_buffer_push(struct iio_buffer *buffer) { const struct iio_device *dev = buffer->dev; ssize_t ret; if (buffer->dev_is_high_speed) { void *buf; ret = dev->ctx->ops->get_buffer(dev, &buf, buffer->data_length, buffer->mask, dev->words); if (ret >= 0) { buffer->buffer = buf; ret = (ssize_t) buffer->data_length; } } else { void *ptr = buffer->buffer; size_t tmp_len; /* iio_device_write_raw doesn't guarantee that all bytes are * written */ for (tmp_len = buffer->data_length; tmp_len; ) { ret = iio_device_write_raw(dev, ptr, tmp_len); if (ret < 0) goto out_reset_data_length; tmp_len -= ret; ptr = (void *) ((uintptr_t) ptr + ret); } ret = (ssize_t) buffer->data_length; } out_reset_data_length: buffer->data_length = buffer->length; return ret; }
ssize_t iio_buffer_push(struct iio_buffer *buffer) { const struct iio_device *dev = buffer->dev; if (buffer->dev_is_high_speed) { void *buf; ssize_t ret = dev->ctx->ops->get_buffer(dev, &buf, buffer->length, buffer->mask, dev->words); if (ret >= 0) buffer->buffer = buf; return ret; } else { size_t length = buffer->length; void *ptr = buffer->buffer; /* iio_device_write_raw doesn't guarantee that all bytes are * written */ while (length) { ssize_t ret = iio_device_write_raw(dev, ptr, length); if (ret < 0) return ret; length -= ret; ptr = (void *) ((uintptr_t) ptr + ret); } return (ssize_t) buffer->length; } }