diff options
-rw-r--r-- | ANNOUNCE | 66 | ||||
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | README | 114 | ||||
-rw-r--r-- | README.NONPORTABLE | 119 | ||||
-rw-r--r-- | mutex.c | 4 | ||||
-rw-r--r-- | pthread.h | 6 |
6 files changed, 181 insertions, 134 deletions
@@ -27,20 +27,51 @@ Change Summary (since the last snapshot) New:
- New functions (no-ops) for source code compatibility:
- pthread_getconcurrency
+ pthread_getconcurrency()
(Only returns the value '0' to indicate
that the system default concurrency is
used)
- pthread_setconcurrency
+ pthread_setconcurrency()
(Accepts any value >= 0 but does not
have any effect; always returns '0' or
EINVAL if arg < 0)
- pthread_attr_getscope
- pthread_attr_setscope
+ pthread_attr_getscope()
+ pthread_attr_setscope()
(Currently only return ENOSYS)
+- The following mutex types and related functions are now
+ supported:
+ pthread_mutexattr_gettype()
+ pthread_mutexattr_settype()
+ PTHREAD_MUTEX_DEFAULT
+ PTHREAD_MUTEX_NORMAL
+ PTHREAD_MUTEX_ERRORCHECK
+ PTHREAD_MUTEX_RECURSIVE
+ In this implementation PTHREAD_MUTEX_DEFAULT is
+ mapped to PTHREAD_MUTEX_RECURSIVE for backward
+ compatibility. Note that this mapping is allowed
+ by the Open Group description but that behaviour
+ considered as "undefined" in manual descriptions may
+ be different to some other implementations, eg
+ Solaris.
+
+ PTHREAD_MUTEX_NORMAL will simulate thread deadlock
+ if the owner of a mutex tries to relock it without
+ first unlocking it, however the lock will be released
+ if the owner thread is async-canceled.
+
+- Pthreads-win32 mutexes are now always based on
+ Win32 critical sections. We no longer use Win32
+ mutexes when TryEnterCriticalSection isn't
+ supported.
+ - Thomas Pfaff <tpfaff@gmx.net>
+
Bugs fixed:
--
+- The condition variable and read-write lock functions
+ have been improved. For details re the [fixed] problems
+ in the CV implementation see the file README.CV
+ - Alexander Terekhov <TEREKHOV@de.ibm.com>
+
Known bugs in this snapshot
---------------------------
@@ -147,6 +178,11 @@ The following functions are implemented: pthread_mutexattr_destroy
pthread_mutexattr_getpshared
pthread_mutexattr_setpshared
+ pthread_mutexattr_gettype
+ pthread_mutexattr_settype (types: PTHREAD_MUTEX_DEFAULT
+ PTHREAD_MUTEX_NORMAL
+ PTHREAD_MUTEX_ERRORCHECK
+ PTHREAD_MUTEX_RECURSIVE )
pthread_mutex_init
pthread_mutex_destroy
@@ -200,10 +236,10 @@ The following functions are implemented: pthread_attr_setschedparam
pthread_getschedparam
pthread_setschedparam
- pthread_getconcurrency
- pthread_getconcurrency
- pthread_attr_getscope
- pthread_attr_setscope
+ pthread_getconcurrency (always returns '0' indicating system default)
+ pthread_setconcurrency (accepts any value >= 0 but is ignored)
+ pthread_attr_getscope (returns an error ENOSYS)
+ pthread_attr_setscope (returns an error ENOSYS)
sched_get_priority_max (POSIX 1b)
sched_get_priority_min (POSIX 1b)
sched_yield (POSIX 1b)
@@ -214,15 +250,15 @@ The following functions are implemented: pthread_sigmask
---------------------------
- Non-portable routines (see the README file for usage)
+ Non-portable routines (see the README.NONPORTABLE file for usage)
---------------------------
pthread_mutexattr_setforcecs_np
pthread_getw32threadhandle_np
- pthread_delay_np
- pthread_win32_process_attach_np
- pthread_win32_process_detach_np
- pthread_win32_thread_attach_np
- pthread_win32_thread_detach_np
+ pthread_delay_np
+ pthread_win32_process_attach_np
+ pthread_win32_process_detach_np
+ pthread_win32_thread_attach_np
+ pthread_win32_thread_detach_np
---------------------------
Static Initializers (macros)
@@ -1,3 +1,9 @@ +2001-02-07 Ross Johnson <rpj@setup1.ise.canberra.edu.au> + + * mutex.c (pthread_mutex_lock): Map default type + PTHREAD_MUTEX_DEFAULT to PTHREAD_MUTEX_RECURSIVE + for backward compatibility. + 2001-02-07 Ross Johnson <rpj@special.ise.canberra.edu.au> * rwlock.c: Revamped. @@ -94,120 +94,6 @@ Otherwise neither pthreads cancelation nor pthread_exit() will work reliably.
-Non-portable functions included in the library
-----------------------------------------------
-
-void
-pthread_mutexattr_setforcecs_np(pthread_mutexattr_t *attr,
- int forcecs);
-
- Allows an application to force the library to use
- critical sections rather than win32 mutexes as
- the basis for any mutex that uses "attr".
- Critical sections are significantly faster than
- mutexes.
-
- Values for "forcecs" are:
- PTHREAD_MUTEX_AUTO_CS_NP
- - allow the library to decide based on
- availability of tryEnterCriticalSection().
- The library determines this at runtime
- and will use critical sections whenever
- tryEnterCriticalSection() is available.
- PTHREAD_MUTEX_FORCE_CS_NP
- - force use of critical sections even if
- tryEnterCriticalSection() isn't provided
- by the system, but you'd better not try
- to use pthread_mutex_trylock() on any
- mutex that uses "attr" if you want your
- application to work on all versions of
- Windows.
-
-HANDLE
-pthread_getw32threadhandle_np(pthread_t thread);
-
- Returns the win32 thread handle that the POSIX
- thread "thread" is running as.
-
- Applications can use the win32 handle to set
- win32 specific attributes of the thread.
-
-int
-pthread_delay_np (const struct timespec *interval);
-
- This routine causes a thread to delay execution for a specific period of time.
- This period ends at the current time plus the specified interval. The routine
- will not return before the end of the period is reached, but may return an
- arbitrary amount of time after the period has gone by. This can be due to
- system load, thread priorities, and system timer granularity.
-
- Specifying an interval of zero (0) seconds and zero (0) nanoseconds is
- allowed and can be used to force the thread to give up the processor or to
- deliver a pending cancelation request.
-
- This routine is a cancelation point.
-
- The timespec structure contains the following two fields:
-
- tv_sec is an integer number of seconds.
- tv_nsec is an integer number of nanoseconds.
-
- Return Values
-
- If an error condition occurs, this routine returns an integer value
- indicating the type of error. Possible return values are as follows:
-
- 0 Successful completion.
- [EINVAL] The value specified by interval is invalid.
-
-
-BOOL
-pthread_win32_process_attach_np (void);
-
-BOOL
-pthread_win32_process_detach_np (void);
-
-BOOL
-pthread_win32_thread_attach_np (void);
-
-BOOL
-pthread_win32_thread_detach_np (void);
-
- These functions contain the code normally run via dllMain
- when the library is used as a dll but which need to be
- called explicitly by an application when the library
- is statically linked.
-
- You will need to call pthread_win32_process_attach_np() before
- you can call any pthread routines when statically linking.
- You should call pthread_win32_process_detach_np() before
- exiting your application to clean up.
-
- pthread_win32_thread_attach_np() is currently a no-op, but
- pthread_win32_thread_detach_np() is needed to clean up
- after Win32 threads that have called pthreads routines
- have exited.
-
- These functions invariably return TRUE except for
- pthread_win32_process_attach_np() which will return FALSE
- if pthreads-win32 initialisation fails.
-
-
-int
-pthreadCancelableWait (HANDLE waitHandle);
-
-int
-pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout);
-
- These two functions provide hooks into the pthread_cancel
- mechanism that will allow you to wait on a Windows handle
- and make it a cancellation point. Both functions block
- until either the given w32 handle is signaled, or
- pthread_cancel has been called. It is implemented using
- WaitForMultipleObjects on 'waitHandle' and a manually
- reset w32 event used to implement pthread_cancel.
-
-
Building under VC++ using either C++ EH or Structured EH
--------------------------------------------------------
diff --git a/README.NONPORTABLE b/README.NONPORTABLE new file mode 100644 index 0000000..7dfba7f --- /dev/null +++ b/README.NONPORTABLE @@ -0,0 +1,119 @@ +Non-portable functions included in the library +---------------------------------------------- + +HANDLE +pthread_getw32threadhandle_np(pthread_t thread); + + Returns the win32 thread handle that the POSIX + thread "thread" is running as. + + Applications can use the win32 handle to set + win32 specific attributes of the thread. + +int +pthread_delay_np (const struct timespec *interval); + + This routine causes a thread to delay execution for a specific + period of time. This period ends at the current time plus the + specified interval. The routine will not return before the end + of the period is reached, but may return an arbitrary amount + of time after the period has gone by. This can be due to + system load, thread priorities, and system timer granularity. + + Specifying an interval of zero (0) seconds and zero (0) + nanoseconds is allowed and can be used to force the thread + to give up the processor or to deliver a pending cancelation + request. + + This routine is a cancelation point. + + The timespec structure contains the following two fields: + + tv_sec is an integer number of seconds. + tv_nsec is an integer number of nanoseconds. + + Return Values + + If an error condition occurs, this routine returns an integer value + indicating the type of error. Possible return values are as follows: + + 0 Successful completion. + [EINVAL] The value specified by interval is invalid. + + +BOOL +pthread_win32_process_attach_np (void); + +BOOL +pthread_win32_process_detach_np (void); + +BOOL +pthread_win32_thread_attach_np (void); + +BOOL +pthread_win32_thread_detach_np (void); + + These functions contain the code normally run via dllMain + when the library is used as a dll but which need to be + called explicitly by an application when the library + is statically linked. + + You will need to call pthread_win32_process_attach_np() before + you can call any pthread routines when statically linking. + You should call pthread_win32_process_detach_np() before + exiting your application to clean up. + + pthread_win32_thread_attach_np() is currently a no-op, but + pthread_win32_thread_detach_np() is needed to clean up + after Win32 threads that have called pthreads routines + have exited. + + These functions invariably return TRUE except for + pthread_win32_process_attach_np() which will return FALSE + if pthreads-win32 initialisation fails. + + +int +pthreadCancelableWait (HANDLE waitHandle); + +int +pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); + + These two functions provide hooks into the pthread_cancel + mechanism that will allow you to wait on a Windows handle + and make it a cancellation point. Both functions block + until either the given w32 handle is signaled, or + pthread_cancel has been called. It is implemented using + WaitForMultipleObjects on 'waitHandle' and a manually + reset w32 event used to implement pthread_cancel. + + +void +pthread_mutexattr_setforcecs_np(pthread_mutexattr_t *attr, + int forcecs); + + This function is no longer required as pthreads-win32 + mutexes are now based entirely on Win32 critical + sections. Retained for backward compatibility. + + Allows an application to force the library to use + critical sections rather than win32 mutexes as + the basis for any mutex that uses "attr". + Critical sections are significantly faster than + mutexes. + + Values for "forcecs" are: + PTHREAD_MUTEX_AUTO_CS_NP + - allow the library to decide based on + availability of tryEnterCriticalSection(). + The library determines this at runtime + and will use critical sections whenever + tryEnterCriticalSection() is available. + PTHREAD_MUTEX_FORCE_CS_NP + - force use of critical sections even if + tryEnterCriticalSection() isn't provided + by the system, but you'd better not try + to use pthread_mutex_trylock() on any + mutex that uses "attr" if you want your + application to work on all versions of + Windows. @@ -732,7 +732,7 @@ pthread_mutexattr_settype (pthread_mutexattr_t * attr, * return with an error. * * PTHREAD_MUTEX_DEFAULT - * Same as PTHREAD_MUTEX_ERRORCHECK. + * Same as PTHREAD_MUTEX_RECURSIVE. * * PTHREAD_MUTEX_RECURSIVE * A thread attempting to relock this mutex without @@ -851,7 +851,6 @@ pthread_mutex_lock(pthread_mutex_t *mutex) ptw32_EnterCriticalSection(&mx->cs); } break; - case PTHREAD_MUTEX_DEFAULT: case PTHREAD_MUTEX_ERRORCHECK: if (pthread_equal(mx->ownerThread, self)) { @@ -862,6 +861,7 @@ pthread_mutex_lock(pthread_mutex_t *mutex) ptw32_EnterCriticalSection(&mx->cs); } break; + case PTHREAD_MUTEX_DEFAULT: case PTHREAD_MUTEX_RECURSIVE: ptw32_EnterCriticalSection(&mx->cs); break; @@ -363,10 +363,10 @@ typedef struct pthread_rwlockattr_t_ *pthread_rwlockattr_t; /* * pthread_attr_(get,set}scope * - * PTHREAD_SCOPE_PROCESS is the only scope supported. + * PTHREAD_SCOPE_SYSTEM is currently the only scope supported. */ -#define PTHREAD_SCOPE_SYSTEM 0 -#define PTHREAD_SCOPE_PROCESS 1 +#define PTHREAD_SCOPE_SYSTEM 0 +#define PTHREAD_SCOPE_PROCESS 1 /* * ==================== |