Track in-flight requests

This allows for verification of callbacks, and will also be helpful
when implementing flush.

BUG: 31653306
TEST: unit tests pass, test program runs
Change-Id: Id43d6cb3c2b9ca4adc96fc08282f88e0b7b904e1
diff --git a/modules/camera/3_4/request_tracker.cpp b/modules/camera/3_4/request_tracker.cpp
index 60715b5..dcf8263 100644
--- a/modules/camera/3_4/request_tracker.cpp
+++ b/modules/camera/3_4/request_tracker.cpp
@@ -53,7 +53,7 @@
   return std::move(result);
 }
 
-bool RequestTracker::Add(std::unique_ptr<CaptureRequest> request) {
+bool RequestTracker::Add(std::shared_ptr<CaptureRequest> request) {
   if (!CanAddRequest(*request)) {
     return false;
   }
@@ -64,40 +64,42 @@
   }
 
   // Store the request.
-  frames_in_flight_[request->frame_number] = std::move(request);
+  frames_in_flight_[request->frame_number] = request;
 
   return true;
 }
 
-bool RequestTracker::Remove(uint32_t frame_number,
-                            std::unique_ptr<CaptureRequest>* request) {
+bool RequestTracker::Remove(std::shared_ptr<CaptureRequest> request) {
   // Get the request.
-  std::unique_ptr<CaptureRequest> stored_request =
-      std::move(frames_in_flight_[frame_number]);
-  if (!stored_request) {
-    ALOGE("%s: Frame %u is not in flight.", __func__, frame_number);
+  const auto frame_number_request = frames_in_flight_.find(request->frame_number);
+  if (frame_number_request == frames_in_flight_.end()) {
+    ALOGE("%s: Frame %u is not in flight.", __func__, request->frame_number);
+    return false;
+  } else if (request != frame_number_request->second) {
+    ALOGE(
+        "%s: Request for frame %u cannot be removed: "
+        "does not matched the stored request.",
+        __func__,
+        request->frame_number);
     return false;
   }
-  frames_in_flight_.erase(frame_number);
+
+  frames_in_flight_.erase(frame_number_request);
 
   // Decrement the counts of used streams.
-  for (const auto stream : RequestStreams(*stored_request)) {
+  for (const auto stream : RequestStreams(*request)) {
     --buffers_in_flight_[stream];
   }
 
-  // Return the request if requested.
-  if (request) {
-    *request = std::move(stored_request);
-  }
   return true;
 }
 
 void RequestTracker::Clear(
-    std::set<std::unique_ptr<CaptureRequest>>* requests) {
+    std::set<std::shared_ptr<CaptureRequest>>* requests) {
   // If desired, extract all the currently in-flight requests.
   if (requests) {
     for (auto& frame_number_request : frames_in_flight_) {
-      requests->insert(std::move(frame_number_request.second));
+      requests->insert(frame_number_request.second);
     }
   }