Linux Test Project
 help / color / mirror / Atom feed
* [LTP] [PATCH] openposix: Remove pthread_detach_1-2
@ 2026-06-15 14:25 Martin Doucha
  2026-06-15 14:27 ` Andrea Cervesato via ltp
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Martin Doucha @ 2026-06-15 14:25 UTC (permalink / raw)
  To: ltp

The POSIX specification of pthread_join() has changed in recent years and
pthread_detach_1-2 test scenario is no longer valid. The POSIX standard
issue 8 says that the behavior of pthread_join() called on a thread ID
which does not refer to a joinable thread is undefined.

https://pubs.opengroup.org/onlinepubs/9799919799/functions/pthread_join.html

The test creates a thread, detaches it using pthread_detach() and then
calls pthread_join(), expecting an error. As stated above, the expected
behavior is now undefined. Remove the test.

Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
 .../interfaces/pthread_detach/1-2.c           | 218 ------------------
 1 file changed, 218 deletions(-)
 delete mode 100644 testcases/open_posix_testsuite/conformance/interfaces/pthread_detach/1-2.c

diff --git a/testcases/open_posix_testsuite/conformance/interfaces/pthread_detach/1-2.c b/testcases/open_posix_testsuite/conformance/interfaces/pthread_detach/1-2.c
deleted file mode 100644
index dc5ed39d3..000000000
--- a/testcases/open_posix_testsuite/conformance/interfaces/pthread_detach/1-2.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2004, Bull S.A..  All rights reserved.
- * Created by: Sebastien Decugis
-
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
- * This sample test aims to check the following assertion:
- *
- * pthread_detach() will indicate that the thread resources
- * can be reclaimed as soon as the thread terminates.
- * This means that pthread_join() will fail on such a thread.
-
- * The steps are:
- *
- * -> create a thread with a joinable state
- * -> detach the thread, either from inside the thread or from outside
- * -> try and join the thread, and check an error is returned.
-
- * The test fails if pthread_join succeeds.
-
- */
-
-/********************************************************************************************/
-/****************************** standard includes *****************************************/
-/********************************************************************************************/
-#include <pthread.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sched.h>
-#include <semaphore.h>
-#include <errno.h>
-#include <assert.h>
-/********************************************************************************************/
-/******************************   Test framework   *****************************************/
-/********************************************************************************************/
-#include "../testfrmw/testfrmw.h"
-#include "../testfrmw/testfrmw.c"
- /* This header is responsible for defining the following macros:
-  * UNRESOLVED(ret, descr);
-  *    where descr is a description of the error and ret is an int (error code for example)
-  * FAILED(descr);
-  *    where descr is a short text saying why the test has failed.
-  * PASSED();
-  *    No parameter.
-  *
-  * Both three macros shall terminate the calling process.
-  * The testcase shall not terminate in any other maneer.
-  *
-  * The other file defines the functions
-  * void output_init()
-  * void output(char * string, ...)
-  *
-  * Those may be used to output information.
-  */
-
-/********************************************************************************************/
-/********************************** Configuration ******************************************/
-/********************************************************************************************/
-#ifndef VERBOSE
-#define VERBOSE 1
-#endif
-
-/********************************************************************************************/
-/***********************************    Test cases  *****************************************/
-/********************************************************************************************/
-
-#include "../testfrmw/threads_scenarii.c"
-
-/* This file will define the following objects:
- * scenarii: array of struct __scenario type.
- * NSCENAR : macro giving the total # of scenarii
- * scenar_init(): function to call before use the scenarii array.
- * scenar_fini(): function to call after end of use of the scenarii array.
- */
-
-/********************************************************************************************/
-/***********************************    Real Test   *****************************************/
-/********************************************************************************************/
-
-static unsigned int sc;
-
-static void *threaded(void *arg)
-{
-	int ret = 0;
-
-	if (arg != NULL) {
-		ret = pthread_detach(pthread_self());
-		if (ret != 0) {
-			UNRESOLVED(ret, "Failed to detach the thread");
-		}
-	}
-
-	/* Post the semaphore to unlock the main thread in case of a detached thread */
-	do {
-		ret = sem_post(&(scenarii[sc].sem));
-	}
-	while ((ret == -1) && (errno == EINTR));
-	if (ret == -1) {
-		UNRESOLVED(errno, "Failed to post the semaphore");
-	}
-
-	return arg;
-}
-
-int test_main(int argc PTS_ATTRIBUTE_UNUSED, char **argv PTS_ATTRIBUTE_UNUSED)
-{
-	int ret = 0;
-	pthread_t child;
-
-	output_init();
-
-	scenar_init();
-
-	for (sc = 0; sc < NSCENAR; sc++) {
-#if VERBOSE > 0
-		output("-----\n");
-		output("Starting test with scenario (%i): %s\n", sc,
-		       scenarii[sc].descr);
-#endif
-
-		if (scenarii[sc].detached != 0) {	/* only joinable threads can be detached */
-			ret =
-			    pthread_attr_setdetachstate(&scenarii[sc].ta,
-							PTHREAD_CREATE_JOINABLE);
-			if (ret != 0) {
-				UNRESOLVED(ret,
-					   "Unable to set detachstate back to joinable");
-			}
-		}
-
-		/* for detached scenarii, we will call pthread_detach from inside the thread.
-		   for joinable scenarii, we'll call pthread_detach from this thread. */
-
-		ret =
-		    pthread_create(&child, &scenarii[sc].ta, threaded,
-				   (scenarii[sc].detached != 0) ? &ret : NULL);
-		switch (scenarii[sc].result) {
-		case 0:	/* Operation was expected to succeed */
-			if (ret != 0) {
-				UNRESOLVED(ret, "Failed to create this thread");
-			}
-			break;
-
-		case 1:	/* Operation was expected to fail */
-			if (ret == 0) {
-				UNRESOLVED(-1,
-					   "An error was expected but the thread creation succeeded");
-			}
-#if VERBOSE > 0
-			break;
-
-		case 2:	/* We did not know the expected result */
-		default:
-			if (ret == 0) {
-				output
-				    ("Thread has been created successfully for this scenario\n");
-			} else {
-				output
-				    ("Thread creation failed with the error: %s\n",
-				     strerror(ret));
-			}
-#endif
-		}
-		if (ret == 0) {	/* The new thread is running */
-			/* Just wait for the thread to terminate */
-			do {
-				ret = sem_wait(&(scenarii[sc].sem));
-			}
-			while ((ret == -1) && (errno == EINTR));
-			if (ret == -1) {
-				UNRESOLVED(errno,
-					   "Failed to post the semaphore");
-			}
-
-			/* If we must detach from here, we do it now. */
-			if (scenarii[sc].detached == 0) {
-				ret = pthread_detach(child);
-				if (ret != 0) {
-					UNRESOLVED(ret,
-						   "Failed to detach the child thread.");
-				}
-			}
-
-			/* now check that the thread resources are freed. */
-			ret = pthread_join(child, NULL);
-			if (ret == 0) {
-				FAILED
-				    ("We were able to join a detached thread.");
-			}
-
-			/* Let the thread an additionnal row to cleanup */
-			sched_yield();
-		}
-	}
-
-	scenar_fini();
-#if VERBOSE > 0
-	output("-----\n");
-	output("All test data destroyed\n");
-	output("Test PASSED\n");
-#endif
-
-	PASSED;
-}
-- 
2.54.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-06-17 10:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-15 14:25 [LTP] [PATCH] openposix: Remove pthread_detach_1-2 Martin Doucha
2026-06-15 14:27 ` Andrea Cervesato via ltp
2026-06-15 14:38 ` [LTP] " linuxtestproject.agent
2026-06-15 16:09 ` [LTP] [PATCH] " Jan Stancek via ltp
2026-06-17  9:49 ` Cyril Hrubis
2026-06-17 10:19 ` Andrea Cervesato via ltp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox