[PATCH] test: hectic: sem_post task_init on failure

Hannes Diethelm <[email protected]> Sun, 12 Jul 2026 22:07:49 +0200
Newsgroups dev.linux.lists.xenomai
Message-ID <[email protected]>
This fixes the issue where hectic doesn't exit on init failure when
there are for example not enough resources due to to many available
CPU's.

Signed-off-by: Hannes Diethelm <[email protected]>
---
 tests/hectic.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/tests/hectic.c b/tests/hectic.c
index af8f988..b07e074 100644
--- a/tests/hectic.c
+++ b/tests/hectic.c
@@ -270,6 +270,7 @@ static void *sleeper_switcher(void *cookie)
 	CPU_SET(param->cpu->index, &cpu_set);
 	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set)) {
 		perror("sleeper: sched_setaffinity");
+		sem_post(&task_init);
 		clean_exit(EXIT_FAILURE);
 	}
 
@@ -379,6 +380,7 @@ static void *fpu_stress(void *cookie)
 	CPU_SET(param->cpu->index, &cpu_set);
 	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set)) {
 		perror("sleeper: sched_setaffinity");
+		sem_post(&task_init);
 		clean_exit(EXIT_FAILURE);
 	}
 
@@ -399,19 +401,14 @@ static void *fpu_stress(void *cookie)
 	return NULL;
 }
 
-static void attach_thread(struct task_params *param)
+static int attach_thread(struct task_params *param)
 {
 	char buffer[64];
-	int efd;
 
 	task_name(buffer, sizeof(buffer), param->cpu,param->swt.index);
 
 	/* Make it a public thread only for demo purpose. */
-	efd = evl_attach_self("/%s:%d", buffer, getpid());
-	if (efd < 0) {
-		perror("evl_attach()");
-		clean_exit(EXIT_FAILURE);
-	}
+	return evl_attach_self("/%s:%d", buffer, getpid());
 }
 
 static void *rtup(void *cookie)
@@ -423,12 +420,17 @@ static void *rtup(void *cookie)
 	cpu_set_t cpu_set;
 	unsigned i = 0;
 
-	attach_thread(param);
+	if (attach_thread(param) < 0) {
+		perror("evl_attach()");
+		sem_post(&task_init);
+		clean_exit(EXIT_FAILURE);
+	}
 
 	CPU_ZERO(&cpu_set);
 	CPU_SET(param->cpu->index, &cpu_set);
 	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set)) {
 		perror("rtup: sched_setaffinity");
+		sem_post(&task_init);
 		clean_exit(EXIT_FAILURE);
 	}
 
@@ -503,12 +505,17 @@ static void *rtus(void *cookie)
 	cpu_set_t cpu_set;
 	unsigned i = 0;
 
-	attach_thread(param);
+	if (attach_thread(param) < 0) {
+		perror("evl_attach()");
+		sem_post(&task_init);
+		clean_exit(EXIT_FAILURE);
+	}
 
 	CPU_ZERO(&cpu_set);
 	CPU_SET(param->cpu->index, &cpu_set);
 	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set)) {
 		perror("rtus: sched_setaffinity");
+		sem_post(&task_init);
 		clean_exit(EXIT_FAILURE);
 	}
 
@@ -600,12 +607,17 @@ static void *rtuo(void *cookie)
 	cpu_set_t cpu_set;
 	unsigned i = 0;
 
-	attach_thread(param);
+	if (attach_thread(param) < 0) {
+		perror("evl_attach()");
+		sem_post(&task_init);
+		clean_exit(EXIT_FAILURE);
+	}
 
 	CPU_ZERO(&cpu_set);
 	CPU_SET(param->cpu->index, &cpu_set);
 	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set)) {
 		perror("rtuo: sched_setaffinity");
+		sem_post(&task_init);
 		clean_exit(EXIT_FAILURE);
 	}
 
-- 
2.47.3