diff options
-rw-r--r-- | ChangeLog | 31 | ||||
-rw-r--r-- | Nmakefile | 24 | ||||
-rw-r--r-- | Nmakefile.tests | 131 | ||||
-rw-r--r-- | create.c | 6 | ||||
-rw-r--r-- | exit.c | 8 | ||||
-rw-r--r-- | global.c | 7 | ||||
-rw-r--r-- | implement.h | 25 | ||||
-rw-r--r-- | misc.c | 5 | ||||
-rw-r--r-- | nonportable.c | 4 | ||||
-rw-r--r-- | private.c | 13 | ||||
-rw-r--r-- | pthread.h | 13 |
11 files changed, 264 insertions, 3 deletions
@@ -1,3 +1,34 @@ +2001-06-18 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
+
+ * Made organisational-only changes to UWIN additions.
+ * dll.c (dllMain): Moved UWIN process attach code
+ to pthread_win32_process_attach_np(); moved
+ instance of pthread_count to global.c.
+ * global.c (pthread_count): Moved from dll.c.
+ * nonportable.c (pthread_win32_process_attach_np):
+ Moved _UWIN code to here from dll.c.
+ * implement.h (pthread_count): Define extern int.
+ * create.c (pthread_count): Remove extern int.
+ * private.c (pthread_count): Likewise.
+ * exit.c (pthread_count): Likewise.
+
+2001-06-18 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
+
+ Contributed by - David Korn <dgk@research.att.com>
+
+ * dll.c: Added changes necessary to work with UWIN.
+ * create.c: Likewise.
+ * pthread.h: Likewise.
+ * misc.c: Likewise.
+ * exit.c: Likewise.
+ * private.c: Likewise.
+ * implement.h: Likewise.
+ There is some room at the start of struct pthread_t_
+ to implement the signal semantics in UWIN's posix.dll
+ although this is not yet complete.
+ * Nmakefile: Compatible with UWIN's Nmake utility.
+ * Nmakefile.tests: Likewise - for running the tests.
+
2001-06-08 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
* semaphore.h (sem_t): Fixed for compile and test.
diff --git a/Nmakefile b/Nmakefile new file mode 100644 index 0000000..49c2766 --- /dev/null +++ b/Nmakefile @@ -0,0 +1,24 @@ +/* + * nmake file for uwin pthread library + */ + +VERSION = - +CCFLAGS = -g $(CC.DLL) +PTW32_BUILD == 1 +_MT == 1 +_timeb == timeb +_ftime == ftime +_errno == _ast_errno + +$(INCLUDEDIR) :INSTALLDIR: pthread.h sched.h + +pthread $(VERSION) :LIBRARY: pthread.def attr.c cancel.c cleanup.c condvar.c \ + create.c dll.c exit.c fork.c global.c misc.c mutex.c private.c \ + rwlock.c sched.c semaphore.c sync.c tsd.c nonportable.c + +:: ANNOUNCE CONTRIBUTORS COPYING.LIB ChangeLog FAQ GNUmakefile MAINTAINERS \ + Makefile Makefile.in Makefile.vc NEWS PROGRESS README README.WinCE \ + TODO WinCE-PORT install-sh errno.c tests tests.mk acconfig.h \ + config.guess config.h.in config.sub configure configure.in signal.c \ + README.CV README.NONPORTABLE pthread.dsp pthread.dsw + diff --git a/Nmakefile.tests b/Nmakefile.tests new file mode 100644 index 0000000..5ba32ff --- /dev/null +++ b/Nmakefile.tests @@ -0,0 +1,131 @@ +/* for running tests */ +CCFLAGS = -g +_MT == 1 +_timeb == timeb +_ftime == ftime + +.SOURCE: tests +/* +:PACKAGE: pthread +*/ + +set keepgoing + +":test:" : .MAKE .OPERATOR + local I + $(<:D:B:S=.pass) : .IMPLICIT $(>:D:B:S=.pass) + for I $(<) $(>) + $(I:D:B:S=.pass) : .VIRTUAL .FORCE $(I) + $(>) + end +loadfree:: loadfree.c +mutex1:: mutex1.c +mutex1e:: mutex1e.c +mutex1n:: mutex1n.c +mutex1r:: mutex1r.c +mutex2:: mutex1.2 +exit1:: exit1.c +condvar1:: condvar1.c +self1:: self1.c +condvar2:: condvar2.c +condvar2_1:: condvar2_1.c +condvar3_1:: condvar3_1.c +condvar3_2:: condvar3_2.c +create1.:: create1.c +cancel1:: cancel1.c +cancel2:: cancel2.c +mutex3:: mutex3.c +mutex4:: mutex4.c +mutex5:: mutex5.c +mutex6:: mutex6.c +mutex6e:: mutex6e.c +mutex6n:: mutex6n.c +mutex6r:: mutex6r.c +equal1:: equal1.c +exit2:: exit2.c +exit3:: exit3.c +join0:: join0.c +join1:: join1.c +join2:: join2.c +count1:: count1.c +once1:: once1.c +tsd1:: tsd1.c +self2:: self2.c +eyal1:: eyal1.c +condvar3:: condvar3.c +condvar4:: condvar4.c +condvar5:: condvar5.c +condvar6:: condvar6.c +condvar7:: condvar7.c +condvar8:: condvar8.c +condvar9:: condvar9.c +errno1:: errno1.c +rwlock1:: rwlock1.c +rwlock2:: rwlock2.c +rwlock3:: rwlock3.c +rwlock4:: rwlock4.c +rwlock5:: rwlock5.c +rwlock6:: rwlock6.c +rwlock7:: rwlock7.c +context1:: context1.c +cancel3:: cancel3.c +cancel4:: cancel4.c +cancel5:: cancel5.c +cleanup0:: cleanup0.c +cleanup1:: cleanup1.c +cleanup2:: cleanup2.c +cleanup3:: cleanup3.c +exception1:: exception1.c +exception2:: exception2.c +exception3:: exception3.c + +loadfree: :test: +mutex1 :test: loadfree +mutex2 :test: loadfree +exit1 :test: loadfree +condvar1 :test: loadfree +self1 :test: loadfree +condvar2 :test: condvar1 +create1. :test: mutex2 +cancel1 :test: create1 +cancel2 :test: cancel1 +mutex3 :test: create1 +mutex4 :test: mutex3 +equal1 :test: create1 +exit2 :test: create1 +exit3 :test: create1 +join0 :test: create1 +join1 :test: create1 +join2 :test: create1 +count1 :test: join1 +once1 :test: create1 +tsd1 :test: join1 +self2 :test: create1 +eyal1 :test: tsd1 +condvar3 :test: create1 +condvar4 :test: create1 +condvar5 :test: condvar4 +condvar6 :test: condvar5 +condvar7 :test: condvar6 cleanup1 +condvar8 :test: condvar7 +condvar9 :test: condvar8 +errno1 :test: mutex3 +rwlock1 :test: condvar6 +rwlock2 :test: rwlock1 +rwlock3 :test: rwlock2 +rwlock4 :test: rwlock3 +rwlock5 :test: rwlock4 +rwlock6 :test: rwlock5 +context1 :test: cancel2 +cancel3 :test: context1 +cancel4 :test: cancel3 +cancel5 :test: cancel3 +cleanup0 :test: cancel5 +cleanup1 :test: cleanup0 +cleanup2 :test: cleanup1 +cleanup3 :test: cleanup2 +exception1 :test: cancel4 +exception2 :test: exception1 +exception3 :test: exception2 +tryentercs :test: +tryentercs2 :test: @@ -26,7 +26,9 @@ #include "pthread.h" #include "implement.h" +#ifndef _UWIN #include <process.h> +#endif int pthread_create (pthread_t * tid, @@ -213,6 +215,10 @@ FAIL0: } *tid = thread; +#ifdef _UWIN + if (result == 0) + pthread_count++; +#endif return (result); } /* pthread_create */ @@ -26,7 +26,9 @@ #include "pthread.h" #include "implement.h" -#include <process.h> +#ifndef _UWIN +# include <process.h> +#endif void pthread_exit (void *value_ptr) @@ -62,6 +64,10 @@ pthread_exit (void *value_ptr) */ self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey); +#ifdef _UWIN + if(--pthread_count <= 0) + exit((int)value_ptr); +#endif if (self == NULL || self->implicit) { @@ -51,3 +51,10 @@ CRITICAL_SECTION ptw32_cond_test_init_lock; * created read/write locks. */ CRITICAL_SECTION ptw32_rwlock_test_init_lock; + +#ifdef _UWIN +/* + * Keep a count of the number of threads. + */ +int pthread_count = 0; +#endif diff --git a/implement.h b/implement.h index 0df0e4c..da094c8 100644 --- a/implement.h +++ b/implement.h @@ -71,6 +71,9 @@ typedef enum { PThreadDemise; struct pthread_t_ { +#ifdef _UWIN + DWORD dummy[5]; +#endif DWORD thread; HANDLE threadH; PThreadState state; @@ -331,6 +334,9 @@ extern CRITICAL_SECTION ptw32_mutex_test_init_lock; extern CRITICAL_SECTION ptw32_cond_test_init_lock; extern CRITICAL_SECTION ptw32_rwlock_test_init_lock; +#ifdef _UWIN +extern int pthread_count; +#endif /* Declared in misc.c */ #ifdef NEED_CALLOC @@ -391,6 +397,25 @@ BOOL ptw32_increase_semaphore(sem_t * sem, #endif /* __cplusplus */ +#ifdef _UWIN_ +# ifdef _MT +# ifdef __cplusplus + extern "C" { +# endif + _CRTIMP unsigned long __cdecl _beginthread (void (__cdecl *) (void *), + unsigned, void *); + _CRTIMP void __cdecl _endthread(void); + _CRTIMP unsigned long __cdecl _beginthreadex(void *, unsigned, + unsigned (__stdcall *) (void *), void *, unsigned, unsigned *); + _CRTIMP void __cdecl _endthreadex(unsigned); +# ifdef __cplusplus + } +# endif +# endif +#else +# include <process.h> +#endif + /* * Check for old and new versions of cygwin. See the FAQ file: * @@ -144,6 +144,11 @@ pthread_self (void) { pthread_t self; +#ifdef _UWIN + if(!ptw32_selfThreadKey) + return(NULL); +#endif + self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey); if (self == NULL) diff --git a/nonportable.c b/nonportable.c index 404d831..150b0c0 100644 --- a/nonportable.c +++ b/nonportable.c @@ -101,7 +101,6 @@ pthread_getw32threadhandle_np(pthread_t thread) * tsWait.tv_nsec = 500000000L; * intRC = pthread_delay_np(&tsWait); */ - int pthread_delay_np (struct timespec * interval) { @@ -141,6 +140,9 @@ pthread_win32_process_attach_np () BOOL result = TRUE; result = ptw32_processInitialize (); +#ifdef _UWIN + pthread_count++; +#endif return result; } @@ -24,7 +24,9 @@ * MA 02111-1307, USA */ -#include <process.h> +#ifndef _UWIN +# include <process.h> +#endif #ifndef NEED_FTIME #include <sys/timeb.h> #endif @@ -278,6 +280,11 @@ ptw32_threadStart (void * vthreadParms) * Run the caller's routine; */ status = self->exitStatus = (*start) (arg); +#ifdef _UWIN + if (--pthread_count <= 0) + exit(0); +#endif + } __except (ExceptionFilter(GetExceptionInformation(), ei)) { @@ -285,6 +292,10 @@ ptw32_threadStart (void * vthreadParms) { case PTW32_EPS_CANCEL: status = PTHREAD_CANCELED; +#ifdef _UWIN + if (--pthread_count <= 0) + exit(0); +#endif break; case PTW32_EPS_EXIT: status = self->exitStatus; @@ -22,6 +22,13 @@ #if !defined( PTHREAD_H ) #define PTHREAD_H +#ifdef _UWIN +# define HAVE_STRUCT_TIMESPEC 1 +# define HAVE_SIGNAL_H 1 +# undef HAVE_CONFIG_H +# pragma comment(lib, "pthread") +#endif + /* * ------------------------------------------------------------- * @@ -304,6 +311,9 @@ extern "C" #define PTHREAD_THREADS_MAX 2019 +#ifdef _UWIN +# include <sys/types.h> +#else typedef struct pthread_t_ *pthread_t; typedef struct pthread_attr_t_ *pthread_attr_t; typedef struct pthread_once_t_ pthread_once_t; @@ -312,6 +322,7 @@ typedef struct pthread_mutex_t_ *pthread_mutex_t; typedef struct pthread_mutexattr_t_ *pthread_mutexattr_t; typedef struct pthread_cond_t_ *pthread_cond_t; typedef struct pthread_condattr_t_ *pthread_condattr_t; +#endif typedef struct pthread_rwlock_t_ *pthread_rwlock_t; typedef struct pthread_rwlockattr_t_ *pthread_rwlockattr_t; @@ -853,6 +864,7 @@ int pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); /* * Thread-Safe C Runtime Library Mappings. */ +#ifndef _UWIN #if 1 #if (! defined(HAVE_ERRNO)) && (! defined(_REENTRANT)) && (! defined(_MT)) int * _errno( void ); @@ -866,6 +878,7 @@ int * _errno( void ); #endif #endif #endif +#endif /* * WIN32 C runtime library had been made thread-safe |