Patch Detail
Show a patch.
GET /api/patches/12424/?format=api
{ "id": 12424, "url": "https://patchwork.libcamera.org/api/patches/12424/?format=api", "web_url": "https://patchwork.libcamera.org/patch/12424/", "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": "<20210526084628.3893266-2-hiroh@chromium.org>", "date": "2021-05-26T08:46:28", "name": "[libcamera-devel,v2,1/1] android: CameraHalManager: Create a static object dynamically", "commit_ref": "459b3bc6a979a778f1689a86be3589101853977e", "pull_url": null, "state": "accepted", "archived": false, "hash": "d1d9df414b2c3f2fd5c650d3e912cfe5b8e9aedd", "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/12424/mbox/", "series": [ { "id": 2072, "url": "https://patchwork.libcamera.org/api/series/2072/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2072", "date": "2021-05-26T08:46:27", "name": "Fix SIGSEGV in ChromeOS camera3 test", "version": 2, "mbox": "https://patchwork.libcamera.org/series/2072/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/12424/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/12424/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 E1F54C3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 May 2021 08:46:39 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9A3E068927;\n\tWed, 26 May 2021 10:46:39 +0200 (CEST)", "from mail-pg1-x536.google.com (mail-pg1-x536.google.com\n\t[IPv6:2607:f8b0:4864:20::536])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 07E546891F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 10:46:38 +0200 (CEST)", "by mail-pg1-x536.google.com with SMTP id 29so353015pgu.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 01:46:37 -0700 (PDT)", "from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:2:e36c:ae58:48e5:2f8e])\n\tby smtp.gmail.com with ESMTPSA id\n\tw125sm15346886pfw.214.2021.05.26.01.46.34\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 26 May 2021 01:46:35 -0700 (PDT)" ], "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=\"fX4YyQ/T\"; 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=R4HPHdHDV0NMZnrMmtHYY2z028FmfsUBJ/+t9xM/q/s=;\n\tb=fX4YyQ/Tyi94z9f9QbljJcolYDlD/oTcJRqaKbnyWQ/QQW+kIGGDHBGgoMJ5A3ka25\n\twVcUH4VBAVL0K15igAdyr1zQ5HKlI5ZG69PrEVHceJZyZpb+EvljRO4/1p0j0+qznxMS\n\tgiSNtG5adKi2U2wZ80Mvnxb28ACFNrEPX2M/4=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\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=R4HPHdHDV0NMZnrMmtHYY2z028FmfsUBJ/+t9xM/q/s=;\n\tb=U1msDDQElraEXWC1qX6ySQrhTIUNUkk7IAG1YIOdkzijiPVDiHsFE8tm6AlAGzuGio\n\tj1xD0SseH3Dd9yG3pg+PG3F5YWBe8PrTxRPGQ+B456bViSpEv4TmWoZRCsBiLleFe201\n\t802sc0jS3RAOI4x1RB95HOKNt8fIon4A3/GtddRUs+l9p00DT9ANU4mq3v5ekr6oR0ze\n\tlrQrYqTH4ZtlcZprOxZlJYRzrJZ6G88nkn8El1v/yrmxoB5OJE0pJwlXswykTIm9HUTT\n\thy1WAL3rTOiVEJ9oARFrbT5QF/sQC7OBVeDNWlrTBacNFTG/boTkmqkNCXDsu03Mp4BC\n\tkXVA==", "X-Gm-Message-State": "AOAM532FkID4E8A5sUs8PY4JIT68Oy5bqeNRtgA9IzudYOAw9VCz+wSw\n\tpKxA6scvoUWA76xuUg/yR/owGj7QsJrhuA==", "X-Google-Smtp-Source": "ABdhPJxfOcpiox2gJh7P2NzPGKDheDrKQuUafOIN93IiL2bEEhQ07/7TxC/fICveEmefLxWQ21+8Rw==", "X-Received": "by 2002:a05:6a00:23c6:b029:28f:d463:17ba with SMTP id\n\tg6-20020a056a0023c6b029028fd46317bamr34800823pfc.65.1622018796054; \n\tWed, 26 May 2021 01:46:36 -0700 (PDT)", "From": "Hirokazu Honda <hiroh@chromium.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 26 May 2021 17:46:28 +0900", "Message-Id": "<20210526084628.3893266-2-hiroh@chromium.org>", "X-Mailer": "git-send-email 2.31.1.818.g46aad6cb9e-goog", "In-Reply-To": "<20210526084628.3893266-1-hiroh@chromium.org>", "References": "<20210526084628.3893266-1-hiroh@chromium.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v2 1/1] android: CameraHalManager: Create\n\ta static object dynamically", "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": "Originally CameraHalManager is created in the libcamera start up\nand destroyed in the libcamera termination. However,\nCameraHalManager destructor can access other static objects that\nhas been destroyed.\nAvoid this issue by destroying CameraHalManager when tear_down() is\ncalled in ChromeOS or leaking it in other platforms.\n\nSigned-off-by: Hirokazu Honda <hiroh@chromium.org>\n---\n src/android/camera3_hal.cpp | 13 ++++++-------\n src/android/camera_hal_manager.cpp | 7 +++++++\n src/android/camera_hal_manager.h | 5 ++++-\n src/android/cros/camera3_hal.cpp | 3 +++\n src/android/cros/meson.build | 3 ++-\n 5 files changed, 22 insertions(+), 9 deletions(-)", "diff": "diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp\nindex 08773d33..e6d435e0 100644\n--- a/src/android/camera3_hal.cpp\n+++ b/src/android/camera3_hal.cpp\n@@ -16,25 +16,23 @@ using namespace libcamera;\n \n LOG_DEFINE_CATEGORY(HAL)\n \n-static CameraHalManager cameraManager;\n-\n /*------------------------------------------------------------------------------\n * Android Camera HAL callbacks\n */\n \n static int hal_get_number_of_cameras()\n {\n-\treturn cameraManager.numCameras();\n+\treturn CameraHalManager::instance()->numCameras();\n }\n \n static int hal_get_camera_info(int id, struct camera_info *info)\n {\n-\treturn cameraManager.getCameraInfo(id, info);\n+\treturn CameraHalManager::instance()->getCameraInfo(id, info);\n }\n \n static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)\n {\n-\tcameraManager.setCallbacks(callbacks);\n+\tCameraHalManager::instance()->setCallbacks(callbacks);\n \n \treturn 0;\n }\n@@ -62,7 +60,7 @@ static int hal_init()\n {\n \tLOG(HAL, Info) << \"Initialising Android camera HAL\";\n \n-\tcameraManager.init();\n+\tCameraHalManager::instance()->init();\n \n \treturn 0;\n }\n@@ -77,7 +75,8 @@ static int hal_dev_open(const hw_module_t *module, const char *name,\n \tLOG(HAL, Debug) << \"Open camera \" << name;\n \n \tint id = atoi(name);\n-\tauto [camera, ret] = cameraManager.open(id, module);\n+\n+\tauto [camera, ret] = CameraHalManager::instance()->open(id, module);\n \tif (!camera) {\n \t\tLOG(HAL, Error)\n \t\t\t<< \"Failed to open camera module '\" << id << \"'\";\ndiff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp\nindex f5b86974..54087d3a 100644\n--- a/src/android/camera_hal_manager.cpp\n+++ b/src/android/camera_hal_manager.cpp\n@@ -37,6 +37,13 @@ CameraHalManager::CameraHalManager()\n /* CameraManager calls stop() in the destructor. */\n CameraHalManager::~CameraHalManager() = default;\n \n+/* static */\n+CameraHalManager *CameraHalManager::instance()\n+{\n+\tstatic CameraHalManager *cameraHalManager = new CameraHalManager;\n+\treturn cameraHalManager;\n+}\n+\n int CameraHalManager::init()\n {\n \tcameraManager_ = std::make_unique<CameraManager>();\ndiff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h\nindex af1581da..db9354a7 100644\n--- a/src/android/camera_hal_manager.h\n+++ b/src/android/camera_hal_manager.h\n@@ -26,9 +26,10 @@ class CameraDevice;\n class CameraHalManager\n {\n public:\n-\tCameraHalManager();\n \t~CameraHalManager();\n \n+\tstatic CameraHalManager *instance();\n+\n \tint init();\n \n \tstd::tuple<CameraDevice *, int>\n@@ -44,6 +45,8 @@ private:\n \n \tstatic constexpr unsigned int firstExternalCameraId_ = 1000;\n \n+\tCameraHalManager();\n+\n \tstatic int32_t cameraLocation(const libcamera::Camera *cam);\n \n \tvoid cameraAdded(std::shared_ptr<libcamera::Camera> cam);\ndiff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp\nindex 31ad36ac..d6fc1d0f 100644\n--- a/src/android/cros/camera3_hal.cpp\n+++ b/src/android/cros/camera3_hal.cpp\n@@ -7,12 +7,15 @@\n \n #include <cros-camera/cros_camera_hal.h>\n \n+#include \"../camera_hal_manager.h\"\n+\n static void set_up(cros::CameraMojoChannelManagerToken *token)\n {\n }\n \n static void tear_down()\n {\n+\tdelete CameraHalManager::instance();\n }\n \n cros::cros_camera_hal_t CROS_CAMERA_EXPORT CROS_CAMERA_HAL_INFO_SYM = {\ndiff --git a/src/android/cros/meson.build b/src/android/cros/meson.build\nindex 4aab0f20..13ec8f0a 100644\n--- a/src/android/cros/meson.build\n+++ b/src/android/cros/meson.build\n@@ -12,6 +12,7 @@ cros_hal_info = static_library('cros_hal_info',\n cros_hal_info_sources,\n dependencies : dependency('libcros_camera'),\n c_args : '-Wno-shadow',\n- include_directories : android_includes)\n+ include_directories : [android_includes,\n+ libcamera_includes])\n \n libcamera_objects += cros_hal_info.extract_objects('camera3_hal.cpp')\n", "prefixes": [ "libcamera-devel", "v2", "1/1" ] }