[libcamera-devel] [PATCH 05/18] libcamera: bound_method: Decouple from Signal implementation

Niklas Söderlund niklas.soderlund at ragnatech.se
Sat Aug 17 16:24:12 CEST 2019


Hi Laurent,

Thanks for your work.

On 2019-08-12 15:46:29 +0300, Laurent Pinchart wrote:
> To make the BoundMethod classes more generic, replace direct access to
> private member from Signal classes with accessors or helper functions.
> This allows removal of friend statements from the BoundMethod classes.

I love to lose these toxic friends ;-)

> 
> 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 | 11 +++++------
>  include/libcamera/signal.h       | 12 +++++++-----
>  src/libcamera/bound_method.cpp   |  6 ------
>  3 files changed, 12 insertions(+), 17 deletions(-)
> 
> diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
> index 38c44b923ba1..54c40fc52e3b 100644
> --- a/include/libcamera/bound_method.h
> +++ b/include/libcamera/bound_method.h
> @@ -13,9 +13,6 @@
>  namespace libcamera {
>  
>  class Object;
> -template<typename... Args>
> -class Signal;
> -class SignalBase;
>  
>  class BoundMethodBase
>  {
> @@ -28,7 +25,7 @@ public:
>  	bool match(T *obj) { return obj == obj_; }
>  	bool match(Object *object) { return object == object_; }
>  
> -	void disconnect(SignalBase *signal);
> +	Object *object() const { return object_; }
>  
>  	void activatePack(void *pack);
>  	virtual void invokePack(void *pack) = 0;
> @@ -93,6 +90,8 @@ public:
>  	BoundMemberMethod(T *obj, Object *object, void (T::*func)(Args...))
>  		: BoundMethodArgs<Args...>(obj, object), func_(func) {}
>  
> +	bool match(void (T::*func)(Args...)) const { return func == func_; }
> +
>  	void activate(Args... args)
>  	{
>  		if (this->object_)
> @@ -107,7 +106,6 @@ public:
>  	}
>  
>  private:
> -	friend class Signal<Args...>;
>  	void (T::*func_)(Args...);
>  };
>  
> @@ -118,11 +116,12 @@ public:
>  	BoundStaticMethod(void (*func)(Args...))
>  		: BoundMethodArgs<Args...>(nullptr, nullptr), func_(func) {}
>  
> +	bool match(void (*func)(Args...)) const { return func == func_; }
> +
>  	void activate(Args... args) { (*func_)(args...); }
>  	void invoke(Args... args) {}
>  
>  private:
> -	friend class Signal<Args...>;
>  	void (*func_)(Args...);
>  };
>  
> diff --git a/include/libcamera/signal.h b/include/libcamera/signal.h
> index 3b6de30f7d35..b8a60281cceb 100644
> --- a/include/libcamera/signal.h
> +++ b/include/libcamera/signal.h
> @@ -46,7 +46,9 @@ public:
>  	~Signal()
>  	{
>  		for (BoundMethodBase *slot : slots_) {
> -			slot->disconnect(this);
> +			Object *object = slot->object();
> +			if (object)
> +				object->disconnect(this);
>  			delete slot;
>  		}
>  	}
> @@ -95,11 +97,11 @@ public:
>  			/*
>  			 * If the object matches the slot, the slot is
>  			 * guaranteed to be a member slot, so we can safely
> -			 * cast it to BoundMemberMethod<T, Args...> and access its
> -			 * func_ member.
> +			 * cast it to BoundMemberMethod<T, Args...> to match
> +			 * func.
>  			 */
>  			if (slot->match(obj) &&
> -			    static_cast<BoundMemberMethod<T, Args...> *>(slot)->func_ == func) {
> +			    static_cast<BoundMemberMethod<T, Args...> *>(slot)->match(func)) {
>  				iter = slots_.erase(iter);
>  				delete slot;
>  			} else {
> @@ -113,7 +115,7 @@ public:
>  		for (auto iter = slots_.begin(); iter != slots_.end(); ) {
>  			BoundMethodArgs<Args...> *slot = *iter;
>  			if (slot->match(nullptr) &&
> -			    static_cast<BoundStaticMethod<Args...> *>(slot)->func_ == func) {
> +			    static_cast<BoundStaticMethod<Args...> *>(slot)->match(func)) {
>  				iter = slots_.erase(iter);
>  				delete slot;
>  			} else {
> diff --git a/src/libcamera/bound_method.cpp b/src/libcamera/bound_method.cpp
> index 0a2d61a6c805..23b8f4122283 100644
> --- a/src/libcamera/bound_method.cpp
> +++ b/src/libcamera/bound_method.cpp
> @@ -13,12 +13,6 @@
>  
>  namespace libcamera {
>  
> -void BoundMethodBase::disconnect(SignalBase *signal)
> -{
> -	if (object_)
> -		object_->disconnect(signal);
> -}
> -
>  void BoundMethodBase::activatePack(void *pack)
>  {
>  	if (Thread::current() == object_->thread()) {
> -- 
> 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