[{"id":2285,"web_url":"https://patchwork.libcamera.org/comment/2285/","msgid":"<20190716073924.ke5dwyh3dhg264sl@uno.localdomain>","date":"2019-07-16T07:39:24","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: message: Add user\n\tmessage types","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"On Mon, Jul 15, 2019 at 12:29:39PM +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n>\n> Reserve identifiers for user-defined message types and add an operation\n> to the Message class to create register the type identifiers.\n\ncreate 'and' register ?\n\nOtherwise\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes since v1:\n>\n> - Replace mutex with atomic\n> - Rework documentation\n> - Rename registerUserMessageType() to registerMessageType()\n> - Extend the Message test\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/libcamera/include/message.h |  7 +++++++\n>  src/libcamera/message.cpp       | 36 +++++++++++++++++++++++++++++++++\n>  test/message.cpp                | 11 ++++++++++\n>  3 files changed, 54 insertions(+)\n>\n> diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h\n> index db17d647c280..416fe74b10ad 100644\n> --- a/src/libcamera/include/message.h\n> +++ b/src/libcamera/include/message.h\n> @@ -7,6 +7,8 @@\n>  #ifndef __LIBCAMERA_MESSAGE_H__\n>  #define __LIBCAMERA_MESSAGE_H__\n>\n> +#include <atomic>\n> +\n>  namespace libcamera {\n>\n>  class Object;\n> @@ -19,6 +21,7 @@ public:\n>  \tenum Type {\n>  \t\tNone = 0,\n>  \t\tSignalMessage = 1,\n> +\t\tUserMessage = 1000,\n>  \t};\n>\n>  \tMessage(Type type);\n> @@ -27,11 +30,15 @@ public:\n>  \tType type() const { return type_; }\n>  \tObject *receiver() const { return receiver_; }\n>\n> +\tstatic Type registerMessageType();\n> +\n>  private:\n>  \tfriend class Thread;\n>\n>  \tType type_;\n>  \tObject *receiver_;\n> +\n> +\tstatic std::atomic_uint nextUserType_;\n>  };\n>\n>  class SignalMessage : public Message\n> diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp\n> index 9f22ad7fc0b0..d44d2a4c73a8 100644\n> --- a/src/libcamera/message.cpp\n> +++ b/src/libcamera/message.cpp\n> @@ -31,6 +31,8 @@ namespace libcamera {\n>\n>  LOG_DEFINE_CATEGORY(Message)\n>\n> +std::atomic_uint Message::nextUserType_{ Message::UserMessage };\n> +\n>  /**\n>   * \\class Message\n>   * \\brief A message that can be posted to a Thread\n> @@ -43,6 +45,8 @@ LOG_DEFINE_CATEGORY(Message)\n>   * \\brief Invalid message type\n>   * \\var Message::SignalMessage\n>   * \\brief Asynchronous signal delivery across threads\n> + * \\var Message::UserMessage\n> + * \\brief First value available for user-defined messages\n>   */\n>\n>  /**\n> @@ -70,6 +74,38 @@ Message::~Message()\n>   * \\return The message receiver\n>   */\n>\n> +/**\n> + * \\brief Reserve and register a custom user-defined message type\n> + *\n> + * Custom message types use values starting at Message::UserMessage. Assigning\n> + * custom types manually may lead to accidental duplicated types. To avoid this\n> + * problem, this method reserves and returns the next available user-defined\n> + * message type.\n> + *\n> + * The recommended way to use this method is to subclass Message and provide a\n> + * static accessor for the custom message type.\n> + *\n> + * \\code{.cpp}\n> + * class MyCustomMessage : public Message\n> + * {\n> + * public:\n> + *\tMyCustomMessage() : Message(type()) { }\n> + *\n> + *\tstatic Message::Type type()\n> + *\t{\n> + *\t\tstatic MessageType type = registerMessageType();\n> + *\t\treturn type;\n> + *\t}\n> + * };\n> + * \\endcode\n> + *\n> + * \\return A new unique message type\n> + */\n> +Message::Type Message::registerMessageType()\n> +{\n> +\treturn static_cast<Message::Type>(nextUserType_++);\n> +}\n> +\n>  /**\n>   * \\class SignalMessage\n>   * \\brief A message carrying a Signal across threads\n> diff --git a/test/message.cpp b/test/message.cpp\n> index de98da3e8754..3775c30a20b3 100644\n> --- a/test/message.cpp\n> +++ b/test/message.cpp\n> @@ -52,6 +52,17 @@ class MessageTest : public Test\n>  protected:\n>  \tint run()\n>  \t{\n> +\t\tMessage::Type msgType[2] = {\n> +\t\t\tMessage::registerMessageType(),\n> +\t\t\tMessage::registerMessageType(),\n> +\t\t};\n> +\n> +\t\tif (msgType[0] != Message::UserMessage ||\n> +\t\t    msgType[1] != Message::UserMessage + 1) {\n> +\t\t\tcout << \"Failed to register message types\" << endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n>  \t\tMessageReceiver receiver;\n>  \t\treceiver.moveToThread(&thread_);\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AB2D360C23\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 16 Jul 2019 09:38:08 +0200 (CEST)","from uno.localdomain (unknown [104.132.146.101])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 66FA840012;\n\tTue, 16 Jul 2019 07:38:06 +0000 (UTC)"],"X-Originating-IP":"104.132.146.101","Date":"Tue, 16 Jul 2019 09:39:24 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190716073924.ke5dwyh3dhg264sl@uno.localdomain>","References":"<20190715092939.15349-1-laurent.pinchart@ideasonboard.com>\n\t<20190715092939.15349-2-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"k2sq3agmywyr32aa\"","Content-Disposition":"inline","In-Reply-To":"<20190715092939.15349-2-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: message: Add user\n\tmessage types","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Tue, 16 Jul 2019 07:38:08 -0000"}},{"id":2289,"web_url":"https://patchwork.libcamera.org/comment/2289/","msgid":"<20190716075507.GD22355@pendragon.ideasonboard.com>","date":"2019-07-16T07:55:07","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: message: Add user\n\tmessage types","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Tue, Jul 16, 2019 at 09:39:24AM +0200, Jacopo Mondi wrote:\n> On Mon, Jul 15, 2019 at 12:29:39PM +0300, Laurent Pinchart wrote:\n> > From: Jacopo Mondi <jacopo@jmondi.org>\n> >\n> > Reserve identifiers for user-defined message types and add an operation\n> > to the Message class to create register the type identifiers.\n> \n> create 'and' register ?\n\nOops :-) Will fix.\n\n> Otherwise\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > Changes since v1:\n> >\n> > - Replace mutex with atomic\n> > - Rework documentation\n> > - Rename registerUserMessageType() to registerMessageType()\n> > - Extend the Message test\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/libcamera/include/message.h |  7 +++++++\n> >  src/libcamera/message.cpp       | 36 +++++++++++++++++++++++++++++++++\n> >  test/message.cpp                | 11 ++++++++++\n> >  3 files changed, 54 insertions(+)\n> >\n> > diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h\n> > index db17d647c280..416fe74b10ad 100644\n> > --- a/src/libcamera/include/message.h\n> > +++ b/src/libcamera/include/message.h\n> > @@ -7,6 +7,8 @@\n> >  #ifndef __LIBCAMERA_MESSAGE_H__\n> >  #define __LIBCAMERA_MESSAGE_H__\n> >\n> > +#include <atomic>\n> > +\n> >  namespace libcamera {\n> >\n> >  class Object;\n> > @@ -19,6 +21,7 @@ public:\n> >  \tenum Type {\n> >  \t\tNone = 0,\n> >  \t\tSignalMessage = 1,\n> > +\t\tUserMessage = 1000,\n> >  \t};\n> >\n> >  \tMessage(Type type);\n> > @@ -27,11 +30,15 @@ public:\n> >  \tType type() const { return type_; }\n> >  \tObject *receiver() const { return receiver_; }\n> >\n> > +\tstatic Type registerMessageType();\n> > +\n> >  private:\n> >  \tfriend class Thread;\n> >\n> >  \tType type_;\n> >  \tObject *receiver_;\n> > +\n> > +\tstatic std::atomic_uint nextUserType_;\n> >  };\n> >\n> >  class SignalMessage : public Message\n> > diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp\n> > index 9f22ad7fc0b0..d44d2a4c73a8 100644\n> > --- a/src/libcamera/message.cpp\n> > +++ b/src/libcamera/message.cpp\n> > @@ -31,6 +31,8 @@ namespace libcamera {\n> >\n> >  LOG_DEFINE_CATEGORY(Message)\n> >\n> > +std::atomic_uint Message::nextUserType_{ Message::UserMessage };\n> > +\n> >  /**\n> >   * \\class Message\n> >   * \\brief A message that can be posted to a Thread\n> > @@ -43,6 +45,8 @@ LOG_DEFINE_CATEGORY(Message)\n> >   * \\brief Invalid message type\n> >   * \\var Message::SignalMessage\n> >   * \\brief Asynchronous signal delivery across threads\n> > + * \\var Message::UserMessage\n> > + * \\brief First value available for user-defined messages\n> >   */\n> >\n> >  /**\n> > @@ -70,6 +74,38 @@ Message::~Message()\n> >   * \\return The message receiver\n> >   */\n> >\n> > +/**\n> > + * \\brief Reserve and register a custom user-defined message type\n> > + *\n> > + * Custom message types use values starting at Message::UserMessage. Assigning\n> > + * custom types manually may lead to accidental duplicated types. To avoid this\n> > + * problem, this method reserves and returns the next available user-defined\n> > + * message type.\n> > + *\n> > + * The recommended way to use this method is to subclass Message and provide a\n> > + * static accessor for the custom message type.\n> > + *\n> > + * \\code{.cpp}\n> > + * class MyCustomMessage : public Message\n> > + * {\n> > + * public:\n> > + *\tMyCustomMessage() : Message(type()) { }\n> > + *\n> > + *\tstatic Message::Type type()\n> > + *\t{\n> > + *\t\tstatic MessageType type = registerMessageType();\n> > + *\t\treturn type;\n> > + *\t}\n> > + * };\n> > + * \\endcode\n> > + *\n> > + * \\return A new unique message type\n> > + */\n> > +Message::Type Message::registerMessageType()\n> > +{\n> > +\treturn static_cast<Message::Type>(nextUserType_++);\n> > +}\n> > +\n> >  /**\n> >   * \\class SignalMessage\n> >   * \\brief A message carrying a Signal across threads\n> > diff --git a/test/message.cpp b/test/message.cpp\n> > index de98da3e8754..3775c30a20b3 100644\n> > --- a/test/message.cpp\n> > +++ b/test/message.cpp\n> > @@ -52,6 +52,17 @@ class MessageTest : public Test\n> >  protected:\n> >  \tint run()\n> >  \t{\n> > +\t\tMessage::Type msgType[2] = {\n> > +\t\t\tMessage::registerMessageType(),\n> > +\t\t\tMessage::registerMessageType(),\n> > +\t\t};\n> > +\n> > +\t\tif (msgType[0] != Message::UserMessage ||\n> > +\t\t    msgType[1] != Message::UserMessage + 1) {\n> > +\t\t\tcout << \"Failed to register message types\" << endl;\n> > +\t\t\treturn TestFail;\n> > +\t\t}\n> > +\n> >  \t\tMessageReceiver receiver;\n> >  \t\treceiver.moveToThread(&thread_);\n> >","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F089F61AD3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 16 Jul 2019 09:55:37 +0200 (CEST)","from pendragon.ideasonboard.com (unknown\n\t[IPv6:2a00:79e1:abc:3602:59ec:6c:1869:337])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A658E564;\n\tTue, 16 Jul 2019 09:55:36 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1563263737;\n\tbh=Ae+wBM3gzqxYQC62b8bIQ69uOPEgYCD3gDV4eTWmamI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=lMCb8I5IhFgdYH5T6HR4J42uWuh8efyUGtt5CdbYZ6LJaPwUGYXuWE23C7Bgt7umR\n\tIhlgUDGUZ3MpsZvkC1huw9RiGUdLdrxi2pHPXofdJIgfcLiRJFVG0y5Q7XklyDx1Sy\n\t36veWnLA7nIvtRYYERMl+UzBGiJnNXS638+IF1cY=","Date":"Tue, 16 Jul 2019 10:55:07 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190716075507.GD22355@pendragon.ideasonboard.com>","References":"<20190715092939.15349-1-laurent.pinchart@ideasonboard.com>\n\t<20190715092939.15349-2-laurent.pinchart@ideasonboard.com>\n\t<20190716073924.ke5dwyh3dhg264sl@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190716073924.ke5dwyh3dhg264sl@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: message: Add user\n\tmessage types","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Tue, 16 Jul 2019 07:55:38 -0000"}}]