Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hotmail.com>2002-11-24 16:41:36 +0300
committerRobert Collins <rbtcollins@hotmail.com>2002-11-24 16:41:36 +0300
commit4f0de34d3747d689cc741f045072486b0c602f15 (patch)
treee00685d966fc8c1a24267d3c810ab569d504c6ff
parentf29c4db1855efd6692bb564f474dc627747b1a80 (diff)
2002-11-25 Robert Collins <rbtcollins@hotmail.com>
* readme: Document running portions of the test suite (Thanks Egor!). * winsup.api/pthread/mainthreadexits.c: New file, derived from Thomas Pfaff's test cases. * winsup.api/pthread/threadidafterfork.c: Ditto.
-rw-r--r--winsup/testsuite/ChangeLog7
-rw-r--r--winsup/testsuite/README5
-rw-r--r--winsup/testsuite/winsup.api/pthread/mainthreadexits.c47
-rw-r--r--winsup/testsuite/winsup.api/pthread/threadidafterfork.c49
4 files changed, 108 insertions, 0 deletions
diff --git a/winsup/testsuite/ChangeLog b/winsup/testsuite/ChangeLog
index 9c9770251..502c12bba 100644
--- a/winsup/testsuite/ChangeLog
+++ b/winsup/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2002-11-25 Robert Collins <rbtcollins@hotmail.com>
+
+ * readme: Document running portions of the test suite (Thanks Egor!).
+ * winsup.api/pthread/mainthreadexits.c: New file, derived from
+ Thomas Pfaff's test cases.
+ * winsup.api/pthread/threadidafterfork.c: Ditto.
+
2002-08-25 Christopher Faylor <cgf@redhat.com>
* Makefile.in (RUNTEST): Use Makefile's srcdir and bupdir* macros,
diff --git a/winsup/testsuite/README b/winsup/testsuite/README
index 346111e9a..1f289f1b1 100644
--- a/winsup/testsuite/README
+++ b/winsup/testsuite/README
@@ -33,3 +33,8 @@ to fail, and will "fail" if they compile, run, and return zero.
"make check" will only work if you run it *on* an NT machine.
Cross-checking is not supported.
+
+To test a subset of the test-suite, use
+$ make check CYGWIN_TESTSUITE_TESTS=regexp
+
+
diff --git a/winsup/testsuite/winsup.api/pthread/mainthreadexits.c b/winsup/testsuite/winsup.api/pthread/mainthreadexits.c
new file mode 100644
index 000000000..dbd6969dd
--- /dev/null
+++ b/winsup/testsuite/winsup.api/pthread/mainthreadexits.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+
+static void * Thread (void *);
+
+static pthread_t main_thread;
+static pthread_t secondThread;
+static int result = 2;
+
+int main(void)
+{
+ main_thread = pthread_self ();
+
+ if (pthread_create (&secondThread, NULL, Thread, NULL))
+ exit (1);
+ sleep (5);
+ pthread_exit (&result);
+ /* If pthread_exit doesm't (which would be a bug) then we do */
+ return 1;
+}
+
+static void * Thread (void *not_used)
+{
+ void *myresult;
+ /* We should be able to join this */
+ if (pthread_join (main_thread, &myresult))
+ exit (1);
+
+ if (*(int *)myresult != 2)
+ exit (1);
+
+ exit (0);
+}
+/*
+This valid code doesn't work at all. The mainthread object in MTinterface
+is not properly initialized, the cancel_event is NULL and the win32_obj_id
+is NULL because myself->hProcess is NULL when MTinterface is initialized
+(and i don't think that a process handle can be used as thread handle).
+Even if the handles would be valid the pthread_join call would try to
+delete a thread object that is created static which would result in a
+corrupted heap.
+
+Concept test Contributed by Thomas Pfaff <tpfaff@gmx.net>
+Scriptable test by Robert Collins <rbtcollins@hotmail.com>
+
+*/
diff --git a/winsup/testsuite/winsup.api/pthread/threadidafterfork.c b/winsup/testsuite/winsup.api/pthread/threadidafterfork.c
new file mode 100644
index 000000000..da93a4d3f
--- /dev/null
+++ b/winsup/testsuite/winsup.api/pthread/threadidafterfork.c
@@ -0,0 +1,49 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <pthread.h>
+
+static void * TestThread ( void * );
+
+int main (void)
+{
+ pthread_t t;
+
+ pthread_create (&t, NULL, TestThread, NULL);
+ pthread_join (t, NULL);
+
+ return 0;
+}
+
+static void * TestThread ( void *not_used )
+{
+ pthread_t iAm = pthread_self();
+ int status;
+ switch (fork ())
+ {
+ case -1:
+ exit(1);
+ case 0:
+ if (iAm != pthread_self())
+ exit (1);
+ else
+ exit (0);
+ break;
+ default:
+ wait (&status);
+ if (status != 0)
+ exit (1);
+ }
+ exit(0);
+}
+
+/*
+The forked child will not get the same thread handle as its parent, it
+will get the thread handle from the main thread instead. The child will
+not terminate because the threadcount is still 2 after the fork (it is
+set to 1 in MTinterface::Init and then set back to 2 after the childs
+memory gets overwritten by the parent).
+
+concept test by Thomas Pfaff <tpfaff@gmx.net>
+scritable test by Robert Collins <rbtcollins@hotmail.com>
+*/