[{"id":24815,"web_url":"https://patchwork.libcamera.org/comment/24815/","msgid":"<YwzKbT39JhYMM0Z6@pendragon.ideasonboard.com>","date":"2022-08-29T14:17:17","subject":"Re: [libcamera-devel] [PATCH v2 2/2] libcamera: base: log: Fix\n\tLogCategory creation issues","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Tomi,\n\nThank you for the patch.\n\nOn Mon, Aug 29, 2022 at 11:44:45AM +0300, Tomi Valkeinen wrote:\n> Each declaration of a LogCategory will create a new LogCategory, and\n> will be stored in an unordered_set Logger::categories_. This means that\n> when a plugin .so is unloaded and loaded, as happens when destructing\n> and creating a CamereManager, we'll get duplicate categories.\n> \n> The Logger::registerCategory docs say \"Log categories must have unique\n> names. If a category with the same name already exists this function\n> performs no operation.\". The code does not comply with this.\n> \n> We solve the issue with two changes:\n> \n> Change the unordered_set to a vector for simplicity, as there's no need\n> for an unordered_set.\n> \n> Instead of using the LogCategory constructor to create new categories in\n> _LOG_CATEGORY() macro, use a factory method. The factory method will\n> return either an existing LogCategory if one exists with the given name,\n> or a newly created one.\n> \n> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> ---\n>  include/libcamera/base/log.h |  6 +++--\n>  src/libcamera/base/log.cpp   | 49 +++++++++++++++++++++++++++++++-----\n>  2 files changed, 47 insertions(+), 8 deletions(-)\n> \n> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> index 8b462767..dcaacbe0 100644\n> --- a/include/libcamera/base/log.h\n> +++ b/include/libcamera/base/log.h\n> @@ -29,7 +29,7 @@ enum LogSeverity {\n>  class LogCategory\n>  {\n>  public:\n> -\texplicit LogCategory(const char *name);\n> +\tstatic LogCategory *create(const char *name);\n>  \n>  \tconst std::string &name() const { return name_; }\n>  \tLogSeverity severity() const { return severity_; }\n> @@ -38,6 +38,8 @@ public:\n>  \tstatic const LogCategory &defaultCategory();\n>  \n>  private:\n> +\texplicit LogCategory(const char *name);\n> +\n>  \tconst std::string name_;\n>  \tLogSeverity severity_;\n>  };\n> @@ -49,7 +51,7 @@ extern const LogCategory &_LOG_CATEGORY(name)();\n>  const LogCategory &_LOG_CATEGORY(name)()\t\t\t\t\\\n>  {\t\t\t\t\t\t\t\t\t\\\n>  \t/* The instance will be deleted by the Logger destructor. */\t\\\n> -\tstatic LogCategory *category = new LogCategory(#name);\t\t\\\n> +\tstatic LogCategory *category = LogCategory::create(#name);\t\\\n>  \treturn *category;\t\t\t\t\t\t\\\n>  }\n>  \n> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> index a4a5b452..8bf1beb9 100644\n> --- a/src/libcamera/base/log.cpp\n> +++ b/src/libcamera/base/log.cpp\n> @@ -314,10 +314,11 @@ private:\n>  \n>  \tfriend LogCategory;\n>  \tvoid registerCategory(LogCategory *category);\n> +\tLogCategory *findCategory(const char *name) const;\n>  \n>  \tstatic bool destroyed_;\n>  \n> -\tstd::unordered_set<LogCategory *> categories_;\n> +\tstd::vector<LogCategory *> categories_;\n>  \tstd::list<std::pair<std::string, LogSeverity>> levels_;\n>  \n>  \tstd::shared_ptr<LogOutput> output_;\n> @@ -707,12 +708,12 @@ LogSeverity Logger::parseLogLevel(const std::string &level)\n>   * \\brief Register a log category with the logger\n>   * \\param[in] category The log category\n>   *\n> - * Log categories must have unique names. If a category with the same name\n> - * already exists this function performs no operation.\n> + * Log categories must have unique names. It is invalid to call this function\n> + * if a log category with the same name already exists.\n>   */\n>  void Logger::registerCategory(LogCategory *category)\n>  {\n> -\tcategories_.insert(category);\n> +\tcategories_.push_back(category);\n>  \n>  \tconst std::string &name = category->name();\n>  \tfor (const std::pair<std::string, LogSeverity> &level : levels_) {\n> @@ -736,6 +737,22 @@ void Logger::registerCategory(LogCategory *category)\n>  \t}\n>  }\n>  \n> +/**\n> + * \\brief Find an existing log category with the given name\n> + * \\param[in] name Name of the log category\n> + * \\return The pointer to the found log category or nullptr if not found.\n\ns/.$//\n\nI'll fix when applying.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> + */\n> +LogCategory *Logger::findCategory(const char *name) const\n> +{\n> +\tif (auto it = std::find_if(categories_.begin(), categories_.end(),\n> +\t\t\t\t   [name](auto c) { return c->name() == name; });\n> +\t    it != categories_.end()) {\n> +\t\treturn *it;\n> +\t}\n> +\n> +\treturn nullptr;\n> +}\n> +\n>  /**\n>   * \\enum LogSeverity\n>   * Log message severity\n> @@ -760,6 +777,27 @@ void Logger::registerCategory(LogCategory *category)\n>   * and is used to control the log level per group.\n>   */\n>  \n> +/**\n> + * \\brief Create a new LogCategory or return an existing one\n> + * \\param[in] name Name of the log category\n> + *\n> + * Create and return a new LogCategory with the given name if such a category\n> + * does not yet exist, or return the existing one.\n> + *\n> + * \\return The pointer to the LogCategory\n> + */\n> +LogCategory *LogCategory::create(const char *name)\n> +{\n> +\tLogCategory *category = Logger::instance()->findCategory(name);\n> +\n> +\tif (!category) {\n> +\t\tcategory = new LogCategory(name);\n> +\t\tLogger::instance()->registerCategory(category);\n> +\t}\n> +\n> +\treturn category;\n> +}\n> +\n>  /**\n>   * \\brief Construct a log category\n>   * \\param[in] name The category name\n> @@ -767,7 +805,6 @@ void Logger::registerCategory(LogCategory *category)\n>  LogCategory::LogCategory(const char *name)\n>  \t: name_(name), severity_(LogSeverity::LogInfo)\n>  {\n> -\tLogger::instance()->registerCategory(this);\n>  }\n>  \n>  /**\n> @@ -804,7 +841,7 @@ void LogCategory::setSeverity(LogSeverity severity)\n>   */\n>  const LogCategory &LogCategory::defaultCategory()\n>  {\n> -\tstatic const LogCategory *category = new LogCategory(\"default\");\n> +\tstatic const LogCategory *category = LogCategory::create(\"default\");\n>  \treturn *category;\n>  }\n>","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 48780C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Aug 2022 14:17:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E98A761FC3;\n\tMon, 29 Aug 2022 16:17:27 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 055F161FBA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Aug 2022 16:17:27 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7B5C2505;\n\tMon, 29 Aug 2022 16:17:26 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1661782647;\n\tbh=OdIRKt9wY4bsmVTPRobmBVl52mCm9wXnqMXah1mXBXc=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=lzBYNz7JMz3hWBnLHDRw/0cxmcU5vVmcFO+d5v9ShUu/AFrUqxg/p8HiiVoTzHyX0\n\tBODAjl8vMcrTosADmLuz2bDlz0dxJ62ph952GnIX/kQhrV+5BBR9WKXJM24NtsMluI\n\tUsOLM5qV+iE2WER9QI894VAbIFMMp96O2LGXbvVcfC5Pe3rPr/S1KtBYoLkMJK4rR7\n\tR8xMCxLJurHbuiBgql4D+w1Ipynw/mphleoBnUxGlXjMMN2ZI5kgrAz/creWasIZ0v\n\tCcqHyGlgKEa3PtpdydjyQ+60jrd3D0tKbN6ycxInsuXLFScG9W/TJTP1ifpBBb3OJF\n\tqL4hjRHOR7xog==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1661782646;\n\tbh=OdIRKt9wY4bsmVTPRobmBVl52mCm9wXnqMXah1mXBXc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=HMA0JueGtiw6sBcVHjLMPMHeKOiznWmoerWqk481AluaCCDQdPXmhU07Slek9K5OE\n\tbT+iS0hIv0AbDR61SfBm1Wq3HnuJgwB+se1KRpsQEfDo2vcrOpRvVvuGXiMSvF3Vgx\n\tA79pj3ncUMC1GPgX8pppijWHp2ll+G9hSO3/6H/o="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"HMA0JueG\"; dkim-atps=neutral","Date":"Mon, 29 Aug 2022 17:17:17 +0300","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Message-ID":"<YwzKbT39JhYMM0Z6@pendragon.ideasonboard.com>","References":"<20220829084445.61585-1-tomi.valkeinen@ideasonboard.com>\n\t<20220829084445.61585-3-tomi.valkeinen@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220829084445.61585-3-tomi.valkeinen@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] libcamera: base: log: Fix\n\tLogCategory creation issues","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25475,"web_url":"https://patchwork.libcamera.org/comment/25475/","msgid":"<166618436924.2560709.4454378712610197450@Monstersaurus>","date":"2022-10-19T12:59:29","subject":"Re: [libcamera-devel] [PATCH v2 2/2] libcamera: base: log: Fix\n\tLogCategory creation issues","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart via libcamera-devel (2022-08-29 15:17:17)\n> Hi Tomi,\n> \n> Thank you for the patch.\n> \n> On Mon, Aug 29, 2022 at 11:44:45AM +0300, Tomi Valkeinen wrote:\n> > Each declaration of a LogCategory will create a new LogCategory, and\n> > will be stored in an unordered_set Logger::categories_. This means that\n> > when a plugin .so is unloaded and loaded, as happens when destructing\n> > and creating a CamereManager, we'll get duplicate categories.\n> > \n> > The Logger::registerCategory docs say \"Log categories must have unique\n> > names. If a category with the same name already exists this function\n> > performs no operation.\". The code does not comply with this.\n> > \n> > We solve the issue with two changes:\n> > \n> > Change the unordered_set to a vector for simplicity, as there's no need\n> > for an unordered_set.\n> > \n> > Instead of using the LogCategory constructor to create new categories in\n> > _LOG_CATEGORY() macro, use a factory method. The factory method will\n> > return either an existing LogCategory if one exists with the given name,\n> > or a newly created one.\n> > \n> > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> > ---\n> >  include/libcamera/base/log.h |  6 +++--\n> >  src/libcamera/base/log.cpp   | 49 +++++++++++++++++++++++++++++++-----\n> >  2 files changed, 47 insertions(+), 8 deletions(-)\n> > \n> > diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> > index 8b462767..dcaacbe0 100644\n> > --- a/include/libcamera/base/log.h\n> > +++ b/include/libcamera/base/log.h\n> > @@ -29,7 +29,7 @@ enum LogSeverity {\n> >  class LogCategory\n> >  {\n> >  public:\n> > -     explicit LogCategory(const char *name);\n> > +     static LogCategory *create(const char *name);\n> >  \n> >       const std::string &name() const { return name_; }\n> >       LogSeverity severity() const { return severity_; }\n> > @@ -38,6 +38,8 @@ public:\n> >       static const LogCategory &defaultCategory();\n> >  \n> >  private:\n> > +     explicit LogCategory(const char *name);\n> > +\n> >       const std::string name_;\n> >       LogSeverity severity_;\n> >  };\n> > @@ -49,7 +51,7 @@ extern const LogCategory &_LOG_CATEGORY(name)();\n> >  const LogCategory &_LOG_CATEGORY(name)()                             \\\n> >  {                                                                    \\\n> >       /* The instance will be deleted by the Logger destructor. */    \\\n> > -     static LogCategory *category = new LogCategory(#name);          \\\n> > +     static LogCategory *category = LogCategory::create(#name);      \\\n> >       return *category;                                               \\\n> >  }\n> >  \n> > diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> > index a4a5b452..8bf1beb9 100644\n> > --- a/src/libcamera/base/log.cpp\n> > +++ b/src/libcamera/base/log.cpp\n> > @@ -314,10 +314,11 @@ private:\n> >  \n> >       friend LogCategory;\n> >       void registerCategory(LogCategory *category);\n> > +     LogCategory *findCategory(const char *name) const;\n> >  \n> >       static bool destroyed_;\n> >  \n> > -     std::unordered_set<LogCategory *> categories_;\n> > +     std::vector<LogCategory *> categories_;\n> >       std::list<std::pair<std::string, LogSeverity>> levels_;\n> >  \n> >       std::shared_ptr<LogOutput> output_;\n> > @@ -707,12 +708,12 @@ LogSeverity Logger::parseLogLevel(const std::string &level)\n> >   * \\brief Register a log category with the logger\n> >   * \\param[in] category The log category\n> >   *\n> > - * Log categories must have unique names. If a category with the same name\n> > - * already exists this function performs no operation.\n> > + * Log categories must have unique names. It is invalid to call this function\n> > + * if a log category with the same name already exists.\n> >   */\n> >  void Logger::registerCategory(LogCategory *category)\n> >  {\n> > -     categories_.insert(category);\n> > +     categories_.push_back(category);\n> >  \n> >       const std::string &name = category->name();\n> >       for (const std::pair<std::string, LogSeverity> &level : levels_) {\n> > @@ -736,6 +737,22 @@ void Logger::registerCategory(LogCategory *category)\n> >       }\n> >  }\n> >  \n> > +/**\n> > + * \\brief Find an existing log category with the given name\n> > + * \\param[in] name Name of the log category\n> > + * \\return The pointer to the found log category or nullptr if not found.\n> \n> s/.$//\n> \n> I'll fix when applying.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> > + */\n> > +LogCategory *Logger::findCategory(const char *name) const\n> > +{\n> > +     if (auto it = std::find_if(categories_.begin(), categories_.end(),\n> > +                                [name](auto c) { return c->name() == name; });\n> > +         it != categories_.end()) {\n> > +             return *it;\n> > +     }\n> > +\n> > +     return nullptr;\n> > +}\n> > +\n> >  /**\n> >   * \\enum LogSeverity\n> >   * Log message severity\n> > @@ -760,6 +777,27 @@ void Logger::registerCategory(LogCategory *category)\n> >   * and is used to control the log level per group.\n> >   */\n> >  \n> > +/**\n> > + * \\brief Create a new LogCategory or return an existing one\n> > + * \\param[in] name Name of the log category\n> > + *\n> > + * Create and return a new LogCategory with the given name if such a category\n> > + * does not yet exist, or return the existing one.\n> > + *\n> > + * \\return The pointer to the LogCategory\n> > + */\n> > +LogCategory *LogCategory::create(const char *name)\n> > +{\n> > +     LogCategory *category = Logger::instance()->findCategory(name);\n> > +\n> > +     if (!category) {\n> > +             category = new LogCategory(name);\n> > +             Logger::instance()->registerCategory(category);\n> > +     }\n> > +\n> > +     return category;\n> > +}\n> > +\n> >  /**\n> >   * \\brief Construct a log category\n> >   * \\param[in] name The category name\n> > @@ -767,7 +805,6 @@ void Logger::registerCategory(LogCategory *category)\n> >  LogCategory::LogCategory(const char *name)\n> >       : name_(name), severity_(LogSeverity::LogInfo)\n> >  {\n> > -     Logger::instance()->registerCategory(this);\n> >  }\n> >  \n> >  /**\n> > @@ -804,7 +841,7 @@ void LogCategory::setSeverity(LogSeverity severity)\n> >   */\n> >  const LogCategory &LogCategory::defaultCategory()\n> >  {\n> > -     static const LogCategory *category = new LogCategory(\"default\");\n> > +     static const LogCategory *category = LogCategory::create(\"default\");\n> >       return *category;\n> >  }\n> >  \n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","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 458F5BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 19 Oct 2022 12:59:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0B49262E5D;\n\tWed, 19 Oct 2022 14:59:34 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E243A62DFA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Oct 2022 14:59:31 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 871375A4;\n\tWed, 19 Oct 2022 14:59:31 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666184374;\n\tbh=EfjNhU3zL2RlA0sikaNkoj1omn5V+8wi4G0EEd4vTLI=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=jzj6RmOYQL0j2+1mPLuDZZ0PzsMhGD49dpQdE5xWq5xAKR7X6td8OZcA4LBAH341N\n\tJikQeg25Y5ycXmWo1PHuBc3yh2q5v1lOvIHoA5hGC6mRQ/FCq6ltFKLnfJAL36r2h3\n\th2pGvaA3y8yN3PB4ui3gbOyAux+sVng5883TXbxt4lQH6oIoNmMhv55tkEBbXialLl\n\t2dla8WAnNPKfPJbq193i+M6FYgJbDDKwpldbo5fhgsGpX+4N6OMdwhg/Lf/sEQrmpc\n\tKhm8WodcTipaBG0Mcb8LDnbSt0YbEJGQntfNHdE3rns2X7+IdBJ1NWIqscZkcMFoo+\n\tNwqZglIFxwliA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666184371;\n\tbh=EfjNhU3zL2RlA0sikaNkoj1omn5V+8wi4G0EEd4vTLI=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=U2ZDV8pCxD73Ud0MgaEIIfCLunWK97QP6nQ/pwc87uQSRYxryTQPwKZl5BPX0zgK4\n\tEDZ7dGQ5WOWA6xeS18ilNzV2MCNzvOycZUaDsadK1rWV8dNjUT8ueT4Wz3Cm8oLhZq\n\tXeeZJulqXUtExcpM1jyID+Z7hbOyT+kf6lpxU9B0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"U2ZDV8pC\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<YwzKbT39JhYMM0Z6@pendragon.ideasonboard.com>","References":"<20220829084445.61585-1-tomi.valkeinen@ideasonboard.com>\n\t<20220829084445.61585-3-tomi.valkeinen@ideasonboard.com>\n\t<YwzKbT39JhYMM0Z6@pendragon.ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tLaurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>, \n\tTomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Date":"Wed, 19 Oct 2022 13:59:29 +0100","Message-ID":"<166618436924.2560709.4454378712610197450@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] libcamera: base: log: Fix\n\tLogCategory creation issues","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>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]