diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 806b4090..bf9a2e69 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -982,13 +982,13 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 	MutexLocker stateLock(stateMutex_);
 
 	if (state_ == State::Flushing) {
-		abortRequest(descriptor.get());
+		Camera3RequestDescriptor *rawDescriptor = descriptor.get();
 		{
 			MutexLocker descriptorsLock(descriptorsMutex_);
 			descriptors_.push(std::move(descriptor));
 		}
-
-		sendCaptureResults();
+		abortRequest(rawDescriptor);
+		completeDescriptor(rawDescriptor);
 
 		return 0;
 	}
@@ -1079,7 +1079,7 @@ void CameraDevice::requestComplete(Request *request)
 				<< request->status();
 
 		abortRequest(descriptor);
-		sendCaptureResults();
+		completeDescriptor(descriptor);
 
 		return;
 	}
@@ -1129,6 +1129,7 @@ void CameraDevice::requestComplete(Request *request)
 			buffer.status = Camera3RequestDescriptor::Status::Error;
 			notifyError(descriptor->frameNumber_, stream->camera3Stream(),
 				    CAMERA3_MSG_ERROR_BUFFER);
+			descriptor->status_ = Camera3RequestDescriptor::Status::Error;
 			continue;
 		}
 
@@ -1145,27 +1146,27 @@ void CameraDevice::requestComplete(Request *request)
 			buffer.status = Camera3RequestDescriptor::Status::Error;
 			notifyError(descriptor->frameNumber_, stream->camera3Stream(),
 				    CAMERA3_MSG_ERROR_BUFFER);
+			descriptor->status_ = Camera3RequestDescriptor::Status::Error;
 		}
 	}
 
-	descriptor->status_ = Camera3RequestDescriptor::Status::Success;
+	completeDescriptor(descriptor);
+}
+
+void CameraDevice::completeDescriptor(Camera3RequestDescriptor *descriptor)
+{
+	MutexLocker lock(descriptorsMutex_);
+	descriptor->complete_ = true;
+
 	sendCaptureResults();
 }
 
 void CameraDevice::sendCaptureResults()
 {
-	MutexLocker lock(descriptorsMutex_);
 	while (!descriptors_.empty() && !descriptors_.front()->isPending()) {
 		auto descriptor = std::move(descriptors_.front());
 		descriptors_.pop();
 
-		/*
-		 * \todo Releasing and re-acquiring the critical section for
-		 * every request completion (grain-locking) might have an
-		 * impact on performance which should be measured.
-		 */
-		lock.unlock();
-
 		camera3_capture_result_t captureResult = {};
 
 		captureResult.frame_number = descriptor->frameNumber_;
@@ -1201,8 +1202,6 @@ void CameraDevice::sendCaptureResults()
 			captureResult.partial_result = 1;
 
 		callbacks_->process_capture_result(callbacks_, &captureResult);
-
-		lock.lock();
 	}
 }
 
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 863cf414..e544f2bd 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -93,6 +93,7 @@ private:
 	void notifyError(uint32_t frameNumber, camera3_stream_t *stream,
 			 camera3_error_msg_code code) const;
 	int processControls(Camera3RequestDescriptor *descriptor);
+	void completeDescriptor(Camera3RequestDescriptor *descriptor);
 	void sendCaptureResults();
 	std::unique_ptr<CameraMetadata> getResultMetadata(
 		const Camera3RequestDescriptor &descriptor) const;
diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
index faa85ada..16cf266f 100644
--- a/src/android/camera_request.cpp
+++ b/src/android/camera_request.cpp
@@ -36,7 +36,7 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
 			static_cast<CameraStream *>(buffer.stream->priv);
 
 		buffers_.push_back({ stream, buffer.buffer, nullptr,
-				     buffer.acquire_fence, Status::Pending });
+				     buffer.acquire_fence, Status::Success });
 	}
 
 	/* Clone the controls associated with the camera3 request. */
diff --git a/src/android/camera_request.h b/src/android/camera_request.h
index 05dabf89..4d80ef32 100644
--- a/src/android/camera_request.h
+++ b/src/android/camera_request.h
@@ -26,7 +26,6 @@ class Camera3RequestDescriptor
 {
 public:
 	enum class Status {
-		Pending,
 		Success,
 		Error,
 	};
@@ -43,7 +42,7 @@ public:
 				 const camera3_capture_request_t *camera3Request);
 	~Camera3RequestDescriptor();
 
-	bool isPending() const { return status_ == Status::Pending; }
+	bool isPending() const { return !complete_; }
 
 	uint32_t frameNumber_ = 0;
 
@@ -53,7 +52,8 @@ public:
 	std::unique_ptr<CaptureRequest> request_;
 	std::unique_ptr<CameraMetadata> resultMetadata_;
 
-	Status status_ = Status::Pending;
+	bool complete_ = false;
+	Status status_ = Status::Success;
 
 private:
 	LIBCAMERA_DISABLE_COPY(Camera3RequestDescriptor)
