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

Niklas Söderlund niklas.soderlund at ragnatech.se
Tue Oct 29 15:44:24 CET 2019


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 at ideasonboard.com>

Reviewed-by: Niklas Söderlund <niklas.soderlund at 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 at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list