static int wait_for_buffer(struct buffer_mgmt *b, unsigned int timeout_ms, const char *dbg_name, unsigned int dbg_idx) { int status; struct timespec timeout; if (timeout_ms == 0) { log_verbose("%s: Infinite wait for [%d] to fill.\n", dbg_name, dbg_idx); status = pthread_cond_wait(&b->buf_ready, &b->lock); } else { log_verbose("%s: Timed wait for [%d] to fill.\n", dbg_name, dbg_idx); status = populate_abs_timeout(&timeout, timeout_ms); if (status == 0) { status = pthread_cond_timedwait(&b->buf_ready, &b->lock, &timeout); } } if (status == ETIMEDOUT) { status = BLADERF_ERR_TIMEOUT; } else if (status != 0) { status = BLADERF_ERR_UNEXPECTED; } return status; }
/* The top-level code will have aquired the stream->lock for us */ int lusb_submit_stream_buffer(void *driver, struct bladerf_stream *stream, void *buffer, unsigned int timeout_ms, bool nonblock) { int status = 0; struct lusb_stream_data *stream_data = stream->backend_data; struct timespec timeout_abs; if (buffer == BLADERF_STREAM_SHUTDOWN) { if (stream_data->num_avail == stream_data->num_transfers) { stream->state = STREAM_DONE; } else { stream->state = STREAM_SHUTTING_DOWN; } return 0; } if (stream_data->num_avail == 0) { if (nonblock) { log_debug("Non-blocking buffer submission requested, but no " "transfers are currently available."); return BLADERF_ERR_WOULD_BLOCK; } if (timeout_ms != 0) { status = populate_abs_timeout(&timeout_abs, timeout_ms); if (status != 0) { return BLADERF_ERR_UNEXPECTED; } while (stream_data->num_avail == 0 && status == 0) { status = pthread_cond_timedwait(&stream->can_submit_buffer, &stream->lock, &timeout_abs); } } else { while (stream_data->num_avail == 0 && status == 0) { status = pthread_cond_wait(&stream->can_submit_buffer, &stream->lock); } } } if (status == ETIMEDOUT) { log_debug("%s: Timed out waiting for a transfer to become available.\n", __FUNCTION__); return BLADERF_ERR_TIMEOUT; } else if (status != 0) { return BLADERF_ERR_UNEXPECTED; } else { return submit_transfer(stream, buffer); } }
/* The top-level code will have aquired the stream->lock for us */ int lusb_submit_stream_buffer(void *driver, struct bladerf_stream *stream, void *buffer, unsigned int timeout_ms) { int status; struct lusb_stream_data *stream_data = stream->backend_data; struct timespec timeout_abs; if (buffer == BLADERF_STREAM_SHUTDOWN) { if (stream_data->num_avail_transfers == stream_data->num_transfers) { stream->state = STREAM_DONE; } else { stream->state = STREAM_SHUTTING_DOWN; } return 0; } status = populate_abs_timeout(&timeout_abs, timeout_ms); if (status != 0) { return BLADERF_ERR_UNEXPECTED; } while (stream_data->num_avail_transfers == 0 && status == 0) { status = pthread_cond_timedwait(&stream->can_submit_buffer, &stream->lock, &timeout_abs); } if (status == ETIMEDOUT) { return BLADERF_ERR_TIMEOUT; } else if (status != 0) { return BLADERF_ERR_UNEXPECTED; } else { return submit_transfer(stream, buffer); } }