Patch Detail
Show a patch.
GET /api/1.1/patches/14841/?format=api
{ "id": 14841, "url": "https://patchwork.libcamera.org/api/1.1/patches/14841/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14841/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20211129114453.3186042-6-hiroh@chromium.org>", "date": "2021-11-29T11:44:47", "name": "[libcamera-devel,v2,05/11] libcamera: base: Add mutex classes with thread safety annotations", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "0fe71bda9e2ba7f9a23b0c1f617a4bb7b331c232", "submitter": { "id": 63, "url": "https://patchwork.libcamera.org/api/1.1/people/63/?format=api", "name": "Hirokazu Honda", "email": "hiroh@chromium.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14841/mbox/", "series": [ { "id": 2770, "url": "https://patchwork.libcamera.org/api/1.1/series/2770/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2770", "date": "2021-11-29T11:44:42", "name": "Introduce clang thread safety annotations", "version": 2, "mbox": "https://patchwork.libcamera.org/series/2770/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14841/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14841/checks/", "tags": {}, "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 28F9FBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Nov 2021 11:45:15 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D912D605B9;\n\tMon, 29 Nov 2021 12:45:14 +0100 (CET)", "from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com\n\t[IPv6:2607:f8b0:4864:20::42a])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4E5BB605B7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Nov 2021 12:45:10 +0100 (CET)", "by mail-pf1-x42a.google.com with SMTP id g18so16575233pfk.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Nov 2021 03:45:10 -0800 (PST)", "from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:203:f254:cda9:46e8:17b7])\n\tby smtp.gmail.com with ESMTPSA id\n\thg4sm17951966pjb.1.2021.11.29.03.45.06\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 29 Nov 2021 03:45:07 -0800 (PST)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"EEsjJWLh\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=yMK8xuOKXl6FNLXZT5HALq7jJoQBO1uNuMrQ9ZfsbSQ=;\n\tb=EEsjJWLhNP4snEAM/q4j5YHpeo36W2zOFhBvnjzY4OjHy6/M1v04LlLahKTTsKiSo8\n\tL7iFNn7CwZZ2/FIYmQ7S2mf2SZUfm+WnJiXIYNM8vWIcZUgKkf8xh93nqaD8ptfHSet9\n\t4iLamDBe050ez+eOBm9yj/eesYcGZLI8Y7d0A=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=yMK8xuOKXl6FNLXZT5HALq7jJoQBO1uNuMrQ9ZfsbSQ=;\n\tb=OutM8FC1q1OIx8t29twuH/DXaOfT7TTPc81SjMiNf1IlNOGLjdfnGLStzESUPNUG9S\n\tR6Ek5uVA4nxjXMNvVrSZdHKeJlE/svUoil42P/uITkQi7eiHeeK4A6eIrFkK6TbYnb7S\n\tXgyRXtmiPnIYovfD9W/QEem+dvdA7+37fY3tdhLE6M9pfGf5u9vsWB1PxYxvp+tI0Xnk\n\tOzrexlziWoH8QB9wyvZRSiHlizEyuU8ORtW60rSbOnwVj2AziHD2t7pvoKMFZuPMGT4m\n\tWHFLPPUsHiNQVqhira6dgg49PMMM+EuF6oV3Hlr+gxZXeXl6yWnceiR21IkGKkEzuP8F\n\tvmJg==", "X-Gm-Message-State": "AOAM532EFTSE5S1nLvC6119KoiZpua6rIyTzwFZQy5UMVSn9JCRGG00Y\n\toRV4jpzqr4Geul9KmA6XGvIkgFwY9Ejt4A==", "X-Google-Smtp-Source": "ABdhPJz5xsHrF7mK0qfQvEgD/lsXX/ne7Z8Gptgru8+satJ2OtF6yRUfEgoP+6CUEiWqODcI0v9vjA==", "X-Received": "by 2002:aa7:88d3:0:b0:49f:baac:9b51 with SMTP id\n\tk19-20020aa788d3000000b0049fbaac9b51mr38946911pff.44.1638186308275; \n\tMon, 29 Nov 2021 03:45:08 -0800 (PST)", "From": "Hirokazu Honda <hiroh@chromium.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Mon, 29 Nov 2021 20:44:47 +0900", "Message-Id": "<20211129114453.3186042-6-hiroh@chromium.org>", "X-Mailer": "git-send-email 2.34.0.rc2.393.gf8c9666880-goog", "In-Reply-To": "<20211129114453.3186042-1-hiroh@chromium.org>", "References": "<20211129114453.3186042-1-hiroh@chromium.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v2 05/11] libcamera: base: Add mutex\n\tclasses with thread safety annotations", "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>" }, "content": "This replaces Mutex and MutexLocker with our own defined classes.\nThe classes are annotated by clang thread safety annotations.\nSo we can add annotation to code where the classes are used.\n\nv4l2 code needs to be annotated, which violates Mutex capability.\n\nSigned-off-by: Hirokazu Honda <hiroh@chromium.org>\n---\n include/libcamera/base/meson.build | 1 +\n include/libcamera/base/mutex.h | 127 +++++++++++++++++++++++++++++\n include/libcamera/base/thread.h | 7 +-\n src/v4l2/v4l2_camera_proxy.h | 5 +-\n 4 files changed, 132 insertions(+), 8 deletions(-)\n create mode 100644 include/libcamera/base/mutex.h", "diff": "diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\nindex 1a71ce5a..37c4435a 100644\n--- a/include/libcamera/base/meson.build\n+++ b/include/libcamera/base/meson.build\n@@ -13,6 +13,7 @@ libcamera_base_headers = files([\n 'flags.h',\n 'log.h',\n 'message.h',\n+ 'mutex.h',\n 'object.h',\n 'private.h',\n 'semaphore.h',\ndiff --git a/include/libcamera/base/mutex.h b/include/libcamera/base/mutex.h\nnew file mode 100644\nindex 00000000..55091eb4\n--- /dev/null\n+++ b/include/libcamera/base/mutex.h\n@@ -0,0 +1,127 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021, Google Inc.\n+ *\n+ * thread.h - Thread support\n+ */\n+\n+#pragma once\n+\n+#include <condition_variable>\n+#include <mutex>\n+\n+#include <libcamera/base/thread_annotations.h>\n+\n+namespace libcamera {\n+\n+class ConditionVariable;\n+class LIBCAMERA_TSA_SCOPED_CAPABILITY MutexLocker;\n+\n+/* \\todo using Mutex = std::mutex if lib++ is used. */\n+class LIBCAMERA_TSA_CAPABILITY(\"mutex\") Mutex final\n+{\n+public:\n+\tconstexpr Mutex()\n+\t{\n+\t}\n+\n+\tvoid lock() LIBCAMERA_TSA_ACQUIRE()\n+\t{\n+\t\tmutex_.lock();\n+\t}\n+\n+\tvoid unlock() LIBCAMERA_TSA_RELEASE()\n+\t{\n+\t\tmutex_.unlock();\n+\t}\n+\n+private:\n+\tfriend MutexLocker;\n+\n+\tstd::mutex mutex_;\n+};\n+\n+class LIBCAMERA_TSA_SCOPED_CAPABILITY MutexLocker final\n+{\n+public:\n+\texplicit MutexLocker(Mutex &mutex) LIBCAMERA_TSA_ACQUIRE(mutex)\n+\t\t: lock_(mutex.mutex_)\n+\t{\n+\t}\n+\n+\tMutexLocker(Mutex &mutex, std::defer_lock_t t) noexcept LIBCAMERA_TSA_ACQUIRE(mutex)\n+\t\t: lock_(mutex.mutex_, t)\n+\t{\n+\t}\n+\n+\tMutexLocker(Mutex &mutex, std::try_to_lock_t t) noexcept LIBCAMERA_TSA_ACQUIRE(mutex)\n+\t\t: lock_(mutex.mutex_, t)\n+\t{\n+\t}\n+\n+\tMutexLocker(Mutex &mutex, std::adopt_lock_t t) noexcept LIBCAMERA_TSA_ACQUIRE(mutex)\n+\t\t: lock_(mutex.mutex_, t)\n+\t{\n+\t}\n+\n+\t~MutexLocker() LIBCAMERA_TSA_RELEASE()\n+\t{\n+\t}\n+\n+\tvoid lock() LIBCAMERA_TSA_ACQUIRE()\n+\t{\n+\t\tlock_.lock();\n+\t}\n+\n+\tvoid unlock() LIBCAMERA_TSA_RELEASE()\n+\t{\n+\t\tlock_.unlock();\n+\t}\n+\n+\tbool try_lock() LIBCAMERA_TSA_TRY_ACQUIRE(true)\n+\t{\n+\t\treturn lock_.try_lock();\n+\t}\n+\n+private:\n+\tfriend ConditionVariable;\n+\n+\tstd::unique_lock<std::mutex> lock_;\n+};\n+\n+class ConditionVariable final\n+{\n+public:\n+\tConditionVariable()\n+\t{\n+\t}\n+\n+\tvoid notify_one() noexcept\n+\t{\n+\t\tcv_.notify_one();\n+\t}\n+\n+\tvoid notify_all() noexcept\n+\t{\n+\t\tcv_.notify_all();\n+\t}\n+\n+\ttemplate<class Predicate>\n+\tvoid wait(MutexLocker &locker, Predicate stopWaiting)\n+\t{\n+\t\tcv_.wait(locker.lock_, stopWaiting);\n+\t}\n+\n+\ttemplate<class Rep, class Period, class Predicate>\n+\tbool wait_for(MutexLocker &locker,\n+\t\t const std::chrono::duration<Rep, Period> &relTime,\n+\t\t Predicate stopWaiting)\n+\t{\n+\t\treturn cv_.wait_for(locker.lock_, relTime, stopWaiting);\n+\t}\n+\n+private:\n+\tstd::condition_variable cv_;\n+};\n+\n+} /* namespace libcamera */\ndiff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h\nindex 1ebf8363..44678c34 100644\n--- a/include/libcamera/base/thread.h\n+++ b/include/libcamera/base/thread.h\n@@ -7,15 +7,14 @@\n \n #pragma once\n \n-#include <condition_variable>\n #include <memory>\n-#include <mutex>\n #include <sys/types.h>\n #include <thread>\n \n #include <libcamera/base/private.h>\n \n #include <libcamera/base/message.h>\n+#include <libcamera/base/mutex.h>\n #include <libcamera/base/signal.h>\n #include <libcamera/base/utils.h>\n \n@@ -27,10 +26,6 @@ class Object;\n class ThreadData;\n class ThreadMain;\n \n-using ConditionVariable = std::condition_variable;\n-using Mutex = std::mutex;\n-using MutexLocker = std::unique_lock<std::mutex>;\n-\n class Thread\n {\n public:\ndiff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h\nindex 040954dd..23be995d 100644\n--- a/src/v4l2/v4l2_camera_proxy.h\n+++ b/src/v4l2/v4l2_camera_proxy.h\n@@ -14,7 +14,8 @@\n #include <sys/types.h>\n #include <vector>\n \n-#include <libcamera/base/thread.h>\n+#include <libcamera/base/mutex.h>\n+#include <libcamera/base/thread_annotations.h>\n \n #include <libcamera/camera.h>\n \n@@ -59,7 +60,7 @@ private:\n \tint vidioc_querybuf(V4L2CameraFile *file, struct v4l2_buffer *arg);\n \tint vidioc_qbuf(V4L2CameraFile *file, struct v4l2_buffer *arg);\n \tint vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg,\n-\t\t\t libcamera::Mutex *lock);\n+\t\t\t libcamera::Mutex *lock) LIBCAMERA_TSA_REQUIRES(*lock);\n \tint vidioc_streamon(V4L2CameraFile *file, int *arg);\n \tint vidioc_streamoff(V4L2CameraFile *file, int *arg);\n \n", "prefixes": [ "libcamera-devel", "v2", "05/11" ] }