- g_mutex_lock(async->store->lock);
- async->store->pending--;
- if (async->store->pending == 0)
- g_cond_broadcast(async->store->cond_idle);
- g_mutex_unlock(async->store->lock);
+ bluesky_time_hires elapsed = bluesky_now_hires() - async->start_time;
+ bluesky_time_hires latency = bluesky_now_hires() - async->exec_time;
+
+ if (async->op != STORE_OP_BARRIER) {
+ g_mutex_lock(async->store->lock);
+ async->store->pending--;
+ if (async->store->pending == 0)
+ g_cond_broadcast(async->store->cond_idle);
+ g_mutex_unlock(async->store->lock);
+ }
+
+ /* If the request was a range request but the backend read the entire
+ * object, select out the appropriate bytes. */
+ if (async->op == STORE_OP_GET
+ && !async->range_done
+ && async->result == 0
+ && async->data != NULL) {
+ if (async->start != 0 || async->len != 0) {
+ /* If the caller requesteda read outside the object, return an
+ * error. */
+ if (async->start + async->len > async->data->len) {
+ g_warning("Range request outside object boundaries!\n");
+ async->result = -1;
+ } else {
+ if (async->len == 0)
+ async->len = async->data->len - async->start;
+ BlueSkyRCStr *newstr = bluesky_string_new(g_memdup(&async->data->data[async->start], async->len), async->len);
+ bluesky_string_unref(async->data);
+ async->data = newstr;
+ async->range_done = TRUE;
+ }
+ }
+ }