Show a patch.

GET /api/patches/14500/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 14500,
    "url": "https://patchwork.libcamera.org/api/patches/14500/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/14500/",
    "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": "<20211029041424.1430886-2-hiroh@chromium.org>",
    "date": "2021-10-29T04:14:19",
    "name": "[RFC,1/6] libcamera: base: Add thread safety annotation macros",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "6482e30c91369742df34937333e4443ddbcf7d64",
    "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/14500/mbox/",
    "series": [
        {
            "id": 2678,
            "url": "https://patchwork.libcamera.org/api/series/2678/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2678",
            "date": "2021-10-29T04:14:18",
            "name": "Introduce clang thread safety annotations",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/2678/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/14500/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/14500/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<kieran.bingham@ideasonboard.com>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": [
            "parsemail@patchwork.libcamera.org",
            "kbingham@ideasonboard.com"
        ],
        "Received": [
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E3F23BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 Nov 2021 17:44:15 +0000 (UTC)",
            "from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net\n\t[86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7E679DEE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 Nov 2021 18:44:15 +0100 (CET)",
            "from perceval.ideasonboard.com\n\tby perceval.ideasonboard.com with LMTP id OJozGCl1e2FNVQAA4E0KoQ\n\t(envelope-from <hiroh@chromium.org>)\n\tfor <kbingham@ideasonboard.com>; Fri, 29 Oct 2021 06:14:33 +0200",
            "from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com\n\t[IPv6:2607:f8b0:4864:20::102d])\tby perceval.ideasonboard.com\n\t(Postfix) with\n\tESMTPS id 52C73881\tfor <kieran.bingham@ideasonboard.com>;\n\tFri, 29 Oct 2021 06:14:33 +0200 (CEST)",
            "by mail-pj1-x102d.google.com with SMTP id gn3so6343344pjb.0 \n\tfor <kieran.bingham@ideasonboard.com>;\n\tThu, 28 Oct 2021 21:14:33 -0700 (PDT)",
            "from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:203:fd56:8786:5663:b946]) by smtp.gmail.com with\n\tESMTPSA id 11sm4826714pfl.41.2021.10.28.21.14.29 (version=TLS1_3\n\tcipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Oct 2021 21:14:31\n\t-0700 (PDT)"
        ],
        "Authentication-Results": "perceval.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"YRbA2fUS\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=14xAfBBWOIqRArbX5pK9vlWNRdDCBPlDSbbRYEJdJ3c=;\n\tb=YRbA2fUSe2v7cTslzNNL+nHW2LpVOhSpup2U1DF/whT+bsd3cRAlRdxE5w0T+kdZjM\n\ty1aiC3fznPhiFqKiTQY/gOdl+7Lqp4k2YtoO8gMilHtsdjJJ8KrP+B/blg5bDHU+10hT\n\t9lz6zqzGQo21EbcykCWYfKCzYJUitGnen7HCU=",
        "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=14xAfBBWOIqRArbX5pK9vlWNRdDCBPlDSbbRYEJdJ3c=;\n\tb=648UxnRhD00LGRsVYv3e4QM/Ik+4PyM6gB/TbWYPJKUbt3H79tLVNyetLnsptCCzVd\n\tiB6N85rzNQRb+5ME9xUEcpoLBCbNrosm1R2QiXCrQyRa5SILOCk9TcoK7BGXCVb33G/D\n\t3+/sSAxanCGLaqiYx/Ms429VZtjm0N4sN9UOHsvYag00Acgj/cdvWBH9iRK1zWLKcdBk\n\tWhMwPdl+9qmNQgYUq7q7IAxEqITKTsYqfeI3ryj0w1W2sHbqtYMSo7gtC7GqcP8nFEHX\n\txCh1n6SvvyPgDYFld6UpJaGjlFedKVk3Lordm+J8yCzJ7sXLFw3oZ4c3B8YmTHK4Yva2\n\t1aBg==",
        "X-Gm-Message-State": "AOAM5317lPtgup4voSpwV/ITYXErBN/nQhmudemUEwLlOGfHqA0xJfY7\n\tXYrVHyT48Id653EKGyNR0g+NVw==",
        "X-Google-Smtp-Source": "=?utf-8?q?ABdhPJzvIXQbO+iZRfvHjhFL8RM+0hk8SbKEBI4cI?=\n\t=?utf-8?q?0JR5gmSMTs8U+NHJU0miAMeqcLDltD12a8tPg=3D=3D?=",
        "X-Received": "by 2002:a17:90b:1c02:: with SMTP id\n\toc2mr9122817pjb.52.1635480871514; Thu, 28 Oct 2021 21:14:31 -0700\n\t(PDT)",
        "From": "Hirokazu Honda <hiroh@chromium.org>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "tfiga@chromium.org, laurent.pinchart@ideasonboard.com,\n\tkieran.bingham@ideasonboard.com, Hirokazu Honda <hiroh@chromium.org>",
        "Subject": "[RFC PATCH 1/6] libcamera: base: Add thread safety annotation macros",
        "Date": "Fri, 29 Oct 2021 13:14:19 +0900",
        "Message-Id": "<20211029041424.1430886-2-hiroh@chromium.org>",
        "X-Mailer": "git-send-email 2.33.1.1089.g2158813163f-goog",
        "In-Reply-To": "<20211029041424.1430886-1-hiroh@chromium.org>",
        "References": "<20211029041424.1430886-1-hiroh@chromium.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-TUID": "dpi2avQ7LjmL",
        "Resent-From": "Kieran Bingham <kieran.bingham@ideasonboard.com>",
        "Resent-To": "parsemail@patchwork.libcamera.org"
    },
    "content": "Clang complier is able to do a thread safety analysis with\nannotations [1]. This introduces the thread safety annotation\nmacros and also enable the analysis by adding -Wthread-safety\nif a clang compiler is used.\n\n[1] https://clang.llvm.org/docs/ThreadSafetyAnalysis.html.\n\nSigned-off-by: Hirokazu Honda <hiroh@chromium.org>\n---\n include/libcamera/base/meson.build          |   1 +\n include/libcamera/base/thread_annotations.h | 151 ++++++++++++++++++++\n meson.build                                 |   1 +\n 3 files changed, 153 insertions(+)\n create mode 100644 include/libcamera/base/thread_annotations.h",
    "diff": "diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\nindex 525aba9d..1a71ce5a 100644\n--- a/include/libcamera/base/meson.build\n+++ b/include/libcamera/base/meson.build\n@@ -19,6 +19,7 @@ libcamera_base_headers = files([\n     'signal.h',\n     'span.h',\n     'thread.h',\n+    'thread_annotations.h',\n     'timer.h',\n     'utils.h',\n ])\ndiff --git a/include/libcamera/base/thread_annotations.h b/include/libcamera/base/thread_annotations.h\nnew file mode 100644\nindex 00000000..935d8799\n--- /dev/null\n+++ b/include/libcamera/base/thread_annotations.h\n@@ -0,0 +1,151 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2021, Google Inc.\n+ *\n+ * thread_annotation.h - Macro of Clang thread safety analysis\n+ */\n+#ifndef __LIBCAMERA_BASE_THREAD_ANNOTATIONS_H__\n+#define __LIBCAMERA_BASE_THREAD_ANNOTATIONS_H__\n+\n+/*\n+ * Enable thread safety attributes only with clang.\n+ * The attributes can be safely erased when compiling with other compilers.\n+ */\n+#if defined(__clang__) && (!defined(SWIG))\n+#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))\n+#else\n+#define THREAD_ANNOTATION_ATTRIBUTE__(x) /* no-op */\n+#endif\n+\n+/* See https://clang.llvm.org/docs/ThreadSafetyAnalysis.html for these usages. */\n+\n+#define CAPABILITY(x)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(capability(x))\n+\n+#define SCOPED_CAPABILITY\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)\n+\n+#define GUARDED_BY(x)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))\n+\n+#define PT_GUARDED_BY(x)\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))\n+\n+#define ACQUIRED_BEFORE(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))\n+\n+#define ACQUIRED_AFTER(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))\n+\n+#define REQUIRES(...)\t\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__))\n+\n+#define REQUIRES_SHARED(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__))\n+\n+#define ACQUIRE(...)\t\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__))\n+\n+#define ACQUIRE_SHARED(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__))\n+\n+#define RELEASE(...)\t\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))\n+\n+#define RELEASE_SHARED(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__))\n+\n+#define RELEASE_GENERIC(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(__VA_ARGS__))\n+\n+#define TRY_ACQUIRE(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))\n+\n+#define TRY_ACQUIRE_SHARED(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__))\n+\n+#define EXCLUDES(...)\t\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))\n+\n+#define ASSERT_CAPABILITY(x)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))\n+\n+#define ASSERT_SHARED_CAPABILITY(x)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))\n+\n+#define RETURN_CAPABILITY(x)\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))\n+\n+#define NO_THREAD_SAFETY_ANALYSIS\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)\n+\n+#ifdef USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES\n+/*\n+ * The original version of thread safety analysis the following attribute\n+ * definitions.  These use a lock-based terminology.  They are still in use\n+ * by existing thread safety code, and will continue to be supported.\n+ */\n+\n+/* Deprecated. */\n+#define PT_GUARDED_VAR\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_var)\n+\n+/* Deprecated. */\n+#define GUARDED_VAR\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(guarded_var)\n+\n+/* Replaced by REQUIRES */\n+#define EXCLUSIVE_LOCKS_REQUIRED(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))\n+\n+/* Replaced by REQUIRES_SHARED */\n+#define SHARED_LOCKS_REQUIRED(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))\n+\n+/* Replaced by CAPABILITY */\n+#define LOCKABLE\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(lockable)\n+\n+/* Replaced by SCOPED_CAPABILITY */\n+#define SCOPED_LOCKABLE\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)\n+\n+/* Replaced by ACQUIRE */\n+#define EXCLUSIVE_LOCK_FUNCTION(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))\n+\n+/* Replaced by ACQUIRE_SHARED */\n+#define SHARED_LOCK_FUNCTION(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))\n+\n+/* Replaced by RELEASE and RELEASE_SHARED */\n+#define UNLOCK_FUNCTION(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))\n+\n+/* Replaced by TRY_ACQUIRE */\n+#define EXCLUSIVE_TRYLOCK_FUNCTION(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))\n+\n+/* Replaced by TRY_ACQUIRE_SHARED */\n+#define SHARED_TRYLOCK_FUNCTION(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))\n+\n+/* Replaced by ASSERT_CAPABILITY */\n+#define ASSERT_EXCLUSIVE_LOCK(...)\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__))\n+\n+/* Replaced by ASSERT_SHARED_CAPABILITY */\n+#define ASSERT_SHARED_LOCK(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__))\n+\n+/* Replaced by EXCLUDE_CAPABILITY */\n+#define LOCKS_EXCLUDED(...)\t\t\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))\n+\n+/* Replaced by RETURN_CAPABILITY */\n+#define LOCK_RETURNED(x)\t\t\t\t\\\n+\tTHREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))\n+\n+#endif /* USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES */\n+\n+#endif /* __LIBCAMERA_BASE_THREAD_ANNOTATIONS_H__ */\ndiff --git a/meson.build b/meson.build\nindex 7892a9e3..7147a108 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -72,6 +72,7 @@ if cc.get_id() == 'clang'\n \n     cpp_arguments += [\n         '-Wextra-semi',\n+        '-Wthread-safety',\n     ]\n endif\n \n",
    "prefixes": [
        "RFC",
        "1/6"
    ]
}