g_mutex_unlock(self->ring_mutex);
part_done:
- if (elt->cancelled) {
- g_timer_destroy(timer);
- return NULL;
- }
-
/* if we write all of the blocks, but the finish_file fails, then likely
* there was some buffering going on in the device driver, and the blocks
* did not all make it to permanent storage -- so it's a failed part. Note
* that we try to finish_file even if the part failed, just to be thorough. */
if (self->device->in_file) {
if (!device_finish_file(self->device))
- part_status = PART_FAILED;
+ if (!elt->cancelled) {
+ part_status = PART_FAILED;
+ }
+ }
+
+ if (elt->cancelled) {
+ g_timer_destroy(timer);
+ return NULL;
}
g_timer_stop(timer);
/* then signal all of our condition variables, so that threads waiting on them
* wake up and see elt->cancelled. */
- g_mutex_lock(self->state_mutex);
- g_cond_broadcast(self->state_cond);
- g_mutex_unlock(self->state_mutex);
-
g_mutex_lock(self->ring_mutex);
g_cond_broadcast(self->ring_add_cond);
g_cond_broadcast(self->ring_free_cond);
g_mutex_unlock(self->ring_mutex);
+ g_mutex_lock(self->state_mutex);
+ g_cond_broadcast(self->state_cond);
+ g_mutex_unlock(self->state_mutex);
+
return rv;
}