[{"id":32914,"web_url":"https://patchwork.libcamera.org/comment/32914/","msgid":"<CAEB1ahtvbteqrYwq=_1G6o6v2NaEhqnH4yR-5q_ZL2Zy0CnbMw@mail.gmail.com>","date":"2025-01-02T13:17:03","subject":"Re: [PATCH v4 7/7] android: Remove\n\tCamera3RequestDescriptor::streamsProcessMutex_","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Hi Laurent,\n\nI think Jacopo left this to your review. Could you take a look when\nyou've got some time?\nThis should be the last patch in this series that hasn't been reviewed.\n\nThanks,\nHarvey\n\nOn Tue, Dec 10, 2024 at 3:26 PM Harvey Yang <chenghaoyang@chromium.org> wrote:\n>\n> This mutex was needed when CameraStream's worker thread posts a result\n> back to CameraDevice. We can simplify it by calling CameraDevice's\n> function on libcamera::Camera's owner thread. With this delegation,\n> `Camera3RequestDescriptor::pendingStreamsToProcess_` will be firstly\n> setup in the application's thread in processCaptureRequest(), and the\n> rest accesses will be done in libcamera::CameraManager's thread.\n>\n> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>  src/android/camera_device.cpp | 33 +++++++++++++++++----------------\n>  src/android/camera_device.h   |  6 ++++--\n>  src/android/camera_request.h  |  4 +---\n>  src/android/camera_stream.cpp |  4 ++--\n>  4 files changed, 24 insertions(+), 23 deletions(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index a95114c8d..cb819938a 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -989,8 +989,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>                 FrameBuffer *frameBuffer = nullptr;\n>                 UniqueFD acquireFence;\n>\n> -               MutexLocker lock(descriptor->streamsProcessMutex_);\n> -\n>                 switch (cameraStream->type()) {\n>                 case CameraStream::Type::Mapped:\n>                         /* Mapped streams will be handled in the next loop. */\n> @@ -1066,7 +1064,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>                                 << cameraStream->configuration().pixelFormat << \"]\"\n>                                 << \" (mapped)\";\n>\n> -               MutexLocker lock(descriptor->streamsProcessMutex_);\n>                 descriptor->pendingStreamsToProcess_.insert({ cameraStream, &buffer });\n>\n>                 /*\n> @@ -1252,9 +1249,6 @@ void CameraDevice::requestComplete(Request *request)\n>                 descriptor->resultMetadata_ = std::make_unique<CameraMetadata>(0, 0);\n>         }\n>\n> -       /* Handle post-processing. */\n> -       MutexLocker locker(descriptor->streamsProcessMutex_);\n> -\n>         /*\n>          * Queue all the post-processing streams request at once. The completion\n>          * slot streamProcessingComplete() can only execute when we are out\n> @@ -1288,10 +1282,8 @@ void CameraDevice::requestComplete(Request *request)\n>                 }\n>         }\n>\n> -       if (descriptor->pendingStreamsToProcess_.empty()) {\n> -               locker.unlock();\n> +       if (descriptor->pendingStreamsToProcess_.empty())\n>                 completeDescriptor(descriptor);\n> -       }\n>  }\n>\n>  /**\n> @@ -1398,6 +1390,19 @@ void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,\n>         }\n>  }\n>\n> +void CameraDevice::streamProcessingCompleteDelegate(StreamBuffer *streamBuffer,\n> +                                                   StreamBuffer::Status status)\n> +{\n> +       /*\n> +        * Delegate the callback to the camera manager thread to simplify race condition.\n> +        */\n> +       auto *method = new BoundMethodMember{\n> +               this, camera_.get(), &CameraDevice::streamProcessingComplete, ConnectionTypeQueued\n> +       };\n> +\n> +       method->activate(streamBuffer, status);\n> +}\n> +\n>  /**\n>   * \\brief Handle post-processing completion of a stream in a capture request\n>   * \\param[in] streamBuffer The StreamBuffer for which processing is complete\n> @@ -1418,13 +1423,9 @@ void CameraDevice::streamProcessingComplete(StreamBuffer *streamBuffer,\n>\n>         Camera3RequestDescriptor *request = streamBuffer->request;\n>\n> -       {\n> -               MutexLocker locker(request->streamsProcessMutex_);\n> -\n> -               request->pendingStreamsToProcess_.erase(streamBuffer->stream);\n> -               if (!request->pendingStreamsToProcess_.empty())\n> -                       return;\n> -       }\n> +       request->pendingStreamsToProcess_.erase(streamBuffer->stream);\n> +       if (!request->pendingStreamsToProcess_.empty())\n> +               return;\n>\n>         completeDescriptor(streamBuffer->request);\n>  }\n> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> index 699aa8f17..69d163d76 100644\n> --- a/src/android/camera_device.h\n> +++ b/src/android/camera_device.h\n> @@ -65,8 +65,8 @@ public:\n>         int configureStreams(camera3_stream_configuration_t *stream_list);\n>         int processCaptureRequest(camera3_capture_request_t *request);\n>         void requestComplete(libcamera::Request *request);\n> -       void streamProcessingComplete(StreamBuffer *bufferStream,\n> -                                     StreamBuffer::Status status);\n> +       void streamProcessingCompleteDelegate(StreamBuffer *bufferStream,\n> +                                             StreamBuffer::Status status);\n>\n>  protected:\n>         std::string logPrefix() const override;\n> @@ -96,6 +96,8 @@ private:\n>         int processControls(Camera3RequestDescriptor *descriptor);\n>         void completeDescriptor(Camera3RequestDescriptor *descriptor)\n>                 LIBCAMERA_TSA_EXCLUDES(descriptorsMutex_);\n> +       void streamProcessingComplete(StreamBuffer *bufferStream,\n> +                                     StreamBuffer::Status status);\n>         void sendCaptureResults() LIBCAMERA_TSA_REQUIRES(descriptorsMutex_);\n>         void sendCaptureResult(Camera3RequestDescriptor *request) const;\n>         void setBufferStatus(StreamBuffer &buffer,\n> diff --git a/src/android/camera_request.h b/src/android/camera_request.h\n> index 6b2a00795..bd75d4595 100644\n> --- a/src/android/camera_request.h\n> +++ b/src/android/camera_request.h\n> @@ -66,9 +66,7 @@ public:\n>         };\n>\n>         /* Keeps track of streams requiring post-processing. */\n> -       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_\n> -               LIBCAMERA_TSA_GUARDED_BY(streamsProcessMutex_);\n> -       libcamera::Mutex streamsProcessMutex_;\n> +       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_;\n>\n>         Camera3RequestDescriptor(libcamera::Camera *camera,\n>                                  const camera3_capture_request_t *camera3Request);\n> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> index 53f292d4b..7837fd7aa 100644\n> --- a/src/android/camera_stream.cpp\n> +++ b/src/android/camera_stream.cpp\n> @@ -121,8 +121,8 @@ int CameraStream::configure()\n>                                 else\n>                                         bufferStatus = StreamBuffer::Status::Error;\n>\n> -                               cameraDevice_->streamProcessingComplete(streamBuffer,\n> -                                                                       bufferStatus);\n> +                               cameraDevice_->streamProcessingCompleteDelegate(streamBuffer,\n> +                                                                               bufferStatus);\n>                         });\n>\n>                 worker_->start();\n> --\n> 2.47.0.338.g60cca15819-goog\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D5674BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  2 Jan 2025 13:17:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F05B0684CC;\n\tThu,  2 Jan 2025 14:17:16 +0100 (CET)","from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com\n\t[IPv6:2a00:1450:4864:20::12c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0D56C684CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  2 Jan 2025 14:17:15 +0100 (CET)","by mail-lf1-x12c.google.com with SMTP id\n\t2adb3069b0e04-53e3c47434eso12013205e87.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 02 Jan 2025 05:17:14 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"az6TCrHK\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1735823834; x=1736428634;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=wAYiElBUol6F0go9LZ9nPiAzxQiCelBKmfPAg5g5oXc=;\n\tb=az6TCrHKGURYde3kfO2ePb/sxCT1bRyIYnbdeCbyNkTR79fY5srzUj4jpNiuu+CR5R\n\td51xsMvA6OvYsF8DHZED2zXVyOoYsLgHr0zA3bJ+C7R/ksmHC+fIfkS8rs2KiK86OiKl\n\tBBjMxd1WyF/IOhC+qL2FVj0uckIoBbJ+G7rjE=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1735823834; x=1736428634;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=wAYiElBUol6F0go9LZ9nPiAzxQiCelBKmfPAg5g5oXc=;\n\tb=LPRGWWfW8epVUBeJ5GSk+KhtMt0iJ6D3N0XktxMxl6R1OwAgv/qO2I0EAi/eAFiud8\n\tCXMduyLxPAluCtPARLysUYUmURe3RtMAUJy0jre/K8FNhE7Fb0Qv8j0u3vH12XC0nyyJ\n\tY54X7CwC0kvE8z/7puFUgLCapH4jSJ4DL3GJ/qBH18q4NM90he4N+cL/umfeMsdp85CQ\n\tFRnLZJ61DJ90YnBAHkUDiVJcZwbINHCW8EnmbSFjXgIpRZAzJDzI8Qy6q/BNqjJRuVkE\n\tFmqeXD6LVxpRuc66lXzStlvoBbNPV+YCMgVX8M2oI+Uf5ZYFJozTRzWYY7jT6I3kg+BD\n\tNppw==","X-Gm-Message-State":"AOJu0Yz216dbrWFhiVwI048PmSrV0nr6cPigkFyQzXoVhWuJ51PcjL5n\n\tqolWyILqhWlm2JoLqE2GnXSJmi84sUzYdMgJyW2X6G2sndmwBnO3XXPU/pkNqRvoTkH9cEYCLC2\n\tHUMgr9M44gDSJSbdDzkdM0TSW59LC32TR8vWpkerHCtPcICQ=","X-Gm-Gg":"ASbGncvit5TKf8NfGvdaJsZU5Q/defJNM7QnL4x22+SsOu+PnKb2A+5T4Ht4E0YV3oT\n\t0B1EgxKKYap++bIoxtTADRkjOO3wlPpeF0Vau","X-Google-Smtp-Source":"AGHT+IEKmwo7xhMsjBFK7ozLFaeLBdHdDjl2XF4Xb+Ar/qt7xWGagpQw+/Z7qvsNHWuqjgOQhFyf4TgKM9w4PnHkPWQ=","X-Received":"by 2002:a05:6512:398a:b0:540:357a:5d85 with SMTP id\n\t2adb3069b0e04-54229561a43mr15479071e87.38.1735823833791;\n\tThu, 02 Jan 2025 05:17:13 -0800 (PST)","MIME-Version":"1.0","References":"<20241210142557.2886315-1-chenghaoyang@chromium.org>\n\t<20241210142557.2886315-8-chenghaoyang@chromium.org>","In-Reply-To":"<20241210142557.2886315-8-chenghaoyang@chromium.org>","From":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Date":"Thu, 2 Jan 2025 14:17:03 +0100","Message-ID":"<CAEB1ahtvbteqrYwq=_1G6o6v2NaEhqnH4yR-5q_ZL2Zy0CnbMw@mail.gmail.com>","Subject":"Re: [PATCH v4 7/7] android: Remove\n\tCamera3RequestDescriptor::streamsProcessMutex_","To":"libcamera-devel@lists.libcamera.org, \n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Han-Lin Chen <hanlinchen@chromium.org>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33107,"web_url":"https://patchwork.libcamera.org/comment/33107/","msgid":"<CAEB1ahu7UKJVY8kRPjC3GPtnY_TN5H-1rDFr7hn4t9EOZ1CqFA@mail.gmail.com>","date":"2025-01-20T21:25:27","subject":"Re: [PATCH v4 7/7] android: Remove\n\tCamera3RequestDescriptor::streamsProcessMutex_","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Friendly ping for Laurent, please take a look when available.\n\nThanks,\nHarvey\n\nOn Thu, Jan 2, 2025 at 2:17 PM Cheng-Hao Yang <chenghaoyang@chromium.org> wrote:\n>\n> Hi Laurent,\n>\n> I think Jacopo left this to your review. Could you take a look when\n> you've got some time?\n> This should be the last patch in this series that hasn't been reviewed.\n>\n> Thanks,\n> Harvey\n>\n> On Tue, Dec 10, 2024 at 3:26 PM Harvey Yang <chenghaoyang@chromium.org> wrote:\n> >\n> > This mutex was needed when CameraStream's worker thread posts a result\n> > back to CameraDevice. We can simplify it by calling CameraDevice's\n> > function on libcamera::Camera's owner thread. With this delegation,\n> > `Camera3RequestDescriptor::pendingStreamsToProcess_` will be firstly\n> > setup in the application's thread in processCaptureRequest(), and the\n> > rest accesses will be done in libcamera::CameraManager's thread.\n> >\n> > Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> > Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> > ---\n> >  src/android/camera_device.cpp | 33 +++++++++++++++++----------------\n> >  src/android/camera_device.h   |  6 ++++--\n> >  src/android/camera_request.h  |  4 +---\n> >  src/android/camera_stream.cpp |  4 ++--\n> >  4 files changed, 24 insertions(+), 23 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index a95114c8d..cb819938a 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -989,8 +989,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >                 FrameBuffer *frameBuffer = nullptr;\n> >                 UniqueFD acquireFence;\n> >\n> > -               MutexLocker lock(descriptor->streamsProcessMutex_);\n> > -\n> >                 switch (cameraStream->type()) {\n> >                 case CameraStream::Type::Mapped:\n> >                         /* Mapped streams will be handled in the next loop. */\n> > @@ -1066,7 +1064,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >                                 << cameraStream->configuration().pixelFormat << \"]\"\n> >                                 << \" (mapped)\";\n> >\n> > -               MutexLocker lock(descriptor->streamsProcessMutex_);\n> >                 descriptor->pendingStreamsToProcess_.insert({ cameraStream, &buffer });\n> >\n> >                 /*\n> > @@ -1252,9 +1249,6 @@ void CameraDevice::requestComplete(Request *request)\n> >                 descriptor->resultMetadata_ = std::make_unique<CameraMetadata>(0, 0);\n> >         }\n> >\n> > -       /* Handle post-processing. */\n> > -       MutexLocker locker(descriptor->streamsProcessMutex_);\n> > -\n> >         /*\n> >          * Queue all the post-processing streams request at once. The completion\n> >          * slot streamProcessingComplete() can only execute when we are out\n> > @@ -1288,10 +1282,8 @@ void CameraDevice::requestComplete(Request *request)\n> >                 }\n> >         }\n> >\n> > -       if (descriptor->pendingStreamsToProcess_.empty()) {\n> > -               locker.unlock();\n> > +       if (descriptor->pendingStreamsToProcess_.empty())\n> >                 completeDescriptor(descriptor);\n> > -       }\n> >  }\n> >\n> >  /**\n> > @@ -1398,6 +1390,19 @@ void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,\n> >         }\n> >  }\n> >\n> > +void CameraDevice::streamProcessingCompleteDelegate(StreamBuffer *streamBuffer,\n> > +                                                   StreamBuffer::Status status)\n> > +{\n> > +       /*\n> > +        * Delegate the callback to the camera manager thread to simplify race condition.\n> > +        */\n> > +       auto *method = new BoundMethodMember{\n> > +               this, camera_.get(), &CameraDevice::streamProcessingComplete, ConnectionTypeQueued\n> > +       };\n> > +\n> > +       method->activate(streamBuffer, status);\n> > +}\n> > +\n> >  /**\n> >   * \\brief Handle post-processing completion of a stream in a capture request\n> >   * \\param[in] streamBuffer The StreamBuffer for which processing is complete\n> > @@ -1418,13 +1423,9 @@ void CameraDevice::streamProcessingComplete(StreamBuffer *streamBuffer,\n> >\n> >         Camera3RequestDescriptor *request = streamBuffer->request;\n> >\n> > -       {\n> > -               MutexLocker locker(request->streamsProcessMutex_);\n> > -\n> > -               request->pendingStreamsToProcess_.erase(streamBuffer->stream);\n> > -               if (!request->pendingStreamsToProcess_.empty())\n> > -                       return;\n> > -       }\n> > +       request->pendingStreamsToProcess_.erase(streamBuffer->stream);\n> > +       if (!request->pendingStreamsToProcess_.empty())\n> > +               return;\n> >\n> >         completeDescriptor(streamBuffer->request);\n> >  }\n> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > index 699aa8f17..69d163d76 100644\n> > --- a/src/android/camera_device.h\n> > +++ b/src/android/camera_device.h\n> > @@ -65,8 +65,8 @@ public:\n> >         int configureStreams(camera3_stream_configuration_t *stream_list);\n> >         int processCaptureRequest(camera3_capture_request_t *request);\n> >         void requestComplete(libcamera::Request *request);\n> > -       void streamProcessingComplete(StreamBuffer *bufferStream,\n> > -                                     StreamBuffer::Status status);\n> > +       void streamProcessingCompleteDelegate(StreamBuffer *bufferStream,\n> > +                                             StreamBuffer::Status status);\n> >\n> >  protected:\n> >         std::string logPrefix() const override;\n> > @@ -96,6 +96,8 @@ private:\n> >         int processControls(Camera3RequestDescriptor *descriptor);\n> >         void completeDescriptor(Camera3RequestDescriptor *descriptor)\n> >                 LIBCAMERA_TSA_EXCLUDES(descriptorsMutex_);\n> > +       void streamProcessingComplete(StreamBuffer *bufferStream,\n> > +                                     StreamBuffer::Status status);\n> >         void sendCaptureResults() LIBCAMERA_TSA_REQUIRES(descriptorsMutex_);\n> >         void sendCaptureResult(Camera3RequestDescriptor *request) const;\n> >         void setBufferStatus(StreamBuffer &buffer,\n> > diff --git a/src/android/camera_request.h b/src/android/camera_request.h\n> > index 6b2a00795..bd75d4595 100644\n> > --- a/src/android/camera_request.h\n> > +++ b/src/android/camera_request.h\n> > @@ -66,9 +66,7 @@ public:\n> >         };\n> >\n> >         /* Keeps track of streams requiring post-processing. */\n> > -       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_\n> > -               LIBCAMERA_TSA_GUARDED_BY(streamsProcessMutex_);\n> > -       libcamera::Mutex streamsProcessMutex_;\n> > +       std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_;\n> >\n> >         Camera3RequestDescriptor(libcamera::Camera *camera,\n> >                                  const camera3_capture_request_t *camera3Request);\n> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> > index 53f292d4b..7837fd7aa 100644\n> > --- a/src/android/camera_stream.cpp\n> > +++ b/src/android/camera_stream.cpp\n> > @@ -121,8 +121,8 @@ int CameraStream::configure()\n> >                                 else\n> >                                         bufferStatus = StreamBuffer::Status::Error;\n> >\n> > -                               cameraDevice_->streamProcessingComplete(streamBuffer,\n> > -                                                                       bufferStatus);\n> > +                               cameraDevice_->streamProcessingCompleteDelegate(streamBuffer,\n> > +                                                                               bufferStatus);\n> >                         });\n> >\n> >                 worker_->start();\n> > --\n> > 2.47.0.338.g60cca15819-goog\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 94B36C327C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 20 Jan 2025 21:25:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 81FFF684E7;\n\tMon, 20 Jan 2025 22:25:41 +0100 (CET)","from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com\n\t[IPv6:2a00:1450:4864:20::22c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8C32A60354\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 20 Jan 2025 22:25:39 +0100 (CET)","by mail-lj1-x22c.google.com with SMTP id\n\t38308e7fff4ca-306007227d3so48554581fa.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 20 Jan 2025 13:25:39 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"dwF2J6og\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1737408338; x=1738013138;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=LTHkqdYukiDY4hC4mLVehFbkSTcncxOv2zqn9emPeps=;\n\tb=dwF2J6og9IXQ3vwKXx0DjZyFqSZ9IDtqz9zYrB5nFudMsU92PGkdfI40HEeIXQX/yu\n\t5+xlBBlMHZUDBk/Kx6siOalbtg302mer/C25248ZiIXJIJ8+Kw46R9GIH8UgItvdslXk\n\tFmviAKXhxjMW9jMKlYwYzL96dEwfgPPA2xkLc=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1737408338; x=1738013138;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=LTHkqdYukiDY4hC4mLVehFbkSTcncxOv2zqn9emPeps=;\n\tb=atMQDLA4LZYHH0H7Iw7H9w+ZxBjpXhPbQq4dzocum3TPMFQLmkRRZF9BgFrekpXK6m\n\t6F5STTLAwypwRoL8nQoLrYxjKX9hP17/pN0QOOB6muVCyIABzvzkhoijaOLRFMiNFqEy\n\tGBlPyyJmS32IELvyWdpZPPAHmnWf/l2xL3Mfi7h/PcLvM18wC3w8RDsZfQKRGosgpAGu\n\t5kdfY9ifccmBb3pKBi2Hs07u3NCoy72QdU6jdQRzIN87NrqHA70m4jzPSpMgmO1xFtuq\n\tnKI1yMTjBMjWNCncwU3GNdr9Q3TJAw+nFOphcHBUIEdmvKjbo4QX4A/FB0/E/4ZLidoZ\n\ttyCA==","X-Gm-Message-State":"AOJu0YwLqWG9VvGBXOX6a/pNtVwFAkXLxvYYz0K3G8jZSsRbUXPYMZA2\n\t05/sIsXP0iFmv619y7BkRdIrUsmQxPE6ri+kFk/DSgEaxE1tBh5tzXRa0RX09nt97fdhTVeMwp6\n\txk2mWuPfyW9Er5OAsZSixSKadtZxdrnhDpTyULkJWLK32rnY=","X-Gm-Gg":"ASbGnctFRycEm4m1WSXhVbKCP+fc2pOIivwMrRgYnrldT+rt+HWUxcPzJ6a8sD9875X\n\tSj/90I7ZWiLtcHim8U3UFRkj2726yDwSBDyJLQPMOdrFMZ0z2tw==","X-Google-Smtp-Source":"AGHT+IF52YMVYNWxrj0ofW3PCu39oyUbKZv6unm9wwxGnEIxPImIBnwrMofl9WNNdmYFFv2MkPrqjiEzGditjLoNw9o=","X-Received":"by 2002:a2e:a5ca:0:b0:302:4171:51f0 with SMTP id\n\t38308e7fff4ca-3072c991e96mr61394041fa.0.1737408338209;\n\tMon, 20 Jan 2025 13:25:38 -0800 (PST)","MIME-Version":"1.0","References":"<20241210142557.2886315-1-chenghaoyang@chromium.org>\n\t<20241210142557.2886315-8-chenghaoyang@chromium.org>\n\t<CAEB1ahtvbteqrYwq=_1G6o6v2NaEhqnH4yR-5q_ZL2Zy0CnbMw@mail.gmail.com>","In-Reply-To":"<CAEB1ahtvbteqrYwq=_1G6o6v2NaEhqnH4yR-5q_ZL2Zy0CnbMw@mail.gmail.com>","From":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Date":"Mon, 20 Jan 2025 22:25:27 +0100","X-Gm-Features":"AbW1kvYmvsdDDA-Bc8j6zWvE7H7NqkWuzSVcv1sWDg0tuznXGaGARAsBbIWxEEI","Message-ID":"<CAEB1ahu7UKJVY8kRPjC3GPtnY_TN5H-1rDFr7hn4t9EOZ1CqFA@mail.gmail.com>","Subject":"Re: [PATCH v4 7/7] android: Remove\n\tCamera3RequestDescriptor::streamsProcessMutex_","To":"libcamera-devel@lists.libcamera.org, \n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Han-Lin Chen <hanlinchen@chromium.org>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]