diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
index 94c5d1d362455f33..18786b4500be9b6f 100644
--- a/src/cam/event_loop.cpp
+++ b/src/cam/event_loop.cpp
@@ -41,7 +41,9 @@ int EventLoop::exec()
 	exit_.store(false, std::memory_order_release);
 
 	while (!exit_.load(std::memory_order_acquire)) {
-		dispatchCalls();
+		if (dispatchCall())
+			continue;
+
 		event_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);
 	}
 
@@ -70,17 +72,19 @@ void EventLoop::callLater(const std::function<void()> &func)
 	interrupt();
 }
 
-void EventLoop::dispatchCalls()
+bool EventLoop::dispatchCall()
 {
 	std::unique_lock<std::mutex> locker(lock_);
 
-	for (auto iter = calls_.begin(); iter != calls_.end(); ) {
-		std::function<void()> call = std::move(*iter);
+	if (calls_.empty())
+		return false;
 
-		iter = calls_.erase(iter);
+	auto iter = calls_.begin();
+	std::function<void()> call = std::move(*iter);
+	calls_.erase(iter);
 
-		locker.unlock();
-		call();
-		locker.lock();
-	}
+	locker.unlock();
+	call();
+
+	return true;
 }
diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h
index 408073c50594d09d..b84e1c9e432086e3 100644
--- a/src/cam/event_loop.h
+++ b/src/cam/event_loop.h
@@ -38,7 +38,7 @@ private:
 	std::mutex lock_;
 
 	void interrupt();
-	void dispatchCalls();
+	bool dispatchCall();
 };
 
 #endif /* __CAM_EVENT_LOOP_H__ */
