Patch Detail
Show a patch.
GET /api/patches/14945/?format=api
{ "id": 14945, "url": "https://patchwork.libcamera.org/api/patches/14945/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14945/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20211201075348.3121186-6-hiroh@chromium.org>", "date": "2021-12-01T07:53:41", "name": "[libcamera-devel,v5,05/12] libcamera: base: Add mutex classes with thread safety annotations", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "8949a19e8312e9aeece5c56b06903c6ef8167442", "submitter": { "id": 63, "url": "https://patchwork.libcamera.org/api/people/63/?format=api", "name": "Hirokazu Honda", "email": "hiroh@chromium.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14945/mbox/", "series": [ { "id": 2791, "url": "https://patchwork.libcamera.org/api/series/2791/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2791", "date": "2021-12-01T07:53:36", "name": "Introduce clang thread safety annotations", "version": 5, "mbox": "https://patchwork.libcamera.org/series/2791/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14945/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14945/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 97436BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 1 Dec 2021 07:54:06 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3DD4960725;\n\tWed, 1 Dec 2021 08:54:06 +0100 (CET)", "from mail-pl1-x634.google.com (mail-pl1-x634.google.com\n\t[IPv6:2607:f8b0:4864:20::634])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DE22760710\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 1 Dec 2021 08:54:04 +0100 (CET)", "by mail-pl1-x634.google.com with SMTP id y7so17062702plp.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Nov 2021 23:54:04 -0800 (PST)", "from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:203:3892:a049:59ba:c772])\n\tby smtp.gmail.com with ESMTPSA id\n\tl9sm3500848pfu.55.2021.11.30.23.54.01\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 30 Nov 2021 23:54:02 -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=\"Zz/VLi57\"; 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=p476CjgLIqlUgkGdPTqOjZB8ocadpuQ6TllpiWK1U7w=;\n\tb=Zz/VLi57tX4ORBqYicI2XCiUQjHvX/wDXEH2tAdjztebsTL+j18TJrWcyD/nUswwKB\n\t0e9hGtf15cwL50aPw54AGAbjGZZXNgG8abwYTBDp0NT1vTUc3521vC74HS7XOwUEKWop\n\tWSnDAhYonRZAMtq8v8tsCF+66ACtcc8emUrkA=", "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=p476CjgLIqlUgkGdPTqOjZB8ocadpuQ6TllpiWK1U7w=;\n\tb=fccXUqQ4nTSEd756yOSNVzb1ojBdux37CRV6YhnSymIyURN5MWa4bFx/4IJBo1UJ9J\n\tkzyOEdO21DFCYRDZYTaGL2DBwopRFM7ezGF6YYvdXlEfLAngOVGnQUwrdFKukBhitdmq\n\tWsnYFdFib1o0HDpZQuGU2RIO7mk2epHWeekm+94L7692WwTp6TYPjb49TYoEr44VG6nx\n\tPZNurpCQ4kZfbh6QCy6x9uXeB25SBsZTsIUhCypfO4LlHhuv3Vq9L7Af+NP5UagTqW3Z\n\tkvyKph0UJJsnF1IXY5QIVOM5CqKPAdKhpM1OVa76vDxLze5BxoOd4PHdgA6lSEfJhu6z\n\tG41A==", "X-Gm-Message-State": "AOAM5336kp2NXOQ2AZ6RcKZu9mbiaDBnw++jWJdP9TbUfuCI2idMOabm\n\tGxpI0LVYSBaCUHa8T8LyXhNZgCvQJRLXpg==", "X-Google-Smtp-Source": "ABdhPJwHSlbWCuC+oMydPe+zby3fieQQ4+8XvO4bau4QJLJcBTKeuODz4yW8+S3p+GmPptfvXbFhlQ==", "X-Received": "by 2002:a17:90b:314d:: with SMTP id\n\tip13mr5440861pjb.228.1638345243104; \n\tTue, 30 Nov 2021 23:54:03 -0800 (PST)", "From": "Hirokazu Honda <hiroh@chromium.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 1 Dec 2021 16:53:41 +0900", "Message-Id": "<20211201075348.3121186-6-hiroh@chromium.org>", "X-Mailer": "git-send-email 2.34.0.rc2.393.gf8c9666880-goog", "In-Reply-To": "<20211201075348.3121186-1-hiroh@chromium.org>", "References": "<20211201075348.3121186-1-hiroh@chromium.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v5 05/12] 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>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n include/libcamera/base/meson.build | 1 +\n include/libcamera/base/mutex.h | 132 +++++++++++++++++++++++++++++\n include/libcamera/base/thread.h | 7 +-\n src/libcamera/base/meson.build | 1 +\n src/libcamera/base/mutex.cpp | 56 ++++++++++++\n src/libcamera/base/thread.cpp | 15 ----\n src/v4l2/v4l2_camera_proxy.h | 4 +-\n 7 files changed, 193 insertions(+), 23 deletions(-)\n create mode 100644 include/libcamera/base/mutex.h\n create mode 100644 src/libcamera/base/mutex.cpp", "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..8b70508e\n--- /dev/null\n+++ b/include/libcamera/base/mutex.h\n@@ -0,0 +1,132 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021, Google Inc.\n+ *\n+ * mutex.h - Mutex classes with clang thread safety annotation\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+/* \\todo using Mutex = std::mutex if lib++ is used. */\n+\n+#ifndef __DOXYGEN__\n+\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 class 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_EXCLUDES(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+\tbool try_lock() LIBCAMERA_TSA_TRY_ACQUIRE(true)\n+\t{\n+\t\treturn lock_.try_lock();\n+\t}\n+\n+\tvoid unlock() LIBCAMERA_TSA_RELEASE()\n+\t{\n+\t\tlock_.unlock();\n+\t}\n+\n+private:\n+\tfriend class 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+#else /* __DOXYGEN__ */\n+\n+class Mutex final\n+{\n+};\n+\n+class MutexLocker final\n+{\n+};\n+\n+class ConditionVariable final\n+{\n+};\n+\n+#endif /* __DOXYGEN__ */\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/libcamera/base/meson.build b/src/libcamera/base/meson.build\nindex 05fed7ac..b93b8505 100644\n--- a/src/libcamera/base/meson.build\n+++ b/src/libcamera/base/meson.build\n@@ -11,6 +11,7 @@ libcamera_base_sources = files([\n 'flags.cpp',\n 'log.cpp',\n 'message.cpp',\n+ 'mutex.cpp',\n 'object.cpp',\n 'semaphore.cpp',\n 'signal.cpp',\ndiff --git a/src/libcamera/base/mutex.cpp b/src/libcamera/base/mutex.cpp\nnew file mode 100644\nindex 00000000..8e63387b\n--- /dev/null\n+++ b/src/libcamera/base/mutex.cpp\n@@ -0,0 +1,56 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021, Google Inc.\n+ *\n+ * mutex.cpp - Mutex classes with clang thread safety annotation\n+ */\n+\n+#include <libcamera/base/mutex.h>\n+\n+/**\n+ * \\file base/mutex.h\n+ * \\brief Mutex classes with clang thread safety annotation\n+ */\n+\n+namespace libcamera {\n+\n+/**\n+ * \\class Mutex\n+ * \\brief std::mutex wrapper with clang thread safety annotation\n+ *\n+ * The Mutex class wraps a std::mutex instance to add clang thread safety\n+ * annotation support. The class exposes the same interface as std::mutex and\n+ * can be used as a transparent replacement. It integrates with the\n+ * MutexLocker and ConditionVariable classes.\n+ *\n+ * See https://en.cppreference.com/w/cpp/thread/mutex for the complete API\n+ * documentation.\n+ */\n+\n+/**\n+ * \\class MutexLocker\n+ * \\brief std::unique_lock wrapper with clang thread safety annotation\n+ *\n+ * The MutexLocker class wraps a std::unique_lock instance to add clang thread\n+ * safety annotation support. The class exposes the same interface as\n+ * std::unique_lock and can be used as a transparent replacement. It integrates\n+ * with the Mutex and ConditionVariable classes.\n+ *\n+ * See https://en.cppreference.com/w/cpp/thread/unique_lock for the complete API\n+ * documentation.\n+ */\n+\n+/**\n+ * \\class ConditionVariable\n+ * \\brief std::condition_variable wrapper integrating with MutexLocker\n+ *\n+ * The ConditionVariable class wraps a std::condition_variable instance to\n+ * integrate with the MutexLocker class. The class exposes the same interface as\n+ * std::condition_variable and can be used as a transparent replacement.\n+ *\n+ * See https://en.cppreference.com/w/cpp/thread/condition_variable for the\n+ * complete API documentation.\n+ *\n+ */\n+\n+} /* namespace libcamera */\ndiff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp\nindex b893135f..b2043b7e 100644\n--- a/src/libcamera/base/thread.cpp\n+++ b/src/libcamera/base/thread.cpp\n@@ -204,21 +204,6 @@ ThreadData *ThreadData::current()\n \treturn data;\n }\n \n-/**\n- * \\typedef ConditionVariable\n- * \\brief An alias for std::condition_variable\n- */\n-\n-/**\n- * \\typedef Mutex\n- * \\brief An alias for std::mutex\n- */\n-\n-/**\n- * \\typedef MutexLocker\n- * \\brief An alias for std::unique_lock<std::mutex>\n- */\n-\n /**\n * \\class Thread\n * \\brief A thread of execution\ndiff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h\nindex 040954dd..fa0a49e0 100644\n--- a/src/v4l2/v4l2_camera_proxy.h\n+++ b/src/v4l2/v4l2_camera_proxy.h\n@@ -14,7 +14,7 @@\n #include <sys/types.h>\n #include <vector>\n \n-#include <libcamera/base/thread.h>\n+#include <libcamera/base/mutex.h>\n \n #include <libcamera/camera.h>\n \n@@ -59,7 +59,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", "v5", "05/12" ] }