From 06008b9156b74885aa2382dec9dc8c7854ca6f2e Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Mon, 28 Oct 2019 05:44:14 +0200
Subject: libcamera: object: Use bound method activePack() for invokeMethod()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The BoundMethodBase::activatePack() and the internal
Object::invokeMethod() are duplicate implementation of the same
mechanism. Use the former to replace the latter.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 include/libcamera/bound_method.h | 4 ++--
 include/libcamera/object.h       | 8 ++++----
 src/libcamera/bound_method.cpp   | 6 +++---
 src/libcamera/object.cpp         | 7 -------
 4 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
index 06c5a3b1..bdeb5469 100644
--- a/include/libcamera/bound_method.h
+++ b/include/libcamera/bound_method.h
@@ -37,7 +37,7 @@ public:
 	Object *object() const { return object_; }
 	ConnectionType connectionType() const { return connectionType_; }
 
-	void activatePack(void *pack);
+	void activatePack(void *pack, bool deleteMethod);
 	virtual void invokePack(void *pack) = 0;
 
 protected:
@@ -109,7 +109,7 @@ public:
 	void activate(Args... args)
 	{
 		if (this->object_)
-			BoundMethodBase::activatePack(new PackType{ args... });
+			BoundMethodBase::activatePack(new PackType{ args... }, false);
 		else
 			(static_cast<T *>(this->obj_)->*func_)(args...);
 	}
diff --git a/include/libcamera/object.h b/include/libcamera/object.h
index 3308330a..603a2292 100644
--- a/include/libcamera/object.h
+++ b/include/libcamera/object.h
@@ -33,10 +33,12 @@ public:
 	void invokeMethod(void (T::*func)(Args...), Args... args)
 	{
 		T *obj = static_cast<T *>(this);
-		BoundMethodBase *method = new BoundMemberMethod<T, Args...>(obj, this, func);
+		BoundMethodBase *method =
+			new BoundMemberMethod<T, Args...>(obj, this, func,
+							  ConnectionTypeQueued);
 		void *pack = new typename BoundMemberMethod<T, Args...>::PackType{ args... };
 
-		invokeMethod(method, pack);
+		method->activatePack(pack, true);
 	}
 
 	Thread *thread() const { return thread_; }
@@ -53,8 +55,6 @@ private:
 	friend class BoundMethodBase;
 	friend class Thread;
 
-	void invokeMethod(BoundMethodBase *method, void *pack);
-
 	void notifyThreadMove();
 
 	void connect(SignalBase *signal);
diff --git a/src/libcamera/bound_method.cpp b/src/libcamera/bound_method.cpp
index 60071736..4c0cd415 100644
--- a/src/libcamera/bound_method.cpp
+++ b/src/libcamera/bound_method.cpp
@@ -48,7 +48,7 @@ namespace libcamera {
  * deadlock will occur.
  */
 
-void BoundMethodBase::activatePack(void *pack)
+void BoundMethodBase::activatePack(void *pack, bool deleteMethod)
 {
 	ConnectionType type = connectionType_;
 	if (type == ConnectionTypeAuto) {
@@ -66,7 +66,7 @@ void BoundMethodBase::activatePack(void *pack)
 
 	case ConnectionTypeQueued: {
 		std::unique_ptr<Message> msg =
-			utils::make_unique<InvokeMessage>(this, pack);
+			utils::make_unique<InvokeMessage>(this, pack, nullptr, deleteMethod);
 		object_->postMessage(std::move(msg));
 		break;
 	}
@@ -75,7 +75,7 @@ void BoundMethodBase::activatePack(void *pack)
 		Semaphore semaphore;
 
 		std::unique_ptr<Message> msg =
-			utils::make_unique<InvokeMessage>(this, pack, &semaphore);
+			utils::make_unique<InvokeMessage>(this, pack, &semaphore, deleteMethod);
 		object_->postMessage(std::move(msg));
 
 		semaphore.acquire();
diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
index b0818f9a..509b2eba 100644
--- a/src/libcamera/object.cpp
+++ b/src/libcamera/object.cpp
@@ -153,13 +153,6 @@ void Object::message(Message *msg)
  * remains valid until the method is invoked.
  */
 
-void Object::invokeMethod(BoundMethodBase *method, void *args)
-{
-	std::unique_ptr<Message> msg =
-		utils::make_unique<InvokeMessage>(method, args, nullptr, true);
-	postMessage(std::move(msg));
-}
-
 /**
  * \fn Object::thread()
  * \brief Retrieve the thread the object is bound to
-- 
cgit v1.2.1