{"id":14500,"url":"https://patchwork.libcamera.org/api/patches/14500/?format=json","web_url":"https://patchwork.libcamera.org/patch/14500/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","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=json","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=json","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"]}