From 4f0de34d3747d689cc741f045072486b0c602f15 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Sun, 24 Nov 2002 13:41:36 +0000 Subject: 2002-11-25 Robert Collins * 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. --- winsup/testsuite/ChangeLog | 7 ++++ winsup/testsuite/README | 5 +++ .../testsuite/winsup.api/pthread/mainthreadexits.c | 47 +++++++++++++++++++++ .../winsup.api/pthread/threadidafterfork.c | 49 ++++++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 winsup/testsuite/winsup.api/pthread/mainthreadexits.c create mode 100644 winsup/testsuite/winsup.api/pthread/threadidafterfork.c 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 + + * 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 * 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 +#include +#include + +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 +Scriptable test by Robert Collins + +*/ 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 +#include +#include +#include + +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 +scritable test by Robert Collins +*/ -- cgit v1.2.3