[libcamera-devel,v2,6/9] libcamera: object: Use bound method activePack() for invokeMethod()

Message ID 20191028104913.14985-7-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Add support for blocking method invocation
Related show

Commit Message

Laurent Pinchart Oct. 28, 2019, 10:49 a.m. UTC
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>
---
 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(-)

Comments

Niklas Söderlund Oct. 29, 2019, 2:44 p.m. UTC | #1
Hi Laurent,

Thanks for your work.

On 2019-10-28 12:49:10 +0200, Laurent Pinchart wrote:
> 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 06c5a3b12305..bdeb5469cda3 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 3308330af857..603a229288c2 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 600717363444..4c0cd415a3f1 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 b0818f9aa25f..509b2ebac537 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
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
index 06c5a3b12305..bdeb5469cda3 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 3308330af857..603a229288c2 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 600717363444..4c0cd415a3f1 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 b0818f9aa25f..509b2ebac537 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