[libcamera-devel] [PATCH v1 4/5] cam: event_loop: Add deferred calls support

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Nov 13 11:06:40 CET 2020


On 13/11/2020 06:38, Laurent Pinchart wrote:
> Add a deferred cals queue to the EventLoop class to support queuing
> calls from a different thread and processing them in the event loop's
> thread.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> ---
>  src/cam/event_loop.cpp | 29 ++++++++++++++++++++++++++++-
>  src/cam/event_loop.h   |  9 +++++++++
>  2 files changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
> index 13f2583da0a1..94c5d1d36245 100644
> --- a/src/cam/event_loop.cpp
> +++ b/src/cam/event_loop.cpp
> @@ -40,8 +40,10 @@ int EventLoop::exec()
>  	exitCode_ = -1;
>  	exit_.store(false, std::memory_order_release);
>  
> -	while (!exit_.load(std::memory_order_acquire))
> +	while (!exit_.load(std::memory_order_acquire)) {
> +		dispatchCalls();
>  		event_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);
> +	}
>  
>  	return exitCode_;
>  }
> @@ -57,3 +59,28 @@ void EventLoop::interrupt()
>  {
>  	event_base_loopbreak(event_);
>  }
> +
> +void EventLoop::callLater(const std::function<void()> &func)
> +{
> +	{
> +		std::unique_lock<std::mutex> locker(lock_);
> +		calls_.push_back(func);
> +	}
> +
> +	interrupt();
> +}
> +
> +void EventLoop::dispatchCalls()
> +{
> +	std::unique_lock<std::mutex> locker(lock_);
> +
> +	for (auto iter = calls_.begin(); iter != calls_.end(); ) {
> +		std::function<void()> call = std::move(*iter);
> +
> +		iter = calls_.erase(iter);
> +
> +		locker.unlock();
> +		call();
> +		locker.lock();
> +	}
> +}
> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h
> index b1c6bd103080..408073c50594 100644
> --- a/src/cam/event_loop.h
> +++ b/src/cam/event_loop.h
> @@ -8,6 +8,9 @@
>  #define __CAM_EVENT_LOOP_H__
>  
>  #include <atomic>
> +#include <functional>
> +#include <list>
> +#include <mutex>
>  
>  struct event_base;
>  
> @@ -22,6 +25,8 @@ public:
>  	int exec();
>  	void exit(int code = 0);
>  
> +	void callLater(const std::function<void()> &func);
> +
>  private:
>  	static EventLoop *instance_;
>  
> @@ -29,7 +34,11 @@ private:
>  	std::atomic<bool> exit_;
>  	int exitCode_;
>  
> +	std::list<std::function<void()>> calls_;
> +	std::mutex lock_;
> +
>  	void interrupt();
> +	void dispatchCalls();
>  };
>  
>  #endif /* __CAM_EVENT_LOOP_H__ */
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list