[libcamera-devel] [PATCH 3/3] libcamera: message: Add user message types

Jacopo Mondi jacopo at jmondi.org
Mon Jul 15 07:59:35 CEST 2019


Add an operation to the Message class to create unique message type to
be used by derived classes to uniquely identify the messages they
handle.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/include/message.h |  8 ++++++++
 src/libcamera/message.cpp       | 20 ++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h
index db17d647c280..e7dd85a606a3 100644
--- a/src/libcamera/include/message.h
+++ b/src/libcamera/include/message.h
@@ -7,6 +7,8 @@
 #ifndef __LIBCAMERA_MESSAGE_H__
 #define __LIBCAMERA_MESSAGE_H__
 
+#include <mutex>
+
 namespace libcamera {
 
 class Object;
@@ -19,6 +21,7 @@ public:
 	enum Type {
 		None = 0,
 		SignalMessage = 1,
+		UserMessage = 1000,
 	};
 
 	Message(Type type);
@@ -27,11 +30,16 @@ public:
 	Type type() const { return type_; }
 	Object *receiver() const { return receiver_; }
 
+	static Type registerUserMessageType();
+
 private:
 	friend class Thread;
 
 	Type type_;
 	Object *receiver_;
+
+	static std::mutex mutex_;
+	static Type nextUserType_;
 };
 
 class SignalMessage : public Message
diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp
index 0580c1051622..f82a3115595d 100644
--- a/src/libcamera/message.cpp
+++ b/src/libcamera/message.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "message.h"
+#include "thread.h"
 
 #include "log.h"
 
@@ -31,6 +32,9 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(Message)
 
+std::mutex Message::mutex_;
+Message::Type Message::nextUserType_ = Message::UserMessage;
+
 /**
  * \class Message
  * \brief A message that can be posted to a Thread
@@ -68,6 +72,22 @@ Message::~Message()
  * \return The message receiver
  */
 
+/**
+ * \brief Retrieve a unique identifier for user defined message types
+ *
+ * Derived classes can define their own message types and this method provides
+ * them a unique identifier to use for that purpose.
+ *
+ * \return A new unique message type
+ */
+Message::Type Message::registerUserMessageType()
+{
+	MutexLocker locker(mutex_);
+
+	return nextUserType_ = static_cast<Type>
+			      (static_cast<unsigned int>(nextUserType_) + 1);
+}
+
 /**
  * \class SignalMessage
  * \brief A message carrying a Signal across threads
-- 
2.21.0



More information about the libcamera-devel mailing list