diff --git a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
index 1f990d3f9..68d68c4a5 100644
--- a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
+++ b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
@@ -60,6 +60,10 @@ public:
 
 	~{{proxy_worker_name}}() {}
 
+	void disconnected() {
+		exit_ = true;
+	}
+
 	void readyRead()
 	{
 		IPCUnixSocket::Payload _message;
@@ -131,6 +135,7 @@ public:
 			return EXIT_FAILURE;
 		}
 		socket_.readyRead.connect(this, &{{proxy_worker_name}}::readyRead);
+		socket_.disconnected.connect(this, &{{proxy_worker_name}}::disconnected);
 
 		ipa_ = dynamic_cast<{{interface_name}} *>(ipam->createInterface());
 		if (!ipa_) {
