mirror of https://github.com/lukechilds/node.git
196 changed files with 487 additions and 35809 deletions
@ -1,5 +0,0 @@ |
|||
CVS |
|||
*.obj |
|||
*.dll |
|||
*.lib |
|||
*.res |
@ -1,482 +0,0 @@ |
|||
PTHREADS-WIN32 RELEASE 2.9.0 (2007-??-??) |
|||
----------------------------------------- |
|||
Web Site: http://sources.redhat.com/pthreads-win32/ |
|||
FTP Site: ftp://sources.redhat.com/pub/pthreads-win32 |
|||
Maintainer: Ross Johnson <rpj@callisto.canberra.edu.au> |
|||
|
|||
|
|||
We are pleased to announce the availability of a new release of |
|||
Pthreads-win32, an Open Source Software implementation of the |
|||
Threads component of the POSIX 1003.1 2001 Standard for Microsoft's |
|||
Win32 environment. Some functions from other sections of POSIX |
|||
1003.1 2001 are also supported including semaphores and scheduling |
|||
functions. |
|||
|
|||
Some common non-portable functions are also implemented for |
|||
additional compatibility, as are a few functions specific |
|||
to pthreads-win32 for easier integration with Win32 applications. |
|||
|
|||
Pthreads-win32 is free software, distributed under the GNU Lesser |
|||
General Public License (LGPL). |
|||
|
|||
|
|||
Acknowledgements |
|||
---------------- |
|||
This library is based originally on a Win32 pthreads |
|||
implementation contributed by John Bossom <John.Bossom@cognos.com>. |
|||
|
|||
The implementation of Condition Variables uses algorithms developed |
|||
by Alexander Terekhov and Louis Thomas. |
|||
|
|||
The implementation of POSIX mutexes has been improved by Thomas Pfaff |
|||
and later by Alexander Terekhov. |
|||
|
|||
The implementation of Spinlocks and Barriers was contributed |
|||
by Ross Johnson. |
|||
|
|||
The implementation of read/write locks was contributed by |
|||
Aurelio Medina and improved by Alexander Terekhov. |
|||
|
|||
Many others have contributed significant time and effort to solve crutial |
|||
problems in order to make the library workable, robust and reliable. |
|||
|
|||
Thanks to Xavier Leroy for granting permission to use and modify his |
|||
LinuxThreads manual pages. |
|||
|
|||
Thanks to The Open Group for making the Single Unix Specification |
|||
publicly available - many of the manual pages included in the package |
|||
were extracted from it. |
|||
|
|||
There is also a separate CONTRIBUTORS file. This file and others are |
|||
on the web site: |
|||
|
|||
http://sources.redhat.com/pthreads-win32 |
|||
|
|||
As much as possible, the ChangeLog file acknowledges contributions to the |
|||
code base in more detail. |
|||
|
|||
|
|||
Changes since the last release |
|||
------------------------------ |
|||
These are now documented in the NEWS file. |
|||
See the ChangeLog file also. |
|||
|
|||
|
|||
Known Bugs |
|||
---------- |
|||
These are now documented in the BUGS file. |
|||
|
|||
|
|||
Level of standards conformance |
|||
------------------------------ |
|||
|
|||
The following POSIX 1003.1 2001 options are defined and set to 200112L: |
|||
|
|||
_POSIX_THREADS |
|||
_POSIX_THREAD_SAFE_FUNCTIONS |
|||
_POSIX_THREAD_ATTR_STACKSIZE |
|||
_POSIX_THREAD_PRIORITY_SCHEDULING |
|||
_POSIX_SEMAPHORES |
|||
_POSIX_READER_WRITER_LOCKS |
|||
_POSIX_SPIN_LOCKS |
|||
_POSIX_BARRIERS |
|||
|
|||
|
|||
The following POSIX 1003.1 2001 options are defined and set to -1: |
|||
|
|||
_POSIX_THREAD_ATTR_STACKADDR |
|||
_POSIX_THREAD_PRIO_INHERIT |
|||
_POSIX_THREAD_PRIO_PROTECT |
|||
_POSIX_THREAD_PROCESS_SHARED |
|||
|
|||
|
|||
The following POSIX 1003.1 2001 limits are defined and set: |
|||
|
|||
_POSIX_THREAD_THREADS_MAX |
|||
_POSIX_SEM_VALUE_MAX |
|||
_POSIX_SEM_NSEMS_MAX |
|||
_POSIX_THREAD_KEYS_MAX |
|||
_POSIX_THREAD_DESTRUCTOR_ITERATIONS |
|||
PTHREAD_STACK_MIN |
|||
PTHREAD_THREADS_MAX |
|||
SEM_VALUE_MAX |
|||
SEM_NSEMS_MAX |
|||
PTHREAD_KEYS_MAX |
|||
PTHREAD_DESTRUCTOR_ITERATIONS |
|||
|
|||
|
|||
The following functions are implemented: |
|||
|
|||
--------------------------- |
|||
PThreads |
|||
--------------------------- |
|||
pthread_attr_init |
|||
pthread_attr_destroy |
|||
pthread_attr_getdetachstate |
|||
pthread_attr_getstackaddr |
|||
pthread_attr_getstacksize |
|||
pthread_attr_setdetachstate |
|||
pthread_attr_setstackaddr |
|||
pthread_attr_setstacksize |
|||
|
|||
pthread_create |
|||
pthread_detach |
|||
pthread_equal |
|||
pthread_exit |
|||
pthread_join |
|||
pthread_once |
|||
pthread_self |
|||
|
|||
pthread_cancel |
|||
pthread_cleanup_pop |
|||
pthread_cleanup_push |
|||
pthread_setcancelstate |
|||
pthread_setcanceltype |
|||
pthread_testcancel |
|||
|
|||
--------------------------- |
|||
Thread Specific Data |
|||
--------------------------- |
|||
pthread_key_create |
|||
pthread_key_delete |
|||
pthread_setspecific |
|||
pthread_getspecific |
|||
|
|||
--------------------------- |
|||
Mutexes |
|||
--------------------------- |
|||
pthread_mutexattr_init |
|||
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_mutexattr_getrobust |
|||
pthread_mutexattr_setrobust (values: PTHREAD_MUTEX_STALLED |
|||
PTHREAD_MUTEX_ROBUST) |
|||
pthread_mutex_init |
|||
pthread_mutex_destroy |
|||
pthread_mutex_lock |
|||
pthread_mutex_trylock |
|||
pthread_mutex_timedlock |
|||
pthread_mutex_unlock |
|||
pthread_mutex_consistent |
|||
|
|||
--------------------------- |
|||
Condition Variables |
|||
--------------------------- |
|||
pthread_condattr_init |
|||
pthread_condattr_destroy |
|||
pthread_condattr_getpshared |
|||
pthread_condattr_setpshared |
|||
|
|||
pthread_cond_init |
|||
pthread_cond_destroy |
|||
pthread_cond_wait |
|||
pthread_cond_timedwait |
|||
pthread_cond_signal |
|||
pthread_cond_broadcast |
|||
|
|||
--------------------------- |
|||
Read/Write Locks |
|||
--------------------------- |
|||
pthread_rwlock_init |
|||
pthread_rwlock_destroy |
|||
pthread_rwlock_tryrdlock |
|||
pthread_rwlock_trywrlock |
|||
pthread_rwlock_rdlock |
|||
pthread_rwlock_timedrdlock |
|||
pthread_rwlock_rwlock |
|||
pthread_rwlock_timedwrlock |
|||
pthread_rwlock_unlock |
|||
pthread_rwlockattr_init |
|||
pthread_rwlockattr_destroy |
|||
pthread_rwlockattr_getpshared |
|||
pthread_rwlockattr_setpshared |
|||
|
|||
--------------------------- |
|||
Spin Locks |
|||
--------------------------- |
|||
pthread_spin_init |
|||
pthread_spin_destroy |
|||
pthread_spin_lock |
|||
pthread_spin_unlock |
|||
pthread_spin_trylock |
|||
|
|||
--------------------------- |
|||
Barriers |
|||
--------------------------- |
|||
pthread_barrier_init |
|||
pthread_barrier_destroy |
|||
pthread_barrier_wait |
|||
pthread_barrierattr_init |
|||
pthread_barrierattr_destroy |
|||
pthread_barrierattr_getpshared |
|||
pthread_barrierattr_setpshared |
|||
|
|||
--------------------------- |
|||
Semaphores |
|||
--------------------------- |
|||
sem_init |
|||
sem_destroy |
|||
sem_post |
|||
sem_wait |
|||
sem_trywait |
|||
sem_timedwait |
|||
sem_getvalue (# free if +ve, # of waiters if -ve) |
|||
sem_open (returns an error ENOSYS) |
|||
sem_close (returns an error ENOSYS) |
|||
sem_unlink (returns an error ENOSYS) |
|||
|
|||
--------------------------- |
|||
RealTime Scheduling |
|||
--------------------------- |
|||
pthread_attr_getschedparam |
|||
pthread_attr_setschedparam |
|||
pthread_attr_getinheritsched |
|||
pthread_attr_setinheritsched |
|||
pthread_attr_getschedpolicy (only supports SCHED_OTHER) |
|||
pthread_attr_setschedpolicy (only supports SCHED_OTHER) |
|||
pthread_getschedparam |
|||
pthread_setschedparam |
|||
pthread_getconcurrency |
|||
pthread_setconcurrency |
|||
pthread_attr_getscope |
|||
pthread_attr_setscope (only supports PTHREAD_SCOPE_SYSTEM) |
|||
sched_get_priority_max |
|||
sched_get_priority_min |
|||
sched_rr_get_interval (returns an error ENOTSUP) |
|||
sched_setscheduler (only supports SCHED_OTHER) |
|||
sched_getscheduler (only supports SCHED_OTHER) |
|||
sched_yield |
|||
|
|||
--------------------------- |
|||
Signals |
|||
--------------------------- |
|||
pthread_sigmask |
|||
pthread_kill (only supports zero sig value, |
|||
for thread validity checking) |
|||
|
|||
--------------------------- |
|||
Non-portable routines (see the README.NONPORTABLE file for usage) |
|||
--------------------------- |
|||
pthread_getw32threadhandle_np |
|||
pthread_timechange_handler_np |
|||
pthread_delay_np |
|||
pthread_getunique_np |
|||
pthread_mutexattr_getkind_np |
|||
pthread_mutexattr_setkind_np (types: PTHREAD_MUTEX_FAST_NP, |
|||
PTHREAD_MUTEX_ERRORCHECK_NP, |
|||
PTHREAD_MUTEX_RECURSIVE_NP, |
|||
PTHREAD_MUTEX_ADAPTIVE_NP, |
|||
PTHREAD_MUTEX_TIMED_NP) |
|||
pthread_num_processors_np |
|||
pthread_win32_process_attach_np (Required when statically linking |
|||
the library) |
|||
pthread_win32_process_detach_np (Required when statically linking |
|||
the library) |
|||
pthread_win32_thread_attach_np (Required when statically linking |
|||
the library) |
|||
pthread_win32_thread_detach_np (Required when statically linking |
|||
the library) |
|||
|
|||
--------------------------- |
|||
Static Initializers |
|||
--------------------------- |
|||
PTHREAD_ONCE_INIT |
|||
PTHREAD_MUTEX_INITIALIZER |
|||
PTHREAD_RECURSIVE_MUTEX_INITIALIZER |
|||
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP |
|||
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER |
|||
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP |
|||
PTHREAD_COND_INITIALIZER |
|||
PTHREAD_RWLOCK_INITIALIZER |
|||
PTHREAD_SPINLOCK_INITIALIZER |
|||
|
|||
|
|||
The library includes two non-API functions for creating cancellation |
|||
points in applications and libraries: |
|||
|
|||
pthreadCancelableWait |
|||
pthreadCancelableTimedWait |
|||
|
|||
|
|||
The following functions are not implemented: |
|||
|
|||
--------------------------- |
|||
RealTime Scheduling |
|||
--------------------------- |
|||
pthread_mutex_getprioceiling |
|||
pthread_mutex_setprioceiling |
|||
pthread_mutex_attr_getprioceiling |
|||
pthread_mutex_attr_getprotocol |
|||
pthread_mutex_attr_setprioceiling |
|||
pthread_mutex_attr_setprotocol |
|||
|
|||
--------------------------- |
|||
Fork Handlers |
|||
--------------------------- |
|||
pthread_atfork |
|||
|
|||
--------------------------- |
|||
Stdio |
|||
--------------------------- |
|||
flockfile |
|||
ftrylockfile |
|||
funlockfile |
|||
getc_unlocked |
|||
getchar_unlocked |
|||
putc_unlocked |
|||
putchar_unlocked |
|||
|
|||
--------------------------- |
|||
Thread-Safe C Runtime Library |
|||
--------------------------- |
|||
readdir_r |
|||
getgrgid_r |
|||
getgrnam_r |
|||
getpwuid_r |
|||
getpwnam_r |
|||
|
|||
--------------------------- |
|||
Signals |
|||
--------------------------- |
|||
sigtimedwait |
|||
sigwait |
|||
sigwaitinfo |
|||
|
|||
--------------------------- |
|||
General |
|||
--------------------------- |
|||
sysconf |
|||
|
|||
--------------------------- |
|||
Thread-Safe C Runtime Library (macros) |
|||
--------------------------- |
|||
strtok_r |
|||
asctime_r |
|||
ctime_r |
|||
gmtime_r |
|||
localtime_r |
|||
rand_r |
|||
|
|||
|
|||
Availability |
|||
------------ |
|||
|
|||
The prebuilt DLL, export libs (for both MSVC and Mingw32), and the header |
|||
files (pthread.h, semaphore.h, sched.h) are available along with the |
|||
complete source code. |
|||
|
|||
The source code can be found at: |
|||
|
|||
ftp://sources.redhat.com/pub/pthreads-win32 |
|||
|
|||
and as individual source code files at |
|||
|
|||
ftp://sources.redhat.com/pub/pthreads-win32/source |
|||
|
|||
The pre-built DLL, export libraries and include files can be found at: |
|||
|
|||
ftp://sources.redhat.com/pub/pthreads-win32/dll-latest |
|||
|
|||
|
|||
|
|||
Mailing List |
|||
------------ |
|||
|
|||
There is a mailing list for discussing pthreads on Win32. To join, |
|||
send email to: |
|||
|
|||
pthreads-win32-subscribe@sourceware.cygnus.com |
|||
|
|||
|
|||
Application Development Environments |
|||
------------------------------------ |
|||
|
|||
See the README file for more information. |
|||
|
|||
MSVC: |
|||
MSVC using SEH works. Distribute pthreadVSE.dll with your application. |
|||
MSVC using C++ EH works. Distribute pthreadVCE.dll with your application. |
|||
MSVC using C setjmp/longjmp works. Distribute pthreadVC.dll with your application. |
|||
|
|||
|
|||
Mingw32: |
|||
See the FAQ, Questions 6 and 10. |
|||
|
|||
Mingw using C++ EH works. Distribute pthreadGCE.dll with your application. |
|||
Mingw using C setjmp/longjmp works. Distribute pthreadGC.dll with your application. |
|||
|
|||
|
|||
Cygwin: (http://sourceware.cygnus.com/cygwin/) |
|||
Developers using Cygwin do not need pthreads-win32 since it has POSIX threads |
|||
support. Refer to its documentation for details and extent. |
|||
|
|||
|
|||
UWIN: |
|||
UWIN is a complete Unix-like environment for Windows from AT&T. Pthreads-win32 |
|||
doesn't currently support UWIN (and vice versa), but that may change in the |
|||
future. |
|||
|
|||
Generally: |
|||
For convenience, the following pre-built files are available on the FTP site |
|||
(see Availability above): |
|||
|
|||
pthread.h - for POSIX threads |
|||
semaphore.h - for POSIX semaphores |
|||
sched.h - for POSIX scheduling |
|||
pthreadVCE.dll - built with MSVC++ compiler using C++ EH |
|||
pthreadVCE.lib |
|||
pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp |
|||
pthreadVC.lib |
|||
pthreadVSE.dll - built with MSVC compiler using SEH |
|||
pthreadVSE.lib |
|||
pthreadGCE.dll - built with Mingw32 G++ 2.95.2-1 |
|||
pthreadGC.dll - built with Mingw32 GCC 2.95.2-1 using setjmp/longjmp |
|||
libpthreadGCE.a - derived from pthreadGCE.dll |
|||
libpthreadGC.a - derived from pthreadGC.dll |
|||
gcc.dll - needed if distributing applications that use |
|||
pthreadGCE.dll (but see the FAQ Q 10 for the latest |
|||
related information) |
|||
|
|||
These are the only files you need in order to build POSIX threads |
|||
applications for Win32 using either MSVC or Mingw32. |
|||
|
|||
See the FAQ file in the source tree for additional information. |
|||
|
|||
|
|||
Documentation |
|||
------------- |
|||
|
|||
For the authoritative reference, see the online POSIX |
|||
standard reference at: |
|||
|
|||
http://www.OpenGroup.org |
|||
|
|||
For POSIX Thread API programming, several reference books are |
|||
available: |
|||
|
|||
Programming with POSIX Threads |
|||
David R. Butenhof |
|||
Addison-Wesley (pub) |
|||
|
|||
Pthreads Programming |
|||
By Bradford Nichols, Dick Buttlar & Jacqueline Proulx Farrell |
|||
O'Reilly (pub) |
|||
|
|||
On the web: see the links at the bottom of the pthreads-win32 site: |
|||
|
|||
http://sources.redhat.com/pthreads-win32/ |
|||
|
|||
Currently, there is no documentation included in the package apart |
|||
from the copious comments in the source code. |
|||
|
|||
|
|||
|
|||
Enjoy! |
|||
|
|||
Ross Johnson |
@ -1,141 +0,0 @@ |
|||
---------- |
|||
Known bugs |
|||
---------- |
|||
|
|||
1. Not strictly a bug, more of a gotcha. |
|||
|
|||
Under MS VC++ (only tested with version 6.0), a term_func |
|||
set via the standard C++ set_terminate() function causes the |
|||
application to abort. |
|||
|
|||
Notes from the MSVC++ manual: |
|||
1) A term_func() should call exit(), otherwise |
|||
abort() will be called on return to the caller. |
|||
A call to abort() raises SIGABRT and the default signal handler |
|||
for all signals terminates the calling program with |
|||
exit code 3. |
|||
2) A term_func() must not throw an exception. Therefore |
|||
term_func() should not call pthread_exit(), which |
|||
works by throwing an exception (pthreadVCE or pthreadVSE) |
|||
or by calling longjmp (pthreadVC). |
|||
|
|||
Workaround: avoid using pthread_exit() in C++ applications. Exit |
|||
threads by dropping through the end of the thread routine. |
|||
|
|||
2. Cancellation problems in C++ builds |
|||
- Milan Gardian |
|||
|
|||
[Note: It's not clear if this problem isn't simply due to the context |
|||
switch in pthread_cancel() which occurs unless the QueueUserAPCEx |
|||
library and driver are installed and used. Just like setjmp/longjmp, |
|||
this is probably not going to work well in C++. In any case, unless for |
|||
some very unusual reason you really must use the C++ build then please |
|||
use the C build pthreadVC2.dll or pthreadGC2.dll, i.e. for C++ |
|||
applications.] |
|||
|
|||
This is suspected to be a compiler bug in VC6.0, and also seen in |
|||
VC7.0 and VS .NET 2003. The GNU C++ compiler does not have a problem |
|||
with this, and it has been reported that the Intel C++ 8.1 compiler |
|||
and Visual C++ 2005 Express Edition Beta2 pass tests\semaphore4.c |
|||
(which exposes the bug). |
|||
|
|||
Workaround [rpj - 2 Feb 2002] |
|||
----------------------------- |
|||
[Please note: this workaround did not solve a similar problem in |
|||
snapshot-2004-11-03 or later, even though similar symptoms were seen. |
|||
tests\semaphore4.c fails in that snapshot for the VCE version of the |
|||
DLL.] |
|||
|
|||
The problem disappears when /Ob0 is used, i.e. /O2 /Ob0 works OK, |
|||
but if you want to use inlining optimisation you can be much more |
|||
specific about where it's switched off and on by using a pragma. |
|||
|
|||
So the inlining optimisation is interfering with the way that cleanup |
|||
handlers are run. It appears to relate to auto-inlining of class methods |
|||
since this is the only auto inlining that is performed at /O1 optimisation |
|||
(functions with the "inline" qualifier are also inlined, but the problem |
|||
doesn't appear to involve any such functions in the library or testsuite). |
|||
|
|||
In order to confirm the inlining culprit, the following use of pragmas |
|||
eliminate the problem but I don't know how to make it transparent, putting |
|||
it in, say, pthread.h where pthread_cleanup_push defined as a macro. |
|||
|
|||
#pragma inline_depth(0) |
|||
pthread_cleanup_push(handlerFunc, (void *) &arg); |
|||
|
|||
/* ... */ |
|||
|
|||
pthread_cleanup_pop(0); |
|||
#pragma inline_depth() |
|||
|
|||
Note the empty () pragma value after the pop macro. This resets depth to the |
|||
default. Or you can specify a non-zero depth here. |
|||
|
|||
The pragma is also needed (and now used) within the library itself wherever |
|||
cleanup handlers are used (condvar.c and rwlock.c). |
|||
|
|||
Use of these pragmas allows compiler optimisations /O1 and /O2 to be |
|||
used for either or both the library and applications. |
|||
|
|||
Experimenting further, I found that wrapping the actual cleanup handler |
|||
function with #pragma auto_inline(off|on) does NOT work. |
|||
|
|||
MSVC6.0 doesn't appear to support the C99 standard's _Pragma directive, |
|||
however, later versions may. This form is embeddable inside #define |
|||
macros, which would be ideal because it would mean that it could be added |
|||
to the push/pop macro definitions in pthread.h and hidden from the |
|||
application programmer. |
|||
|
|||
[/rpj] |
|||
|
|||
Original problem description |
|||
---------------------------- |
|||
|
|||
The cancellation (actually, cleanup-after-cancel) tests fail when using VC |
|||
(professional) optimisation switches (/O1 or /O2) in pthreads library. I |
|||
have not investigated which concrete optimisation technique causes this |
|||
problem (/Og, /Oi, /Ot, /Oy, /Ob1, /Gs, /Gf, /Gy, etc.), but here is a |
|||
summary of builds and corresponding failures: |
|||
|
|||
* pthreads VSE (optimised tests): OK |
|||
* pthreads VCE (optimised tests): Failed "cleanup1" test (runtime) |
|||
|
|||
* pthreads VSE (DLL in CRT, optimised tests): OK |
|||
* pthreads VCE (DLL in CRT, optimised tests): Failed "cleanup1" test |
|||
(runtime) |
|||
|
|||
Please note that while in VSE version of the pthreads library the |
|||
optimisation does not really have any impact on the tests (they pass OK), in |
|||
VCE version addition of optimisation (/O2 in this case) causes the tests to |
|||
fail uniformly - either in "cleanup0" or "cleanup1" test cases. |
|||
|
|||
Please note that all the tests above use default pthreads DLL (no |
|||
optimisations, linked with either static or DLL CRT, based on test type). |
|||
Therefore the problem lies not within the pthreads DLL but within the |
|||
compiled client code (the application using pthreads -> involvement of |
|||
"pthread.h"). |
|||
|
|||
I think the message of this section is that usage of VCE version of pthreads |
|||
in applications relying on cancellation/cleanup AND using optimisations for |
|||
creation of production code is highly unreliable for the current version of |
|||
the pthreads library. |
|||
|
|||
3. The Borland Builder 5.5 version of the library produces memory read exceptions |
|||
in some tests. |
|||
|
|||
4. pthread_barrier_wait() can deadlock if the number of potential calling |
|||
threads for a particular barrier is greater than the barrier count parameter |
|||
given to pthread_barrier_init() for that barrier. |
|||
|
|||
This is due to the very lightweight implementation of pthread-win32 barriers. |
|||
To cope with more than "count" possible waiters, barriers must effectively |
|||
implement all the same safeguards as condition variables, making them much |
|||
"heavier" than at present. |
|||
|
|||
The workaround is to ensure that no more than "count" threads attempt to wait |
|||
at the barrier. |
|||
|
|||
5. Canceling a thread blocked on pthread_once appears not to work in the MSVC++ |
|||
version of the library "pthreadVCE.dll". The test case "once3.c" hangs. I have no |
|||
clues on this at present. All other versions pass this test ok - pthreadsVC.dll, |
|||
pthreadsVSE.dll, pthreadsGC.dll and pthreadsGCE.dll. |
@ -1,268 +0,0 @@ |
|||
# This makefile is compatible with BCB make. Use "make -fBMakefile" to compile. |
|||
# |
|||
# The variables $DLLDEST and $LIBDEST hold the destination directories for the |
|||
# dll and the lib, respectively. Probably all that needs to change is $DEVROOT. |
|||
# |
|||
# Currently only the recommended pthreadBC.dll is built by this makefile. |
|||
# |
|||
|
|||
|
|||
DLL_VER = 2 |
|||
|
|||
DEVROOT = . |
|||
|
|||
DLLDEST = $(DEVROOT)\DLL |
|||
LIBDEST = $(DEVROOT)\DLL |
|||
|
|||
DLLS = pthreadBC$(DLL_VER).dll |
|||
|
|||
OPTIM = /O2 |
|||
|
|||
RC = brcc32 |
|||
RCFLAGS = -i. |
|||
|
|||
CFLAGS = /q /I. /D_WIN32_WINNT=0x400 /DHAVE_PTW32_CONFIG_H=1 /4 /tWD /tWM \ |
|||
/w-aus /w-asc /w-par |
|||
|
|||
#C cleanup code |
|||
BCFLAGS = $(PTW32_FLAGS) $(CFLAGS) |
|||
|
|||
# Agregate modules for inlinability |
|||
DLL_OBJS = \ |
|||
attr.obj \ |
|||
barrier.obj \ |
|||
cancel.obj \ |
|||
cleanup.obj \ |
|||
condvar.obj \ |
|||
create.obj \ |
|||
dll.obj \ |
|||
errno.obj \ |
|||
exit.obj \ |
|||
fork.obj \ |
|||
global.obj \ |
|||
misc.obj \ |
|||
mutex.obj \ |
|||
nonportable.obj \ |
|||
private.obj \ |
|||
rwlock.obj \ |
|||
sched.obj \ |
|||
semaphore.obj \ |
|||
signal.obj \ |
|||
spin.obj \ |
|||
sync.obj \ |
|||
tsd.obj |
|||
|
|||
INCL = config.h implement.h semaphore.h pthread.h need_errno.h |
|||
|
|||
ATTR_SRCS = \ |
|||
pthread_attr_init.c \ |
|||
pthread_attr_destroy.c \ |
|||
pthread_attr_getdetachstate.c \ |
|||
pthread_attr_setdetachstate.c \ |
|||
pthread_attr_getstackaddr.c \ |
|||
pthread_attr_setstackaddr.c \ |
|||
pthread_attr_getstacksize.c \ |
|||
pthread_attr_setstacksize.c \ |
|||
pthread_attr_getscope.c \ |
|||
pthread_attr_setscope.c |
|||
|
|||
BARRIER_SRCS = \ |
|||
pthread_barrier_init.c \ |
|||
pthread_barrier_destroy.c \ |
|||
pthread_barrier_wait.c \ |
|||
pthread_barrierattr_init.c \ |
|||
pthread_barrierattr_destroy.c \ |
|||
pthread_barrierattr_setpshared.c \ |
|||
pthread_barrierattr_getpshared.c |
|||
|
|||
CANCEL_SRCS = \ |
|||
pthread_setcancelstate.c \ |
|||
pthread_setcanceltype.c \ |
|||
pthread_testcancel.c \ |
|||
pthread_cancel.c |
|||
|
|||
CONDVAR_SRCS = \ |
|||
ptw32_cond_check_need_init.c \ |
|||
pthread_condattr_destroy.c \ |
|||
pthread_condattr_getpshared.c \ |
|||
pthread_condattr_init.c \ |
|||
pthread_condattr_setpshared.c \ |
|||
pthread_cond_destroy.c \ |
|||
pthread_cond_init.c \ |
|||
pthread_cond_signal.c \ |
|||
pthread_cond_wait.c |
|||
|
|||
EXIT_SRCS = \ |
|||
pthread_exit.c |
|||
|
|||
MISC_SRCS = \ |
|||
pthread_equal.c \ |
|||
pthread_getconcurrency.c \ |
|||
pthread_once.c \ |
|||
pthread_self.c \ |
|||
pthread_setconcurrency.c \ |
|||
ptw32_calloc.c \ |
|||
ptw32_MCS_lock.c \ |
|||
ptw32_new.c \ |
|||
w32_CancelableWait.c |
|||
|
|||
MUTEX_SRCS = \ |
|||
ptw32_mutex_check_need_init.c \ |
|||
pthread_mutex_init.c \ |
|||
pthread_mutex_destroy.c \ |
|||
pthread_mutexattr_init.c \ |
|||
pthread_mutexattr_destroy.c \ |
|||
pthread_mutexattr_getpshared.c \ |
|||
pthread_mutexattr_setpshared.c \ |
|||
pthread_mutexattr_settype.c \ |
|||
pthread_mutexattr_gettype.c \ |
|||
pthread_mutexattr_setrobust.c \ |
|||
pthread_mutexattr_getrobust.c \ |
|||
pthread_mutex_lock.c \ |
|||
pthread_mutex_timedlock.c \ |
|||
pthread_mutex_unlock.c \ |
|||
pthread_mutex_trylock.c \ |
|||
pthread_mutex_consistent.c |
|||
|
|||
NONPORTABLE_SRCS = \ |
|||
pthread_mutexattr_setkind_np.c \ |
|||
pthread_mutexattr_getkind_np.c \ |
|||
pthread_getw32threadhandle_np.c \ |
|||
pthread_delay_np.c \ |
|||
pthread_num_processors_np.c \ |
|||
pthread_win32_attach_detach_np.c \ |
|||
pthread_timechange_handler_np.c |
|||
|
|||
PRIVATE_SRCS = \ |
|||
ptw32_is_attr.c \ |
|||
ptw32_processInitialize.c \ |
|||
ptw32_processTerminate.c \ |
|||
ptw32_threadStart.c \ |
|||
ptw32_threadDestroy.c \ |
|||
ptw32_tkAssocCreate.c \ |
|||
ptw32_tkAssocDestroy.c \ |
|||
ptw32_callUserDestroyRoutines.c \ |
|||
ptw32_timespec.c \ |
|||
ptw32_relmillisecs.c \ |
|||
ptw32_throw.c \ |
|||
ptw32_getprocessors.c |
|||
|
|||
RWLOCK_SRCS = \ |
|||
ptw32_rwlock_check_need_init.c \ |
|||
ptw32_rwlock_cancelwrwait.c \ |
|||
pthread_rwlock_init.c \ |
|||
pthread_rwlock_destroy.c \ |
|||
pthread_rwlockattr_init.c \ |
|||
pthread_rwlockattr_destroy.c \ |
|||
pthread_rwlockattr_getpshared.c \ |
|||
pthread_rwlockattr_setpshared.c \ |
|||
pthread_rwlock_rdlock.c \ |
|||
pthread_rwlock_timedrdlock.c \ |
|||
pthread_rwlock_wrlock.c \ |
|||
pthread_rwlock_timedwrlock.c \ |
|||
pthread_rwlock_unlock.c \ |
|||
pthread_rwlock_tryrdlock.c \ |
|||
pthread_rwlock_trywrlock.c |
|||
|
|||
SCHED_SRCS = \ |
|||
pthread_attr_setschedpolicy.c \ |
|||
pthread_attr_getschedpolicy.c \ |
|||
pthread_attr_setschedparam.c \ |
|||
pthread_attr_getschedparam.c \ |
|||
pthread_attr_setinheritsched.c \ |
|||
pthread_attr_getinheritsched.c \ |
|||
pthread_setschedparam.c \ |
|||
pthread_getschedparam.c \ |
|||
sched_get_priority_max.c \ |
|||
sched_get_priority_min.c \ |
|||
sched_setscheduler.c \ |
|||
sched_getscheduler.c \ |
|||
sched_yield.c |
|||
|
|||
SEMAPHORE_SRCS = \ |
|||
sem_init.c \ |
|||
sem_destroy.c \ |
|||
sem_trywait.c \ |
|||
sem_timedwait.c \ |
|||
sem_wait.c \ |
|||
sem_post.c \ |
|||
sem_post_multiple.c \ |
|||
sem_getvalue.c \ |
|||
sem_open.c \ |
|||
sem_close.c \ |
|||
sem_unlink.c |
|||
|
|||
SPIN_SRCS = \ |
|||
ptw32_spinlock_check_need_init.c \ |
|||
pthread_spin_init.c \ |
|||
pthread_spin_destroy.c \ |
|||
pthread_spin_lock.c \ |
|||
pthread_spin_unlock.c \ |
|||
pthread_spin_trylock.c |
|||
|
|||
SYNC_SRCS = \ |
|||
pthread_detach.c \ |
|||
pthread_join.c |
|||
|
|||
TSD_SRCS = \ |
|||
pthread_key_create.c \ |
|||
pthread_key_delete.c \ |
|||
pthread_setspecific.c \ |
|||
pthread_getspecific.c |
|||
|
|||
|
|||
all: clean $(DLLS) |
|||
|
|||
realclean: clean |
|||
if exist pthread*.dll del pthread*.dll |
|||
if exist pthread*.lib del pthread*.lib |
|||
if exist *.stamp del *.stamp |
|||
|
|||
clean: |
|||
if exist *.obj del *.obj |
|||
if exist *.ilk del *.ilk |
|||
if exist *.ilc del *.ilc |
|||
if exist *.ild del *.ild |
|||
if exist *.ilf del *.ilf |
|||
if exist *.ils del *.ils |
|||
if exist *.tds del *.tds |
|||
if exist *.pdb del *.pdb |
|||
if exist *.exp del *.exp |
|||
if exist *.map del *.map |
|||
if exist *.o del *.o |
|||
if exist *.i del *.i |
|||
if exist *.res del *.res |
|||
|
|||
|
|||
install: $(DLLS) |
|||
copy pthread*.dll $(DLLDEST) |
|||
copy pthread*.lib $(LIBDEST) |
|||
|
|||
$(DLLS): $(DLL_OBJS) version.res |
|||
ilink32 /Tpd /Gi c0d32x.obj $(DLL_OBJS), \ |
|||
$@, ,\ |
|||
cw32mti.lib import32.lib, ,\ |
|||
version.res |
|||
|
|||
.c.obj: |
|||
$(CC) $(OPTIM) $(BCFLAGS) -c $< |
|||
|
|||
.rc.res: |
|||
$(RC) $(RCFLAGS) $< |
|||
|
|||
attr.obj: attr.c $(ATTR_SRCS) $(INCL) |
|||
barrier.obj: barrier.c $(BARRIER_SRCS) $(INCL) |
|||
cancel.obj: cancel.c $(CANCEL_SRCS) $(INCL) |
|||
condvar.obj: condvar.c $(CONDVAR_SRCS) $(INCL) |
|||
exit.obj: exit.c $(EXIT_SRCS) $(INCL) |
|||
misc.obj: misc.c $(MISC_SRCS) $(INCL) |
|||
mutex.obj: mutex.c $(MUTEX_SRCS) $(INCL) |
|||
nonportable.obj: nonportable.c $(NONPORTABLE_SRCS) $(INCL) |
|||
private.obj: private.c $(PRIVATE_SRCS) $(INCL) |
|||
rwlock.obj: rwlock.c $(RWLOCK_SRCS) $(INCL) |
|||
sched.obj: sched.c $(SCHED_SRCS) $(INCL) |
|||
semaphore.obj: semaphore.c $(SEMAPHORE_SRCS) $(INCL) |
|||
spin.obj: spin.c $(SPIN_SRCS) $(INCL) |
|||
sync.obj: sync.c $(SYNC_SRCS) $(INCL) |
|||
tsd.obj: tsd.c $(TSD_SRCS) $(INCL) |
|||
version.res: version.rc $(INCL) |
@ -1,140 +0,0 @@ |
|||
Contributors (in approximate order of appearance) |
|||
|
|||
[See also the ChangeLog file where individuals are |
|||
attributed in log entries. Likewise in the FAQ file.] |
|||
|
|||
Ben Elliston bje at cygnus dot com |
|||
Initiated the project; |
|||
setup the project infrastructure (CVS, web page, etc.); |
|||
early prototype routines. |
|||
Ross Johnson Ross dot Johnson at dot homemail dot com dot au |
|||
early prototype routines; |
|||
ongoing project coordination/maintenance; |
|||
implementation of spin locks and barriers; |
|||
various enhancements; |
|||
bug fixes; |
|||
documentation; |
|||
testsuite. |
|||
Robert Colquhoun rjc at trump dot net dot au |
|||
Early bug fixes. |
|||
John E. Bossom John dot Bossom at cognos dot com |
|||
Contributed substantial original working implementation; |
|||
bug fixes; |
|||
ongoing guidance and standards interpretation. |
|||
Anders Norlander anorland at hem2 dot passagen dot se |
|||
Early enhancements and runtime checking for supported |
|||
Win32 routines. |
|||
Tor Lillqvist tml at iki dot fi |
|||
General enhancements; |
|||
early bug fixes to condition variables. |
|||
Scott Lightner scott at curriculum dot com |
|||
Bug fix. |
|||
Kevin Ruland Kevin dot Ruland at anheuser-busch dot com |
|||
Various bug fixes. |
|||
Mike Russo miker at eai dot com |
|||
Bug fix. |
|||
Mark E. Armstrong avail at pacbell dot net |
|||
Bug fixes. |
|||
Lorin Hochstein lmh at xiphos dot ca |
|||
general bug fixes; bug fixes to condition variables. |
|||
Peter Slacik Peter dot Slacik at tatramed dot sk |
|||
Bug fixes. |
|||
Mumit Khan khan at xraylith dot wisc dot edu |
|||
Fixes to work with Mingw32. |
|||
Milan Gardian mg at tatramed dot sk |
|||
Bug fixes and reports/analyses of obscure problems. |
|||
Aurelio Medina aureliom at crt dot com |
|||
First implementation of read-write locks. |
|||
Graham Dumpleton Graham dot Dumpleton at ra dot pad dot otc dot telstra dot com dot au |
|||
Bug fix in condition variables. |
|||
Tristan Savatier tristan at mpegtv dot com |
|||
WinCE port. |
|||
Erik Hensema erik at hensema dot xs4all dot nl |
|||
Bug fixes. |
|||
Rich Peters rpeters at micro-magic dot com |
|||
Todd Owen towen at lucidcalm dot dropbear dot id dot au |
|||
Bug fixes to dll loading. |
|||
Jason Nye jnye at nbnet dot nb dot ca |
|||
Implementation of async cancelation. |
|||
Fred Forester fforest at eticomm dot net |
|||
Kevin D. Clark kclark at cabletron dot com |
|||
David Baggett dmb at itasoftware dot com |
|||
Bug fixes. |
|||
Paul Redondo paul at matchvision dot com |
|||
Scott McCaskill scott at 3dfx dot com |
|||
Bug fixes. |
|||
Jef Gearhart jgearhart at tpssys dot com |
|||
Bug fix. |
|||
Arthur Kantor akantor at bexusa dot com |
|||
Mutex enhancements. |
|||
Steven Reddie smr at essemer dot com dot au |
|||
Bug fix. |
|||
Alexander Terekhov TEREKHOV at de dot ibm dot com |
|||
Re-implemented and improved read-write locks; |
|||
(with Louis Thomas) re-implemented and improved |
|||
condition variables; |
|||
enhancements to semaphores; |
|||
enhancements to mutexes; |
|||
new mutex implementation in 'futex' style; |
|||
suggested a robust implementation of pthread_once |
|||
similar to that implemented by V.Kliathcko; |
|||
system clock change handling re CV timeouts; |
|||
bug fixes. |
|||
Thomas Pfaff tpfaff at gmx dot net |
|||
Changes to make C version usable with C++ applications; |
|||
re-implemented mutex routines to avoid Win32 mutexes |
|||
and TryEnterCriticalSection; |
|||
procedure to fix Mingw32 thread-safety issues. |
|||
Franco Bez franco dot bez at gmx dot de |
|||
procedure to fix Mingw32 thread-safety issues. |
|||
Louis Thomas lthomas at arbitrade dot com |
|||
(with Alexander Terekhov) re-implemented and improved |
|||
condition variables. |
|||
David Korn dgk at research dot att dot com |
|||
Ported to UWIN. |
|||
Phil Frisbie, Jr. phil at hawksoft dot com |
|||
Bug fix. |
|||
Ralf Brese Ralf dot Brese at pdb4 dot siemens dot de |
|||
Bug fix. |
|||
prionx at juno dot com prionx at juno dot com |
|||
Bug fixes. |
|||
Max Woodbury mtew at cds dot duke dot edu |
|||
POSIX versioning conditionals; |
|||
reduced namespace pollution; |
|||
idea to separate routines to reduce statically |
|||
linked image sizes. |
|||
Rob Fanner rfanner at stonethree dot com |
|||
Bug fix. |
|||
Michael Johnson michaelj at maine dot rr dot com |
|||
Bug fix. |
|||
Nicolas Barry boozai at yahoo dot com |
|||
Bug fixes. |
|||
Piet van Bruggen pietvb at newbridges dot nl |
|||
Bug fix. |
|||
Makoto Kato raven at oldskool dot jp |
|||
AMD64 port. |
|||
Panagiotis E. Hadjidoukas peh at hpclab dot ceid dot upatras dot gr |
|||
phadjido at cs dot uoi dot gr |
|||
Contributed the QueueUserAPCEx package which |
|||
makes preemptive async cancelation possible. |
|||
Will Bryant will dot bryant at ecosm dot com |
|||
Borland compiler patch and makefile. |
|||
Anuj Goyal anuj dot goyal at gmail dot com |
|||
Port to Digital Mars compiler. |
|||
Gottlob Frege gottlobfrege at gmail dot com |
|||
re-implemented pthread_once (version 2) |
|||
(pthread_once cancellation added by rpj). |
|||
Vladimir Kliatchko vladimir at kliatchko dot com |
|||
reimplemented pthread_once with the same form |
|||
as described by A.Terekhov (later version 2); |
|||
implementation of MCS (Mellor-Crummey/Scott) locks. |
|||
Ramiro Polla ramiro.polla at gmail dot com |
|||
static library auto init/cleanup on application |
|||
start/exit via RT hooks (MSC and GCC compilers only). |
|||
Daniel Richard G. skunk at iSKUNK dot org |
|||
Patches and cleanups for x86 and x64, particularly |
|||
across a range of MS build environments. |
|||
John Kamp john dot kamp at globalgraphics dot com |
|||
Patches to fix various problems on x64; brutal testing |
|||
particularly using high memory run environments. |
|||
|
@ -1,150 +0,0 @@ |
|||
pthreads-win32 - a POSIX threads library for Microsoft Windows |
|||
|
|||
|
|||
This file is Copyrighted |
|||
------------------------ |
|||
|
|||
This file is covered under the following Copyright: |
|||
|
|||
Copyright (C) 2001,2006 Ross P. Johnson |
|||
All rights reserved. |
|||
|
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
Pthreads-win32 is covered by the GNU Lesser General Public License |
|||
------------------------------------------------------------------ |
|||
|
|||
Pthreads-win32 is open software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public License |
|||
as published by the Free Software Foundation version 2.1 of the |
|||
License. |
|||
|
|||
Pthreads-win32 is several binary link libraries, several modules, |
|||
associated interface definition files and scripts used to control |
|||
its compilation and installation. |
|||
|
|||
Pthreads-win32 is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU Lesser General Public License for more details. |
|||
|
|||
A copy of the GNU Lesser General Public License is distributed with |
|||
pthreads-win32 under the filename: |
|||
|
|||
COPYING.LIB |
|||
|
|||
You should have received a copy of the version 2.1 GNU Lesser General |
|||
Public License with pthreads-win32; if not, write to: |
|||
|
|||
Free Software Foundation, Inc. |
|||
59 Temple Place |
|||
Suite 330 |
|||
Boston, MA 02111-1307 |
|||
USA |
|||
|
|||
The contact addresses for pthreads-win32 is as follows: |
|||
|
|||
Web: http://sources.redhat.com/pthreads-win32 |
|||
Email: Ross Johnson |
|||
Please use: Firstname.Lastname@homemail.com.au |
|||
|
|||
|
|||
|
|||
Pthreads-win32 copyrights and exception files |
|||
--------------------------------------------- |
|||
|
|||
With the exception of the files listed below, Pthreads-win32 |
|||
is covered under the following GNU Lesser General Public License |
|||
Copyrights: |
|||
|
|||
Pthreads-win32 - POSIX Threads Library for Win32 |
|||
Copyright(C) 1998 John E. Bossom |
|||
Copyright(C) 1999,2006 Pthreads-win32 contributors |
|||
|
|||
The current list of contributors is contained |
|||
in the file CONTRIBUTORS included with the source |
|||
code distribution. The current list of CONTRIBUTORS |
|||
can also be seen at the following WWW location: |
|||
http://sources.redhat.com/pthreads-win32/contributors.html |
|||
|
|||
Contact Email: Ross Johnson |
|||
Please use: Firstname.Lastname@homemail.com.au |
|||
|
|||
These files are not covered under one of the Copyrights listed above: |
|||
|
|||
COPYING |
|||
COPYING.LIB |
|||
tests/rwlock7.c |
|||
|
|||
This file, COPYING, is distributed under the Copyright found at the |
|||
top of this file. It is important to note that you may distribute |
|||
verbatim copies of this file but you may not modify this file. |
|||
|
|||
The file COPYING.LIB, which contains a copy of the version 2.1 |
|||
GNU Lesser General Public License, is itself copyrighted by the |
|||
Free Software Foundation, Inc. Please note that the Free Software |
|||
Foundation, Inc. does NOT have a copyright over Pthreads-win32, |
|||
only the COPYING.LIB that is supplied with pthreads-win32. |
|||
|
|||
The file tests/rwlock7.c is derived from code written by |
|||
Dave Butenhof for his book 'Programming With POSIX(R) Threads'. |
|||
The original code was obtained by free download from his website |
|||
http://home.earthlink.net/~anneart/family/Threads/source.html |
|||
and did not contain a copyright or author notice. It is assumed to |
|||
be freely distributable. |
|||
|
|||
In all cases one may use and distribute these exception files freely. |
|||
And because one may freely distribute the LGPL covered files, the |
|||
entire pthreads-win32 source may be freely used and distributed. |
|||
|
|||
|
|||
|
|||
General Copyleft and License info |
|||
--------------------------------- |
|||
|
|||
For general information on Copylefts, see: |
|||
|
|||
http://www.gnu.org/copyleft/ |
|||
|
|||
For information on GNU Lesser General Public Licenses, see: |
|||
|
|||
http://www.gnu.org/copyleft/lesser.html |
|||
http://www.gnu.org/copyleft/lesser.txt |
|||
|
|||
|
|||
Why pthreads-win32 did not use the GNU General Public License |
|||
------------------------------------------------------------- |
|||
|
|||
The goal of the pthreads-win32 project has been to |
|||
provide a quality and complete implementation of the POSIX |
|||
threads API for Microsoft Windows within the limits imposed |
|||
by virtue of it being a stand-alone library and not |
|||
linked directly to other POSIX compliant libraries. For |
|||
example, some functions and features, such as those based |
|||
on POSIX signals, are missing. |
|||
|
|||
Pthreads-win32 is a library, available in several different |
|||
versions depending on supported compilers, and may be used |
|||
as a dynamically linked module or a statically linked set of |
|||
binary modules. It is not an application on it's own. |
|||
|
|||
It was fully intended that pthreads-win32 be usable with |
|||
commercial software not covered by either the GPL or the LGPL |
|||
licenses. Pthreads-win32 has many contributors to it's |
|||
code base, many of whom have done so because they have |
|||
used the library in commercial or proprietry software |
|||
projects. |
|||
|
|||
Releasing pthreads-win32 under the LGPL ensures that the |
|||
library can be used widely, while at the same time ensures |
|||
that bug fixes and improvements to the pthreads-win32 code |
|||
itself is returned to benefit all current and future users |
|||
of the library. |
|||
|
|||
Although pthreads-win32 makes it possible for applications |
|||
that use POSIX threads to be ported to Win32 platforms, the |
|||
broader goal of the project is to encourage the use of open |
|||
standards, and in particular, to make it just a little easier |
|||
for developers writing Win32 applications to consider |
|||
widening the potential market for their products. |
@ -1,504 +0,0 @@ |
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
Version 2.1, February 1999 |
|||
|
|||
Copyright (C) 1991, 1999 Free Software Foundation, Inc. |
|||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
[This is the first released version of the Lesser GPL. It also counts |
|||
as the successor of the GNU Library Public License, version 2, hence |
|||
the version number 2.1.] |
|||
|
|||
Preamble |
|||
|
|||
The licenses for most software are designed to take away your |
|||
freedom to share and change it. By contrast, the GNU General Public |
|||
Licenses are intended to guarantee your freedom to share and change |
|||
free software--to make sure the software is free for all its users. |
|||
|
|||
This license, the Lesser General Public License, applies to some |
|||
specially designated software packages--typically libraries--of the |
|||
Free Software Foundation and other authors who decide to use it. You |
|||
can use it too, but we suggest you first think carefully about whether |
|||
this license or the ordinary General Public License is the better |
|||
strategy to use in any particular case, based on the explanations below. |
|||
|
|||
When we speak of free software, we are referring to freedom of use, |
|||
not price. Our General Public Licenses are designed to make sure that |
|||
you have the freedom to distribute copies of free software (and charge |
|||
for this service if you wish); that you receive source code or can get |
|||
it if you want it; that you can change the software and use pieces of |
|||
it in new free programs; and that you are informed that you can do |
|||
these things. |
|||
|
|||
To protect your rights, we need to make restrictions that forbid |
|||
distributors to deny you these rights or to ask you to surrender these |
|||
rights. These restrictions translate to certain responsibilities for |
|||
you if you distribute copies of the library or if you modify it. |
|||
|
|||
For example, if you distribute copies of the library, whether gratis |
|||
or for a fee, you must give the recipients all the rights that we gave |
|||
you. You must make sure that they, too, receive or can get the source |
|||
code. If you link other code with the library, you must provide |
|||
complete object files to the recipients, so that they can relink them |
|||
with the library after making changes to the library and recompiling |
|||
it. And you must show them these terms so they know their rights. |
|||
|
|||
We protect your rights with a two-step method: (1) we copyright the |
|||
library, and (2) we offer you this license, which gives you legal |
|||
permission to copy, distribute and/or modify the library. |
|||
|
|||
To protect each distributor, we want to make it very clear that |
|||
there is no warranty for the free library. Also, if the library is |
|||
modified by someone else and passed on, the recipients should know |
|||
that what they have is not the original version, so that the original |
|||
author's reputation will not be affected by problems that might be |
|||
introduced by others. |
|||
|
|||
Finally, software patents pose a constant threat to the existence of |
|||
any free program. We wish to make sure that a company cannot |
|||
effectively restrict the users of a free program by obtaining a |
|||
restrictive license from a patent holder. Therefore, we insist that |
|||
any patent license obtained for a version of the library must be |
|||
consistent with the full freedom of use specified in this license. |
|||
|
|||
Most GNU software, including some libraries, is covered by the |
|||
ordinary GNU General Public License. This license, the GNU Lesser |
|||
General Public License, applies to certain designated libraries, and |
|||
is quite different from the ordinary General Public License. We use |
|||
this license for certain libraries in order to permit linking those |
|||
libraries into non-free programs. |
|||
|
|||
When a program is linked with a library, whether statically or using |
|||
a shared library, the combination of the two is legally speaking a |
|||
combined work, a derivative of the original library. The ordinary |
|||
General Public License therefore permits such linking only if the |
|||
entire combination fits its criteria of freedom. The Lesser General |
|||
Public License permits more lax criteria for linking other code with |
|||
the library. |
|||
|
|||
We call this license the "Lesser" General Public License because it |
|||
does Less to protect the user's freedom than the ordinary General |
|||
Public License. It also provides other free software developers Less |
|||
of an advantage over competing non-free programs. These disadvantages |
|||
are the reason we use the ordinary General Public License for many |
|||
libraries. However, the Lesser license provides advantages in certain |
|||
special circumstances. |
|||
|
|||
For example, on rare occasions, there may be a special need to |
|||
encourage the widest possible use of a certain library, so that it becomes |
|||
a de-facto standard. To achieve this, non-free programs must be |
|||
allowed to use the library. A more frequent case is that a free |
|||
library does the same job as widely used non-free libraries. In this |
|||
case, there is little to gain by limiting the free library to free |
|||
software only, so we use the Lesser General Public License. |
|||
|
|||
In other cases, permission to use a particular library in non-free |
|||
programs enables a greater number of people to use a large body of |
|||
free software. For example, permission to use the GNU C Library in |
|||
non-free programs enables many more people to use the whole GNU |
|||
operating system, as well as its variant, the GNU/Linux operating |
|||
system. |
|||
|
|||
Although the Lesser General Public License is Less protective of the |
|||
users' freedom, it does ensure that the user of a program that is |
|||
linked with the Library has the freedom and the wherewithal to run |
|||
that program using a modified version of the Library. |
|||
|
|||
The precise terms and conditions for copying, distribution and |
|||
modification follow. Pay close attention to the difference between a |
|||
"work based on the library" and a "work that uses the library". The |
|||
former contains code derived from the library, whereas the latter must |
|||
be combined with the library in order to run. |
|||
|
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|||
|
|||
0. This License Agreement applies to any software library or other |
|||
program which contains a notice placed by the copyright holder or |
|||
other authorized party saying it may be distributed under the terms of |
|||
this Lesser General Public License (also called "this License"). |
|||
Each licensee is addressed as "you". |
|||
|
|||
A "library" means a collection of software functions and/or data |
|||
prepared so as to be conveniently linked with application programs |
|||
(which use some of those functions and data) to form executables. |
|||
|
|||
The "Library", below, refers to any such software library or work |
|||
which has been distributed under these terms. A "work based on the |
|||
Library" means either the Library or any derivative work under |
|||
copyright law: that is to say, a work containing the Library or a |
|||
portion of it, either verbatim or with modifications and/or translated |
|||
straightforwardly into another language. (Hereinafter, translation is |
|||
included without limitation in the term "modification".) |
|||
|
|||
"Source code" for a work means the preferred form of the work for |
|||
making modifications to it. For a library, complete source code means |
|||
all the source code for all modules it contains, plus any associated |
|||
interface definition files, plus the scripts used to control compilation |
|||
and installation of the library. |
|||
|
|||
Activities other than copying, distribution and modification are not |
|||
covered by this License; they are outside its scope. The act of |
|||
running a program using the Library is not restricted, and output from |
|||
such a program is covered only if its contents constitute a work based |
|||
on the Library (independent of the use of the Library in a tool for |
|||
writing it). Whether that is true depends on what the Library does |
|||
and what the program that uses the Library does. |
|||
|
|||
1. You may copy and distribute verbatim copies of the Library's |
|||
complete source code as you receive it, in any medium, provided that |
|||
you conspicuously and appropriately publish on each copy an |
|||
appropriate copyright notice and disclaimer of warranty; keep intact |
|||
all the notices that refer to this License and to the absence of any |
|||
warranty; and distribute a copy of this License along with the |
|||
Library. |
|||
|
|||
You may charge a fee for the physical act of transferring a copy, |
|||
and you may at your option offer warranty protection in exchange for a |
|||
fee. |
|||
|
|||
2. You may modify your copy or copies of the Library or any portion |
|||
of it, thus forming a work based on the Library, and copy and |
|||
distribute such modifications or work under the terms of Section 1 |
|||
above, provided that you also meet all of these conditions: |
|||
|
|||
a) The modified work must itself be a software library. |
|||
|
|||
b) You must cause the files modified to carry prominent notices |
|||
stating that you changed the files and the date of any change. |
|||
|
|||
c) You must cause the whole of the work to be licensed at no |
|||
charge to all third parties under the terms of this License. |
|||
|
|||
d) If a facility in the modified Library refers to a function or a |
|||
table of data to be supplied by an application program that uses |
|||
the facility, other than as an argument passed when the facility |
|||
is invoked, then you must make a good faith effort to ensure that, |
|||
in the event an application does not supply such function or |
|||
table, the facility still operates, and performs whatever part of |
|||
its purpose remains meaningful. |
|||
|
|||
(For example, a function in a library to compute square roots has |
|||
a purpose that is entirely well-defined independent of the |
|||
application. Therefore, Subsection 2d requires that any |
|||
application-supplied function or table used by this function must |
|||
be optional: if the application does not supply it, the square |
|||
root function must still compute square roots.) |
|||
|
|||
These requirements apply to the modified work as a whole. If |
|||
identifiable sections of that work are not derived from the Library, |
|||
and can be reasonably considered independent and separate works in |
|||
themselves, then this License, and its terms, do not apply to those |
|||
sections when you distribute them as separate works. But when you |
|||
distribute the same sections as part of a whole which is a work based |
|||
on the Library, the distribution of the whole must be on the terms of |
|||
this License, whose permissions for other licensees extend to the |
|||
entire whole, and thus to each and every part regardless of who wrote |
|||
it. |
|||
|
|||
Thus, it is not the intent of this section to claim rights or contest |
|||
your rights to work written entirely by you; rather, the intent is to |
|||
exercise the right to control the distribution of derivative or |
|||
collective works based on the Library. |
|||
|
|||
In addition, mere aggregation of another work not based on the Library |
|||
with the Library (or with a work based on the Library) on a volume of |
|||
a storage or distribution medium does not bring the other work under |
|||
the scope of this License. |
|||
|
|||
3. You may opt to apply the terms of the ordinary GNU General Public |
|||
License instead of this License to a given copy of the Library. To do |
|||
this, you must alter all the notices that refer to this License, so |
|||
that they refer to the ordinary GNU General Public License, version 2, |
|||
instead of to this License. (If a newer version than version 2 of the |
|||
ordinary GNU General Public License has appeared, then you can specify |
|||
that version instead if you wish.) Do not make any other change in |
|||
these notices. |
|||
|
|||
Once this change is made in a given copy, it is irreversible for |
|||
that copy, so the ordinary GNU General Public License applies to all |
|||
subsequent copies and derivative works made from that copy. |
|||
|
|||
This option is useful when you wish to copy part of the code of |
|||
the Library into a program that is not a library. |
|||
|
|||
4. You may copy and distribute the Library (or a portion or |
|||
derivative of it, under Section 2) in object code or executable form |
|||
under the terms of Sections 1 and 2 above provided that you accompany |
|||
it with the complete corresponding machine-readable source code, which |
|||
must be distributed under the terms of Sections 1 and 2 above on a |
|||
medium customarily used for software interchange. |
|||
|
|||
If distribution of object code is made by offering access to copy |
|||
from a designated place, then offering equivalent access to copy the |
|||
source code from the same place satisfies the requirement to |
|||
distribute the source code, even though third parties are not |
|||
compelled to copy the source along with the object code. |
|||
|
|||
5. A program that contains no derivative of any portion of the |
|||
Library, but is designed to work with the Library by being compiled or |
|||
linked with it, is called a "work that uses the Library". Such a |
|||
work, in isolation, is not a derivative work of the Library, and |
|||
therefore falls outside the scope of this License. |
|||
|
|||
However, linking a "work that uses the Library" with the Library |
|||
creates an executable that is a derivative of the Library (because it |
|||
contains portions of the Library), rather than a "work that uses the |
|||
library". The executable is therefore covered by this License. |
|||
Section 6 states terms for distribution of such executables. |
|||
|
|||
When a "work that uses the Library" uses material from a header file |
|||
that is part of the Library, the object code for the work may be a |
|||
derivative work of the Library even though the source code is not. |
|||
Whether this is true is especially significant if the work can be |
|||
linked without the Library, or if the work is itself a library. The |
|||
threshold for this to be true is not precisely defined by law. |
|||
|
|||
If such an object file uses only numerical parameters, data |
|||
structure layouts and accessors, and small macros and small inline |
|||
functions (ten lines or less in length), then the use of the object |
|||
file is unrestricted, regardless of whether it is legally a derivative |
|||
work. (Executables containing this object code plus portions of the |
|||
Library will still fall under Section 6.) |
|||
|
|||
Otherwise, if the work is a derivative of the Library, you may |
|||
distribute the object code for the work under the terms of Section 6. |
|||
Any executables containing that work also fall under Section 6, |
|||
whether or not they are linked directly with the Library itself. |
|||
|
|||
6. As an exception to the Sections above, you may also combine or |
|||
link a "work that uses the Library" with the Library to produce a |
|||
work containing portions of the Library, and distribute that work |
|||
under terms of your choice, provided that the terms permit |
|||
modification of the work for the customer's own use and reverse |
|||
engineering for debugging such modifications. |
|||
|
|||
You must give prominent notice with each copy of the work that the |
|||
Library is used in it and that the Library and its use are covered by |
|||
this License. You must supply a copy of this License. If the work |
|||
during execution displays copyright notices, you must include the |
|||
copyright notice for the Library among them, as well as a reference |
|||
directing the user to the copy of this License. Also, you must do one |
|||
of these things: |
|||
|
|||
a) Accompany the work with the complete corresponding |
|||
machine-readable source code for the Library including whatever |
|||
changes were used in the work (which must be distributed under |
|||
Sections 1 and 2 above); and, if the work is an executable linked |
|||
with the Library, with the complete machine-readable "work that |
|||
uses the Library", as object code and/or source code, so that the |
|||
user can modify the Library and then relink to produce a modified |
|||
executable containing the modified Library. (It is understood |
|||
that the user who changes the contents of definitions files in the |
|||
Library will not necessarily be able to recompile the application |
|||
to use the modified definitions.) |
|||
|
|||
b) Use a suitable shared library mechanism for linking with the |
|||
Library. A suitable mechanism is one that (1) uses at run time a |
|||
copy of the library already present on the user's computer system, |
|||
rather than copying library functions into the executable, and (2) |
|||
will operate properly with a modified version of the library, if |
|||
the user installs one, as long as the modified version is |
|||
interface-compatible with the version that the work was made with. |
|||
|
|||
c) Accompany the work with a written offer, valid for at |
|||
least three years, to give the same user the materials |
|||
specified in Subsection 6a, above, for a charge no more |
|||
than the cost of performing this distribution. |
|||
|
|||
d) If distribution of the work is made by offering access to copy |
|||
from a designated place, offer equivalent access to copy the above |
|||
specified materials from the same place. |
|||
|
|||
e) Verify that the user has already received a copy of these |
|||
materials or that you have already sent this user a copy. |
|||
|
|||
For an executable, the required form of the "work that uses the |
|||
Library" must include any data and utility programs needed for |
|||
reproducing the executable from it. However, as a special exception, |
|||
the materials to be distributed need not include anything that is |
|||
normally distributed (in either source or binary form) with the major |
|||
components (compiler, kernel, and so on) of the operating system on |
|||
which the executable runs, unless that component itself accompanies |
|||
the executable. |
|||
|
|||
It may happen that this requirement contradicts the license |
|||
restrictions of other proprietary libraries that do not normally |
|||
accompany the operating system. Such a contradiction means you cannot |
|||
use both them and the Library together in an executable that you |
|||
distribute. |
|||
|
|||
7. You may place library facilities that are a work based on the |
|||
Library side-by-side in a single library together with other library |
|||
facilities not covered by this License, and distribute such a combined |
|||
library, provided that the separate distribution of the work based on |
|||
the Library and of the other library facilities is otherwise |
|||
permitted, and provided that you do these two things: |
|||
|
|||
a) Accompany the combined library with a copy of the same work |
|||
based on the Library, uncombined with any other library |
|||
facilities. This must be distributed under the terms of the |
|||
Sections above. |
|||
|
|||
b) Give prominent notice with the combined library of the fact |
|||
that part of it is a work based on the Library, and explaining |
|||
where to find the accompanying uncombined form of the same work. |
|||
|
|||
8. You may not copy, modify, sublicense, link with, or distribute |
|||
the Library except as expressly provided under this License. Any |
|||
attempt otherwise to copy, modify, sublicense, link with, or |
|||
distribute the Library is void, and will automatically terminate your |
|||
rights under this License. However, parties who have received copies, |
|||
or rights, from you under this License will not have their licenses |
|||
terminated so long as such parties remain in full compliance. |
|||
|
|||
9. You are not required to accept this License, since you have not |
|||
signed it. However, nothing else grants you permission to modify or |
|||
distribute the Library or its derivative works. These actions are |
|||
prohibited by law if you do not accept this License. Therefore, by |
|||
modifying or distributing the Library (or any work based on the |
|||
Library), you indicate your acceptance of this License to do so, and |
|||
all its terms and conditions for copying, distributing or modifying |
|||
the Library or works based on it. |
|||
|
|||
10. Each time you redistribute the Library (or any work based on the |
|||
Library), the recipient automatically receives a license from the |
|||
original licensor to copy, distribute, link with or modify the Library |
|||
subject to these terms and conditions. You may not impose any further |
|||
restrictions on the recipients' exercise of the rights granted herein. |
|||
You are not responsible for enforcing compliance by third parties with |
|||
this License. |
|||
|
|||
11. If, as a consequence of a court judgment or allegation of patent |
|||
infringement or for any other reason (not limited to patent issues), |
|||
conditions are imposed on you (whether by court order, agreement or |
|||
otherwise) that contradict the conditions of this License, they do not |
|||
excuse you from the conditions of this License. If you cannot |
|||
distribute so as to satisfy simultaneously your obligations under this |
|||
License and any other pertinent obligations, then as a consequence you |
|||
may not distribute the Library at all. For example, if a patent |
|||
license would not permit royalty-free redistribution of the Library by |
|||
all those who receive copies directly or indirectly through you, then |
|||
the only way you could satisfy both it and this License would be to |
|||
refrain entirely from distribution of the Library. |
|||
|
|||
If any portion of this section is held invalid or unenforceable under any |
|||
particular circumstance, the balance of the section is intended to apply, |
|||
and the section as a whole is intended to apply in other circumstances. |
|||
|
|||
It is not the purpose of this section to induce you to infringe any |
|||
patents or other property right claims or to contest validity of any |
|||
such claims; this section has the sole purpose of protecting the |
|||
integrity of the free software distribution system which is |
|||
implemented by public license practices. Many people have made |
|||
generous contributions to the wide range of software distributed |
|||
through that system in reliance on consistent application of that |
|||
system; it is up to the author/donor to decide if he or she is willing |
|||
to distribute software through any other system and a licensee cannot |
|||
impose that choice. |
|||
|
|||
This section is intended to make thoroughly clear what is believed to |
|||
be a consequence of the rest of this License. |
|||
|
|||
12. If the distribution and/or use of the Library is restricted in |
|||
certain countries either by patents or by copyrighted interfaces, the |
|||
original copyright holder who places the Library under this License may add |
|||
an explicit geographical distribution limitation excluding those countries, |
|||
so that distribution is permitted only in or among countries not thus |
|||
excluded. In such case, this License incorporates the limitation as if |
|||
written in the body of this License. |
|||
|
|||
13. The Free Software Foundation may publish revised and/or new |
|||
versions of the Lesser General Public License from time to time. |
|||
Such new versions will be similar in spirit to the present version, |
|||
but may differ in detail to address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the Library |
|||
specifies a version number of this License which applies to it and |
|||
"any later version", you have the option of following the terms and |
|||
conditions either of that version or of any later version published by |
|||
the Free Software Foundation. If the Library does not specify a |
|||
license version number, you may choose any version ever published by |
|||
the Free Software Foundation. |
|||
|
|||
14. If you wish to incorporate parts of the Library into other free |
|||
programs whose distribution conditions are incompatible with these, |
|||
write to the author to ask for permission. For software which is |
|||
copyrighted by the Free Software Foundation, write to the Free |
|||
Software Foundation; we sometimes make exceptions for this. Our |
|||
decision will be guided by the two goals of preserving the free status |
|||
of all derivatives of our free software and of promoting the sharing |
|||
and reuse of software generally. |
|||
|
|||
NO WARRANTY |
|||
|
|||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO |
|||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. |
|||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR |
|||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY |
|||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE |
|||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE |
|||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME |
|||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
|||
|
|||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN |
|||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY |
|||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU |
|||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR |
|||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE |
|||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING |
|||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A |
|||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF |
|||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
|||
DAMAGES. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
How to Apply These Terms to Your New Libraries |
|||
|
|||
If you develop a new library, and you want it to be of the greatest |
|||
possible use to the public, we recommend making it free software that |
|||
everyone can redistribute and change. You can do so by permitting |
|||
redistribution under these terms (or, alternatively, under the terms of the |
|||
ordinary General Public License). |
|||
|
|||
To apply these terms, attach the following notices to the library. It is |
|||
safest to attach them to the start of each source file to most effectively |
|||
convey the exclusion of warranty; and each file should have at least the |
|||
"copyright" line and a pointer to where the full notice is found. |
|||
|
|||
<one line to give the library's name and a brief idea of what it does.> |
|||
Copyright (C) <year> <name of author> |
|||
|
|||
This library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
This library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with this library; if not, write to the Free Software |
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
|
|||
Also add information on how to contact you by electronic and paper mail. |
|||
|
|||
You should also get your employer (if you work as a programmer) or your |
|||
school, if any, to sign a "copyright disclaimer" for the library, if |
|||
necessary. Here is a sample; alter the names: |
|||
|
|||
Yoyodyne, Inc., hereby disclaims all copyright interest in the |
|||
library `Frob' (a library for tweaking knobs) written by James Random Hacker. |
|||
|
|||
<signature of Ty Coon>, 1 April 1990 |
|||
Ty Coon, President of Vice |
|||
|
|||
That's all there is to it! |
|||
|
|||
|
File diff suppressed because it is too large
@ -1,451 +0,0 @@ |
|||
========================================= |
|||
PTHREADS-WIN32 Frequently Asked Questions |
|||
========================================= |
|||
|
|||
INDEX |
|||
----- |
|||
|
|||
Q 1 What is it? |
|||
|
|||
Q 2 Which of the several dll versions do I use? |
|||
or, |
|||
What are all these pthread*.dll and pthread*.lib files? |
|||
|
|||
Q 3 What is the library naming convention? |
|||
|
|||
Q 4 Cleanup code default style or: it used to work when I built |
|||
the library myself, but now it doesn't - why? |
|||
|
|||
Q 5 Why is the default library version now less exception-friendly? |
|||
|
|||
Q 6 Should I use Cygwin or Mingw32 as a development environment? |
|||
|
|||
Q 7 Now that pthreads-win32 builds under Mingw32, why do I get |
|||
memory access violations (segfaults)? |
|||
|
|||
Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) |
|||
|
|||
Q 9 Cancelation doesn't work for me, why? |
|||
|
|||
Q 10 How do I generate pthreadGCE.dll and libpthreadw32.a for use |
|||
with Mingw32? |
|||
|
|||
Q 11 Why isn't pthread_t defined as a scalar (e.g. pointer or int) |
|||
like it is for other POSIX threads implementations? |
|||
|
|||
============================================================================= |
|||
|
|||
Q 1 What is it? |
|||
--- |
|||
|
|||
Pthreads-win32 is an Open Source Software implementation of the |
|||
Threads component of the POSIX 1003.1c 1995 Standard for Microsoft's |
|||
Win32 environment. Some functions from POSIX 1003.1b are also |
|||
supported including semaphores. Other related functions include |
|||
the set of read-write lock functions. The library also supports |
|||
some of the functionality of the Open Group's Single Unix |
|||
specification, version 2, namely mutex types. |
|||
|
|||
See the file "ANNOUNCE" for more information including standards |
|||
conformance details and list of supported routines. |
|||
|
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 2 Which of the several dll versions do I use? |
|||
--- or, |
|||
What are all these pthread*.dll and pthread*.lib files? |
|||
|
|||
Simply, you only use one of them, but you need to choose carefully. |
|||
|
|||
The most important choice you need to make is whether to use a |
|||
version that uses exceptions internally, or not (there are versions |
|||
of the library that use exceptions as part of the thread |
|||
cancelation and cleanup implementation, and one that uses |
|||
setjmp/longjmp instead). |
|||
|
|||
There is some contension amongst POSIX threads experts as |
|||
to how POSIX threads cancelation and exit should work |
|||
with languages that include exceptions and handlers, e.g. |
|||
C++ and even C (Microsoft's Structured Exceptions). |
|||
|
|||
The issue is: should cancelation of a thread in, say, |
|||
a C++ application cause object destructors and C++ exception |
|||
handlers to be invoked as the stack unwinds during thread |
|||
exit, or not? |
|||
|
|||
There seems to be more opinion in favour of using the |
|||
standard C version of the library (no EH) with C++ applications |
|||
since this appears to be the assumption commercial pthreads |
|||
implementations make. Therefore, if you use an EH version |
|||
of pthreads-win32 then you may be under the illusion that |
|||
your application will be portable, when in fact it is likely to |
|||
behave very differently linked with other pthreads libraries. |
|||
|
|||
Now you may be asking: why have you kept the EH versions of |
|||
the library? |
|||
|
|||
There are a couple of reasons: |
|||
- there is division amongst the experts and so the code may |
|||
be needed in the future. (Yes, it's in the repository and we |
|||
can get it out anytime in the future, but ...) |
|||
- pthreads-win32 is one of the few implementations, and possibly |
|||
the only freely available one, that has EH versions. It may be |
|||
useful to people who want to play with or study application |
|||
behaviour under these conditions. |
|||
|
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 3 What is the library naming convention? |
|||
--- |
|||
|
|||
Because the library is being built using various exception |
|||
handling schemes and compilers - and because the library |
|||
may not work reliably if these are mixed in an application, |
|||
each different version of the library has it's own name. |
|||
|
|||
Note 1: the incompatibility is really between EH implementations |
|||
of the different compilers. It should be possible to use the |
|||
standard C version from either compiler with C++ applications |
|||
built with a different compiler. If you use an EH version of |
|||
the library, then you must use the same compiler for the |
|||
application. This is another complication and dependency that |
|||
can be avoided by using only the standard C library version. |
|||
|
|||
Note 2: if you use a standard C pthread*.dll with a C++ |
|||
application, then any functions that you define that are |
|||
intended to be called via pthread_cleanup_push() must be |
|||
__cdecl. |
|||
|
|||
Note 3: the intention is to also name either the VC or GC |
|||
version (it should be arbitrary) as pthread.dll, including |
|||
pthread.lib and libpthread.a as appropriate. |
|||
|
|||
In general: |
|||
pthread[VG]{SE,CE,C}.dll |
|||
pthread[VG]{SE,CE,C}.lib |
|||
|
|||
where: |
|||
[VG] indicates the compiler |
|||
V - MS VC |
|||
G - GNU C |
|||
|
|||
{SE,CE,C} indicates the exception handling scheme |
|||
SE - Structured EH |
|||
CE - C++ EH |
|||
C - no exceptions - uses setjmp/longjmp |
|||
|
|||
For example: |
|||
pthreadVSE.dll (MSVC/SEH) |
|||
pthreadGCE.dll (GNUC/C++ EH) |
|||
pthreadGC.dll (GNUC/not dependent on exceptions) |
|||
|
|||
The GNU library archive file names have changed to: |
|||
|
|||
libpthreadGCE.a |
|||
libpthreadGC.a |
|||
|
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 4 Cleanup code default style or: it used to work when I built |
|||
--- the library myself, but now it doesn't - why? |
|||
|
|||
Up to and including snapshot 2001-07-12, if not defined, the cleanup |
|||
style was determined automatically from the compiler used, and one |
|||
of the following was defined accordingly: |
|||
|
|||
__CLEANUP_SEH MSVC only |
|||
__CLEANUP_CXX C++, including MSVC++, GNU G++ |
|||
__CLEANUP_C C, including GNU GCC, not MSVC |
|||
|
|||
These defines determine the style of cleanup (see pthread.h) and, |
|||
most importantly, the way that cancelation and thread exit (via |
|||
pthread_exit) is performed (see the routine ptw32_throw() in private.c). |
|||
|
|||
In short, the exceptions versions of the library throw an exception |
|||
when a thread is canceled or exits (via pthread_exit()), which is |
|||
caught by a handler in the thread startup routine, so that the |
|||
the correct stack unwinding occurs regardless of where the thread |
|||
is when it's canceled or exits via pthread_exit(). |
|||
|
|||
After snapshot 2001-07-12, unless your build explicitly defines (e.g. |
|||
via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then |
|||
the build now ALWAYS defaults to __CLEANUP_C style cleanup. This style |
|||
uses setjmp/longjmp in the cancelation and pthread_exit implementations, |
|||
and therefore won't do stack unwinding even when linked to applications |
|||
that have it (e.g. C++ apps). This is for consistency with most/all |
|||
commercial Unix POSIX threads implementations. |
|||
|
|||
Although it was not clearly documented before, it is still necessary to |
|||
build your application using the same __CLEANUP_* define as was |
|||
used for the version of the library that you link with, so that the |
|||
correct parts of pthread.h are included. That is, the possible |
|||
defines require the following library versions: |
|||
|
|||
__CLEANUP_SEH pthreadVSE.dll |
|||
__CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll |
|||
__CLEANUP_C pthreadVC.dll or pthreadGC.dll |
|||
|
|||
THE POINT OF ALL THIS IS: if you have not been defining one of these |
|||
explicitly, then the defaults have been set according to the compiler |
|||
and language you are using, as described at the top of this |
|||
section. |
|||
|
|||
THIS NOW CHANGES, as has been explained above. For example: |
|||
|
|||
If you were building your application with MSVC++ i.e. using C++ |
|||
exceptions (rather than SEH) and not explicitly defining one of |
|||
__CLEANUP_*, then __CLEANUP_C++ was defined for you in pthread.h. |
|||
You should have been linking with pthreadVCE.dll, which does |
|||
stack unwinding. |
|||
|
|||
If you now build your application as you had before, pthread.h will now |
|||
set __CLEANUP_C as the default style, and you will need to link |
|||
with pthreadVC.dll. Stack unwinding will now NOT occur when a |
|||
thread is canceled, nor when the thread calls pthread_exit(). |
|||
|
|||
Your application will now most likely behave differently to previous |
|||
versions, and in non-obvious ways. Most likely is that local |
|||
objects may not be destroyed or cleaned up after a thread |
|||
is canceled. |
|||
|
|||
If you want the same behaviour as before, then you must now define |
|||
__CLEANUP_C++ explicitly using a compiler option and link with |
|||
pthreadVCE.dll as you did before. |
|||
|
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 5 Why is the default library version now less exception-friendly? |
|||
--- |
|||
|
|||
Because most commercial Unix POSIX threads implementations don't allow you to |
|||
choose to have stack unwinding. (Compaq's TRU64 Unix is possibly an exception.) |
|||
|
|||
Therefore, providing it in pthread-win32 as a default could be dangerous |
|||
and non-portable. We still provide the choice but you must now consciously |
|||
make it. |
|||
|
|||
WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER? |
|||
There are a few reasons: |
|||
- because there are well respected POSIX threads people who believe |
|||
that POSIX threads implementations should be exceptions-aware and |
|||
do the expected thing in that context. (There are equally respected |
|||
people who believe it should not be easily accessible, if it's there |
|||
at all.) |
|||
- because pthreads-win32 is one of the few implementations that has |
|||
the choice, perhaps the only freely available one, and so offers |
|||
a laboratory to people who may want to explore the effects; |
|||
- although the code will always be around somewhere for anyone who |
|||
wants it, once it's removed from the current version it will not be |
|||
nearly as visible to people who may have a use for it. |
|||
|
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 6 Should I use Cygwin or Mingw32 as a development environment? |
|||
--- |
|||
|
|||
Important: see Q7 also. |
|||
|
|||
Use Mingw32 with the MSVCRT library to build applications that use |
|||
the pthreads DLL. |
|||
|
|||
Cygwin's own internal support for POSIX threads is growing. |
|||
Consult that project's documentation for more information. |
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 7 Now that pthreads-win32 builds under Mingw32, why do I get |
|||
--- memory access violations (segfaults)? |
|||
|
|||
The latest Mingw32 package has thread-safe exception handling (see Q10). |
|||
Also, see Q6 above. |
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) |
|||
--- |
|||
|
|||
> |
|||
> I'm a "rookie" when it comes to your pthread implementation. I'm currently |
|||
> desperately trying to install the prebuilt .dll file into my MSVC compiler. |
|||
> Could you please provide me with explicit instructions on how to do this (or |
|||
> direct me to a resource(s) where I can acquire such information)? |
|||
> |
|||
> Thank you, |
|||
> |
|||
|
|||
You should have a .dll, .lib, .def, and three .h files. It is recommended |
|||
that you use pthreadVC.dll, rather than pthreadVCE.dll or pthreadVSE.dll |
|||
(see Q2 above). |
|||
|
|||
The .dll can go in any directory listed in your PATH environment |
|||
variable, so putting it into C:\WINDOWS should work. |
|||
|
|||
The .lib file can go in any directory listed in your LIB environment |
|||
variable. |
|||
|
|||
The .h files can go in any directory listed in your INCLUDE |
|||
environment variable. |
|||
|
|||
Or you might prefer to put the .lib and .h files into a new directory |
|||
and add its path to LIB and INCLUDE. You can probably do this easiest |
|||
by editing the file:- |
|||
|
|||
C:\Program Files\DevStudio\vc\bin\vcvars32.bat |
|||
|
|||
The .def file isn't used by anything in the pre-compiled version but |
|||
is included for information. |
|||
|
|||
Cheers. |
|||
Ross |
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 9 Cancelation doesn't work for me, why? |
|||
--- |
|||
|
|||
> I'm investigating a problem regarding thread cancelation. The thread I want |
|||
> to cancel has PTHREAD_CANCEL_ASYNCHRONOUS, however, this piece of code |
|||
> blocks on the join(): |
|||
> |
|||
> if ((retv = Pthread_cancel( recvThread )) == 0) |
|||
> { |
|||
> retv = Pthread_join( recvThread, 0 ); |
|||
> } |
|||
> |
|||
> Pthread_* are just macro's; they call pthread_*. |
|||
> |
|||
> The thread recvThread seems to block on a select() call. It doesn't get |
|||
> cancelled. |
|||
> |
|||
> Two questions: |
|||
> |
|||
> 1) is this normal behaviour? |
|||
> |
|||
> 2) if not, how does the cancel mechanism work? I'm not very familliar to |
|||
> win32 programming, so I don't really understand how the *Event() family of |
|||
> calls work. |
|||
|
|||
The answer to your first question is, normal POSIX behaviour would |
|||
be to asynchronously cancel the thread. However, even that doesn't |
|||
guarantee cancelation as the standard only says it should be |
|||
cancelled as soon as possible. |
|||
|
|||
Snapshot 99-11-02 or earlier only partially supports asynchronous cancellation. |
|||
Snapshots since then simulate async cancelation by poking the address of |
|||
a cancelation routine into the PC of the threads context. This requires |
|||
the thread to be resumed in some way for the cancelation to actually |
|||
proceed. This is not true async cancelation, but it is as close as we've |
|||
been able to get to it. |
|||
|
|||
If the thread you're trying to cancel is blocked (for instance, it could be |
|||
waiting for data from the network), it will only get cancelled when it unblocks |
|||
(when the data arrives). For true pre-emptive cancelation in these cases, |
|||
pthreads-win32 from snapshot 2004-05-16 can automatically recognise and use the |
|||
QueueUserAPCEx package by Panagiotis E. Hadjidoukas. This package is available |
|||
from the pthreads-win32 ftp site and is included in the pthreads-win32 |
|||
self-unpacking zip from 2004-05-16 onwards. |
|||
|
|||
Using deferred cancelation would normally be the way to go, however, |
|||
even though the POSIX threads standard lists a number of C library |
|||
functions that are defined as deferred cancelation points, there is |
|||
no hookup between those which are provided by Windows and the |
|||
pthreads-win32 library. |
|||
|
|||
Incidently, it's worth noting for code portability that the older POSIX |
|||
threads standards cancelation point lists didn't include "select" because |
|||
(as I read in Butenhof) it wasn't part of POSIX. However, it does appear in |
|||
the SUSV3. |
|||
|
|||
Effectively, the only mandatory cancelation points that pthreads-win32 |
|||
recognises are those the library implements itself, ie. |
|||
|
|||
pthread_testcancel |
|||
pthread_cond_wait |
|||
pthread_cond_timedwait |
|||
pthread_join |
|||
sem_wait |
|||
sem_timedwait |
|||
pthread_delay_np |
|||
|
|||
The following routines from the non-mandatory list in SUSV3 are |
|||
cancelation points in pthreads-win32: |
|||
|
|||
pthread_rwlock_wrlock |
|||
pthread_rwlock_timedwrlock |
|||
|
|||
The following routines from the non-mandatory list in SUSV3 are not |
|||
cancelation points in pthreads-win32: |
|||
|
|||
pthread_rwlock_rdlock |
|||
pthread_rwlock_timedrdlock |
|||
|
|||
Pthreads-win32 also provides two functions that allow you to create |
|||
cancelation points within your application, but only for cases where |
|||
a thread is going to block on a Win32 handle. These are: |
|||
|
|||
pthreadCancelableWait(HANDLE waitHandle) /* Infinite wait */ |
|||
|
|||
pthreadCancelableTimedWait(HANDLE waitHandle, DWORD timeout) |
|||
|
|||
------------------------------------------------------------------------------ |
|||
|
|||
|
|||
Q 10 How do I create thread-safe applications using |
|||
---- pthreadGCE.dll, libpthreadw32.a and Mingw32? |
|||
|
|||
This should not be a problem with recent versions of MinGW32. |
|||
|
|||
For early versions, see Thomas Pfaff's email at: |
|||
http://sources.redhat.com/ml/pthreads-win32/2002/msg00000.html |
|||
------------------------------------------------------------------------------ |
|||
|
|||
Q 11 Why isn't pthread_t defined as a scalar (e.g. pointer or int) |
|||
like it is for other POSIX threads implementations? |
|||
---- |
|||
|
|||
Originally pthread_t was defined as a pointer (to the opaque pthread_t_ |
|||
struct) and later it was changed to a struct containing the original |
|||
pointer plus a sequence counter. This is allowed under both the original |
|||
POSIX Threads Standard and the current Single Unix Specification. |
|||
|
|||
When pthread_t is a simple pointer to a struct some very difficult to |
|||
debug problems arise from the process of freeing and later allocing |
|||
thread structs because new pthread_t handles can acquire the identity of |
|||
previously detached threads. The change to a struct was made, along with |
|||
some changes to their internal managment, in order to guarantee (for |
|||
practical applications) that the pthread_t handle will be unique over the |
|||
life of the running process. |
|||
|
|||
Where application code attempts to compare one pthread_t against another |
|||
directly, a compiler error will be emitted because structs can't be |
|||
compared at that level. This should signal a potentially serious problem |
|||
in the code design, which would go undetected if pthread_t was a scalar. |
|||
|
|||
The POSIX Threading API provides a function named pthread_equal() to |
|||
compare pthread_t thread handles. |
|||
|
|||
Other pthreads implementations, such as Sun's, use an int as the handle |
|||
but do guarantee uniqueness within the process scope. Win32 scalar typed |
|||
thread handles also guarantee uniqueness in system scope. It wasn't clear |
|||
how well the internal management of these handles would scale as the |
|||
number of threads and the fragmentation of the sequence numbering |
|||
increased for applications where thousands or millions of threads are |
|||
created and detached over time. The current management of threads within |
|||
pthreads-win32 using structs for pthread_t, and reusing without ever |
|||
freeing them, reduces the management time overheads to a constant, which |
|||
could be important given that pthreads-win32 threads are built on top of |
|||
Win32 threads and will therefore include that management overhead on top |
|||
of their own. The cost is that the memory resources used for thread |
|||
handles will remain at the peak level until the process exits. |
|||
|
|||
While it may be inconvenient for developers to be forced away from making |
|||
assumptions about the internals of pthread_t, the advantage for the |
|||
future development of pthread-win32, as well as those applications that |
|||
use it and other pthread implementations, is that the library is free to |
|||
change pthread_t internals and management as better methods arise. |
|||
|
@ -1,593 +0,0 @@ |
|||
#
|
|||
# --------------------------------------------------------------------------
|
|||
#
|
|||
# Pthreads-win32 - POSIX Threads Library for Win32
|
|||
# Copyright(C) 1998 John E. Bossom
|
|||
# Copyright(C) 1999,2005 Pthreads-win32 contributors
|
|||
#
|
|||
# Contact Email: rpj@callisto.canberra.edu.au
|
|||
#
|
|||
# The current list of contributors is contained
|
|||
# in the file CONTRIBUTORS included with the source
|
|||
# code distribution. The list can also be seen at the
|
|||
# following World Wide Web location:
|
|||
# http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
#
|
|||
# This library is free software; you can redistribute it and/or
|
|||
# modify it under the terms of the GNU Lesser General Public
|
|||
# License as published by the Free Software Foundation; either
|
|||
# version 2 of the License, or (at your option) any later version.
|
|||
#
|
|||
# This library is distributed in the hope that it will be useful,
|
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|||
# Lesser General Public License for more details.
|
|||
#
|
|||
# You should have received a copy of the GNU Lesser General Public
|
|||
# License along with this library in the file COPYING.LIB;
|
|||
# if not, write to the Free Software Foundation, Inc.,
|
|||
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|||
#
|
|||
|
|||
DLL_VER = 2 |
|||
DLL_VERD= $(DLL_VER)d |
|||
|
|||
DEVROOT = C:\PTHREADS |
|||
|
|||
DLLDEST = $(DEVROOT)\DLL |
|||
LIBDEST = $(DEVROOT)\DLL |
|||
|
|||
# If Running MsysDTK
|
|||
RM = rm -f |
|||
MV = mv -f |
|||
CP = cp -f |
|||
|
|||
# If not.
|
|||
#RM = erase
|
|||
#MV = rename
|
|||
#CP = copy
|
|||
|
|||
# For cross compiling use e.g.
|
|||
# make CROSS=x86_64-w64-mingw32- clean GC-inlined
|
|||
CROSS = |
|||
|
|||
AR = $(CROSS)ar |
|||
DLLTOOL = $(CROSS)dlltool |
|||
CC = $(CROSS)gcc |
|||
CXX = $(CROSS)g++ |
|||
RANLIB = $(CROSS)ranlib |
|||
RC = $(CROSS)windres |
|||
|
|||
OPT = $(CLEANUP) -O3 # -finline-functions -findirect-inlining |
|||
XOPT = |
|||
|
|||
RCFLAGS = --include-dir=. |
|||
# Uncomment this if config.h defines RETAIN_WSALASTERROR
|
|||
#LFLAGS = -lws2_32
|
|||
|
|||
# ----------------------------------------------------------------------
|
|||
# The library can be built with some alternative behaviour to
|
|||
# facilitate development of applications on Win32 that will be ported
|
|||
# to other POSIX systems. Nothing definable here will make the library
|
|||
# non-compliant, but applications that make assumptions that POSIX
|
|||
# does not garrantee may fail or misbehave under some settings.
|
|||
#
|
|||
# PTW32_THREAD_ID_REUSE_INCREMENT
|
|||
# Purpose:
|
|||
# POSIX says that applications should assume that thread IDs can be
|
|||
# recycled. However, Solaris and some other systems use a [very large]
|
|||
# sequence number as the thread ID, which provides virtual uniqueness.
|
|||
# Pthreads-win32 provides pseudo-unique IDs when the default increment
|
|||
# (1) is used, but pthread_t is not a scalar type like Solaris's.
|
|||
#
|
|||
# Usage:
|
|||
# Set to any value in the range: 0 <= value <= 2^wordsize
|
|||
#
|
|||
# Examples:
|
|||
# Set to 0 to emulate non recycle-unique behaviour like Linux or *BSD.
|
|||
# Set to 1 for recycle-unique thread IDs (this is the default).
|
|||
# Set to some other +ve value to emulate smaller word size types
|
|||
# (i.e. will wrap sooner).
|
|||
#
|
|||
#PTW32_FLAGS = "-DPTW32_THREAD_ID_REUSE_INCREMENT=0"
|
|||
#
|
|||
# ----------------------------------------------------------------------
|
|||
|
|||
GC_CFLAGS = $(PTW32_FLAGS) |
|||
GCE_CFLAGS = $(PTW32_FLAGS) -mthreads |
|||
|
|||
## Mingw32
|
|||
MAKE ?= make |
|||
CFLAGS = $(OPT) $(XOPT) -I. -DHAVE_PTW32_CONFIG_H -Wall |
|||
|
|||
DLL_INLINED_OBJS = \
|
|||
pthread.o \
|
|||
version.o |
|||
|
|||
# Agregate modules for inlinability
|
|||
DLL_OBJS = \
|
|||
attr.o \
|
|||
barrier.o \
|
|||
cancel.o \
|
|||
cleanup.o \
|
|||
condvar.o \
|
|||
create.o \
|
|||
dll.o \
|
|||
errno.o \
|
|||
exit.o \
|
|||
fork.o \
|
|||
global.o \
|
|||
misc.o \
|
|||
mutex.o \
|
|||
nonportable.o \
|
|||
private.o \
|
|||
rwlock.o \
|
|||
sched.o \
|
|||
semaphore.o \
|
|||
signal.o \
|
|||
spin.o \
|
|||
sync.o \
|
|||
tsd.o \
|
|||
version.o |
|||
|
|||
# Separate modules for minimum size statically linked images
|
|||
SMALL_STATIC_OBJS = \
|
|||
pthread_attr_init.o \
|
|||
pthread_attr_destroy.o \
|
|||
pthread_attr_getdetachstate.o \
|
|||
pthread_attr_setdetachstate.o \
|
|||
pthread_attr_getstackaddr.o \
|
|||
pthread_attr_setstackaddr.o \
|
|||
pthread_attr_getstacksize.o \
|
|||
pthread_attr_setstacksize.o \
|
|||
pthread_attr_getscope.o \
|
|||
pthread_attr_setscope.o \
|
|||
pthread_attr_setschedpolicy.o \
|
|||
pthread_attr_getschedpolicy.o \
|
|||
pthread_attr_setschedparam.o \
|
|||
pthread_attr_getschedparam.o \
|
|||
pthread_attr_setinheritsched.o \
|
|||
pthread_attr_getinheritsched.o \
|
|||
pthread_barrier_init.o \
|
|||
pthread_barrier_destroy.o \
|
|||
pthread_barrier_wait.o \
|
|||
pthread_barrierattr_init.o \
|
|||
pthread_barrierattr_destroy.o \
|
|||
pthread_barrierattr_setpshared.o \
|
|||
pthread_barrierattr_getpshared.o \
|
|||
pthread_setcancelstate.o \
|
|||
pthread_setcanceltype.o \
|
|||
pthread_testcancel.o \
|
|||
pthread_cancel.o \
|
|||
cleanup.o \
|
|||
pthread_condattr_destroy.o \
|
|||
pthread_condattr_getpshared.o \
|
|||
pthread_condattr_init.o \
|
|||
pthread_condattr_setpshared.o \
|
|||
pthread_cond_destroy.o \
|
|||
pthread_cond_init.o \
|
|||
pthread_cond_signal.o \
|
|||
pthread_cond_wait.o \
|
|||
create.o \
|
|||
dll.o \
|
|||
autostatic.o \
|
|||
errno.o \
|
|||
pthread_exit.o \
|
|||
fork.o \
|
|||
global.o \
|
|||
pthread_mutex_init.o \
|
|||
pthread_mutex_destroy.o \
|
|||
pthread_mutexattr_init.o \
|
|||
pthread_mutexattr_destroy.o \
|
|||
pthread_mutexattr_getpshared.o \
|
|||
pthread_mutexattr_setpshared.o \
|
|||
pthread_mutexattr_settype.o \
|
|||
pthread_mutexattr_gettype.o \
|
|||
pthread_mutexattr_setrobust.o \
|
|||
pthread_mutexattr_getrobust.o \
|
|||
pthread_mutex_lock.o \
|
|||
pthread_mutex_timedlock.o \
|
|||
pthread_mutex_unlock.o \
|
|||
pthread_mutex_trylock.o \
|
|||
pthread_mutex_consistent.o \
|
|||
pthread_mutexattr_setkind_np.o \
|
|||
pthread_mutexattr_getkind_np.o \
|
|||
pthread_getw32threadhandle_np.o \
|
|||
pthread_getunique_np.o \
|
|||
pthread_delay_np.o \
|
|||
pthread_num_processors_np.o \
|
|||
pthread_win32_attach_detach_np.o \
|
|||
pthread_equal.o \
|
|||
pthread_getconcurrency.o \
|
|||
pthread_once.o \
|
|||
pthread_self.o \
|
|||
pthread_setconcurrency.o \
|
|||
pthread_rwlock_init.o \
|
|||
pthread_rwlock_destroy.o \
|
|||
pthread_rwlockattr_init.o \
|
|||
pthread_rwlockattr_destroy.o \
|
|||
pthread_rwlockattr_getpshared.o \
|
|||
pthread_rwlockattr_setpshared.o \
|
|||
pthread_rwlock_rdlock.o \
|
|||
pthread_rwlock_wrlock.o \
|
|||
pthread_rwlock_unlock.o \
|
|||
pthread_rwlock_tryrdlock.o \
|
|||
pthread_rwlock_trywrlock.o \
|
|||
pthread_setschedparam.o \
|
|||
pthread_getschedparam.o \
|
|||
pthread_timechange_handler_np.o \
|
|||
ptw32_is_attr.o \
|
|||
ptw32_cond_check_need_init.o \
|
|||
ptw32_MCS_lock.o \
|
|||
ptw32_mutex_check_need_init.o \
|
|||
ptw32_processInitialize.o \
|
|||
ptw32_processTerminate.o \
|
|||
ptw32_threadStart.o \
|
|||
ptw32_threadDestroy.o \
|
|||
ptw32_tkAssocCreate.o \
|
|||
ptw32_tkAssocDestroy.o \
|
|||
ptw32_callUserDestroyRoutines.o \
|
|||
ptw32_timespec.o \
|
|||
ptw32_throw.o \
|
|||
ptw32_getprocessors.o \
|
|||
ptw32_calloc.o \
|
|||
ptw32_new.o \
|
|||
ptw32_reuse.o \
|
|||
ptw32_semwait.o \
|
|||
ptw32_relmillisecs.o \
|
|||
ptw32_rwlock_check_need_init.o \
|
|||
sched_get_priority_max.o \
|
|||
sched_get_priority_min.o \
|
|||
sched_setscheduler.o \
|
|||
sched_getscheduler.o \
|
|||
sched_yield.o \
|
|||
sem_init.o \
|
|||
sem_destroy.o \
|
|||
sem_trywait.o \
|
|||
sem_timedwait.o \
|
|||
sem_wait.o \
|
|||
sem_post.o \
|
|||
sem_post_multiple.o \
|
|||
sem_getvalue.o \
|
|||
sem_open.o \
|
|||
sem_close.o \
|
|||
sem_unlink.o \
|
|||
signal.o \
|
|||
pthread_kill.o \
|
|||
ptw32_spinlock_check_need_init.o \
|
|||
pthread_spin_init.o \
|
|||
pthread_spin_destroy.o \
|
|||
pthread_spin_lock.o \
|
|||
pthread_spin_unlock.o \
|
|||
pthread_spin_trylock.o \
|
|||
pthread_detach.o \
|
|||
pthread_join.o \
|
|||
pthread_key_create.o \
|
|||
pthread_key_delete.o \
|
|||
pthread_setspecific.o \
|
|||
pthread_getspecific.o \
|
|||
w32_CancelableWait.o \
|
|||
version.o |
|||
|
|||
INCL = \
|
|||
config.h \
|
|||
implement.h \
|
|||
semaphore.h \
|
|||
pthread.h \
|
|||
need_errno.h |
|||
|
|||
ATTR_SRCS = \
|
|||
pthread_attr_init.c \
|
|||
pthread_attr_destroy.c \
|
|||
pthread_attr_getdetachstate.c \
|
|||
pthread_attr_setdetachstate.c \
|
|||
pthread_attr_getstackaddr.c \
|
|||
pthread_attr_setstackaddr.c \
|
|||
pthread_attr_getstacksize.c \
|
|||
pthread_attr_setstacksize.c \
|
|||
pthread_attr_getscope.c \
|
|||
pthread_attr_setscope.c |
|||
|
|||
BARRIER_SRCS = \
|
|||
pthread_barrier_init.c \
|
|||
pthread_barrier_destroy.c \
|
|||
pthread_barrier_wait.c \
|
|||
pthread_barrierattr_init.c \
|
|||
pthread_barrierattr_destroy.c \
|
|||
pthread_barrierattr_setpshared.c \
|
|||
pthread_barrierattr_getpshared.c |
|||
|
|||
CANCEL_SRCS = \
|
|||
pthread_setcancelstate.c \
|
|||
pthread_setcanceltype.c \
|
|||
pthread_testcancel.c \
|
|||
pthread_cancel.c |
|||
|
|||
CONDVAR_SRCS = \
|
|||
ptw32_cond_check_need_init.c \
|
|||
pthread_condattr_destroy.c \
|
|||
pthread_condattr_getpshared.c \
|
|||
pthread_condattr_init.c \
|
|||
pthread_condattr_setpshared.c \
|
|||
pthread_cond_destroy.c \
|
|||
pthread_cond_init.c \
|
|||
pthread_cond_signal.c \
|
|||
pthread_cond_wait.c |
|||
|
|||
EXIT_SRCS = \
|
|||
pthread_exit.c |
|||
|
|||
MISC_SRCS = \
|
|||
pthread_equal.c \
|
|||
pthread_getconcurrency.c \
|
|||
pthread_kill.c \
|
|||
pthread_once.c \
|
|||
pthread_self.c \
|
|||
pthread_setconcurrency.c \
|
|||
ptw32_calloc.c \
|
|||
ptw32_MCS_lock.c \
|
|||
ptw32_new.c \
|
|||
ptw32_reuse.c \
|
|||
w32_CancelableWait.c |
|||
|
|||
MUTEX_SRCS = \
|
|||
ptw32_mutex_check_need_init.c \
|
|||
pthread_mutex_init.c \
|
|||
pthread_mutex_destroy.c \
|
|||
pthread_mutexattr_init.c \
|
|||
pthread_mutexattr_destroy.c \
|
|||
pthread_mutexattr_getpshared.c \
|
|||
pthread_mutexattr_setpshared.c \
|
|||
pthread_mutexattr_settype.c \
|
|||
pthread_mutexattr_gettype.c \
|
|||
pthread_mutexattr_setrobust.c \
|
|||
pthread_mutexattr_getrobust.c \
|
|||
pthread_mutex_lock.c \
|
|||
pthread_mutex_timedlock.c \
|
|||
pthread_mutex_unlock.c \
|
|||
pthread_mutex_trylock.c \
|
|||
pthread_mutex_consistent.c |
|||
|
|||
NONPORTABLE_SRCS = \
|
|||
pthread_mutexattr_setkind_np.c \
|
|||
pthread_mutexattr_getkind_np.c \
|
|||
pthread_getw32threadhandle_np.c \
|
|||
pthread_getunique_np.c \
|
|||
pthread_delay_np.c \
|
|||
pthread_num_processors_np.c \
|
|||
pthread_win32_attach_detach_np.c \
|
|||
pthread_timechange_handler_np.c |
|||
|
|||
PRIVATE_SRCS = \
|
|||
ptw32_is_attr.c \
|
|||
ptw32_processInitialize.c \
|
|||
ptw32_processTerminate.c \
|
|||
ptw32_threadStart.c \
|
|||
ptw32_threadDestroy.c \
|
|||
ptw32_tkAssocCreate.c \
|
|||
ptw32_tkAssocDestroy.c \
|
|||
ptw32_callUserDestroyRoutines.c \
|
|||
ptw32_semwait.c \
|
|||
ptw32_relmillisecs.c \
|
|||
ptw32_timespec.c \
|
|||
ptw32_throw.c \
|
|||
ptw32_getprocessors.c |
|||
|
|||
RWLOCK_SRCS = \
|
|||
ptw32_rwlock_check_need_init.c \
|
|||
ptw32_rwlock_cancelwrwait.c \
|
|||
pthread_rwlock_init.c \
|
|||
pthread_rwlock_destroy.c \
|
|||
pthread_rwlockattr_init.c \
|
|||
pthread_rwlockattr_destroy.c \
|
|||
pthread_rwlockattr_getpshared.c \
|
|||
pthread_rwlockattr_setpshared.c \
|
|||
pthread_rwlock_rdlock.c \
|
|||
pthread_rwlock_timedrdlock.c \
|
|||
pthread_rwlock_wrlock.c \
|
|||
pthread_rwlock_timedwrlock.c \
|
|||
pthread_rwlock_unlock.c \
|
|||
pthread_rwlock_tryrdlock.c \
|
|||
pthread_rwlock_trywrlock.c |
|||
|
|||
SCHED_SRCS = \
|
|||
pthread_attr_setschedpolicy.c \
|
|||
pthread_attr_getschedpolicy.c \
|
|||
pthread_attr_setschedparam.c \
|
|||
pthread_attr_getschedparam.c \
|
|||
pthread_attr_setinheritsched.c \
|
|||
pthread_attr_getinheritsched.c \
|
|||
pthread_setschedparam.c \
|
|||
pthread_getschedparam.c \
|
|||
sched_get_priority_max.c \
|
|||
sched_get_priority_min.c \
|
|||
sched_setscheduler.c \
|
|||
sched_getscheduler.c \
|
|||
sched_yield.c |
|||
|
|||
SEMAPHORE_SRCS = \
|
|||
sem_init.c \
|
|||
sem_destroy.c \
|
|||
sem_trywait.c \
|
|||
sem_timedwait.c \
|
|||
sem_wait.c \
|
|||
sem_post.c \
|
|||
sem_post_multiple.c \
|
|||
sem_getvalue.c \
|
|||
sem_open.c \
|
|||
sem_close.c \
|
|||
sem_unlink.c |
|||
|
|||
SPIN_SRCS = \
|
|||
ptw32_spinlock_check_need_init.c \
|
|||
pthread_spin_init.c \
|
|||
pthread_spin_destroy.c \
|
|||
pthread_spin_lock.c \
|
|||
pthread_spin_unlock.c \
|
|||
pthread_spin_trylock.c |
|||
|
|||
SYNC_SRCS = \
|
|||
pthread_detach.c \
|
|||
pthread_join.c |
|||
|
|||
TSD_SRCS = \
|
|||
pthread_key_create.c \
|
|||
pthread_key_delete.c \
|
|||
pthread_setspecific.c \
|
|||
pthread_getspecific.c |
|||
|
|||
|
|||
GCE_DLL = pthreadGCE$(DLL_VER).dll |
|||
GCED_DLL= pthreadGCE$(DLL_VERD).dll |
|||
GCE_LIB = libpthreadGCE$(DLL_VER).a |
|||
GCED_LIB= libpthreadGCE$(DLL_VERD).a |
|||
GCE_INLINED_STAMP = pthreadGCE$(DLL_VER).stamp |
|||
GCED_INLINED_STAMP = pthreadGCE$(DLL_VERD).stamp |
|||
GCE_STATIC_STAMP = libpthreadGCE$(DLL_VER).stamp |
|||
GCED_STATIC_STAMP = libpthreadGCE$(DLL_VERD).stamp |
|||
|
|||
GC_DLL = pthreadGC$(DLL_VER).dll |
|||
GCD_DLL = pthreadGC$(DLL_VERD).dll |
|||
GC_LIB = libpthreadGC$(DLL_VER).a |
|||
GCD_LIB = libpthreadGC$(DLL_VERD).a |
|||
GC_INLINED_STAMP = pthreadGC$(DLL_VER).stamp |
|||
GCD_INLINED_STAMP = pthreadGC$(DLL_VERD).stamp |
|||
GC_STATIC_STAMP = libpthreadGC$(DLL_VER).stamp |
|||
GCD_STATIC_STAMP = libpthreadGC$(DLL_VERD).stamp |
|||
|
|||
PTHREAD_DEF = pthread.def |
|||
|
|||
help: |
|||
@ echo "Run one of the following command lines:" |
|||
@ echo "make clean GC (to build the GNU C dll with C cleanup code)" |
|||
@ echo "make clean GCE (to build the GNU C dll with C++ exception handling)" |
|||
@ echo "make clean GC-inlined (to build the GNU C inlined dll with C cleanup code)" |
|||
@ echo "make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling)" |
|||
@ echo "make clean GC-static (to build the GNU C inlined static lib with C cleanup code)" |
|||
@ echo "make clean GC-debug (to build the GNU C debug dll with C cleanup code)" |
|||
@ echo "make clean GCE-debug (to build the GNU C debug dll with C++ exception handling)" |
|||
@ echo "make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code)" |
|||
@ echo "make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling)" |
|||
@ echo "make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code)" |
|||
|
|||
all: |
|||
@ $(MAKE) clean GCE |
|||
@ $(MAKE) clean GC |
|||
|
|||
GC: |
|||
$(MAKE) CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_OBJS)" $(GC_DLL) |
|||
|
|||
GC-debug: |
|||
$(MAKE) CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_OBJS)" DLL_VER=$(DLL_VERD) OPT="-D__CLEANUP_C -g -O0" $(GCD_DLL) |
|||
|
|||
GCE: |
|||
$(MAKE) CC=$(CXX) CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_OBJS)" $(GCE_DLL) |
|||
|
|||
GCE-debug: |
|||
$(MAKE) CC=$(CXX) CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_OBJS)" DLL_VER=$(DLL_VERD) OPT="-D__CLEANUP_CXX -g -O0" $(GCED_DLL) |
|||
|
|||
GC-inlined: |
|||
$(MAKE) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GC_INLINED_STAMP) |
|||
|
|||
GC-inlined-debug: |
|||
$(MAKE) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="-D__CLEANUP_C -g -O0" $(GCD_INLINED_STAMP) |
|||
|
|||
GCE-inlined: |
|||
$(MAKE) CC=$(CXX) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GCE_INLINED_STAMP) |
|||
|
|||
GCE-inlined-debug: |
|||
$(MAKE) CC=$(CXX) XOPT="-DPTW32_BUILD_INLINED" CLEANUP=-D__CLEANUP_CXX XC_FLAGS="$(GCE_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="-D__CLEANUP_CXX -g -O0" $(GCED_INLINED_STAMP) |
|||
|
|||
GC-static: |
|||
$(MAKE) XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" $(GC_STATIC_STAMP) |
|||
|
|||
GC-static-debug: |
|||
$(MAKE) XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS="$(GC_CFLAGS)" OBJ="$(DLL_INLINED_OBJS)" DLL_VER=$(DLL_VERD) OPT="-D__CLEANUP_C -g -O0" $(GCD_STATIC_STAMP) |
|||
|
|||
tests: |
|||
@ cd tests |
|||
@ $(MAKE) auto |
|||
|
|||
%.pre: %.c |
|||
$(CC) -E -o $@ $(CFLAGS) $^ |
|||
|
|||
%.s: %.c |
|||
$(CC) -c $(CFLAGS) -DPTW32_BUILD_INLINED -Wa,-ahl $^ > $@ |
|||
|
|||
%.o: %.rc |
|||
$(RC) $(RCFLAGS) $(CLEANUP) -o $@ $< |
|||
|
|||
.SUFFIXES: .dll .rc .c .o |
|||
|
|||
.c.o:; $(CC) -c -o $@ $(CFLAGS) $(XC_FLAGS) $< |
|||
|
|||
|
|||
$(GC_DLL) $(GCD_DLL): $(DLL_OBJS) |
|||
$(CC) $(OPT) -shared -o $(GC_DLL) $(DLL_OBJS) $(LFLAGS) |
|||
$(DLLTOOL) -z pthread.def $(DLL_OBJS) |
|||
$(DLLTOOL) -k --dllname $@ --output-lib $(GC_LIB) --def $(PTHREAD_DEF) |
|||
|
|||
$(GCE_DLL): $(DLL_OBJS) |
|||
$(CC) $(OPT) -mthreads -shared -o $(GCE_DLL) $(DLL_OBJS) $(LFLAGS) |
|||
$(DLLTOOL) -z pthread.def $(DLL_OBJS) |
|||
$(DLLTOOL) -k --dllname $@ --output-lib $(GCE_LIB) --def $(PTHREAD_DEF) |
|||
|
|||
$(GC_INLINED_STAMP) $(GCD_INLINED_STAMP): $(DLL_INLINED_OBJS) |
|||
$(CC) $(OPT) $(XOPT) -shared -o $(GC_DLL) $(DLL_INLINED_OBJS) $(LFLAGS) |
|||
$(DLLTOOL) -z pthread.def $(DLL_INLINED_OBJS) |
|||
$(DLLTOOL) -k --dllname $(GC_DLL) --output-lib $(GC_LIB) --def $(PTHREAD_DEF) |
|||
echo touched > $(GC_INLINED_STAMP) |
|||
|
|||
$(GCE_INLINED_STAMP) $(GCED_INLINED_STAMP): $(DLL_INLINED_OBJS) |
|||
$(CC) $(OPT) $(XOPT) -mthreads -shared -o $(GCE_DLL) $(DLL_INLINED_OBJS) $(LFLAGS) |
|||
$(DLLTOOL) -z pthread.def $(DLL_INLINED_OBJS) |
|||
$(DLLTOOL) -k --dllname $(GCE_DLL) --output-lib $(GCE_LIB) --def $(PTHREAD_DEF) |
|||
echo touched > $(GCE_INLINED_STAMP) |
|||
|
|||
$(GC_STATIC_STAMP) $(GCD_STATIC_STAMP): $(DLL_INLINED_OBJS) |
|||
$(RM) $(GC_LIB) |
|||
$(AR) -rv $(GC_LIB) $(DLL_INLINED_OBJS) |
|||
$(RANLIB) $(GC_LIB) |
|||
echo touched > $(GC_STATIC_STAMP) |
|||
|
|||
clean: |
|||
-$(RM) *~ |
|||
-$(RM) *.i |
|||
-$(RM) *.s |
|||
-$(RM) *.o |
|||
-$(RM) *.obj |
|||
-$(RM) *.exe |
|||
-$(RM) $(PTHREAD_DEF) |
|||
|
|||
realclean: clean |
|||
-$(RM) $(GC_LIB) |
|||
-$(RM) $(GCE_LIB) |
|||
-$(RM) $(GC_DLL) |
|||
-$(RM) $(GCE_DLL) |
|||
-$(RM) $(GC_INLINED_STAMP) |
|||
-$(RM) $(GCE_INLINED_STAMP) |
|||
-$(RM) $(GC_STATIC_STAMP) |
|||
-$(RM) $(GCD_LIB) |
|||
-$(RM) $(GCED_LIB) |
|||
-$(RM) $(GCD_DLL) |
|||
-$(RM) $(GCED_DLL) |
|||
-$(RM) $(GCD_INLINED_STAMP) |
|||
-$(RM) $(GCED_INLINED_STAMP) |
|||
-$(RM) $(GCD_STATIC_STAMP) |
|||
|
|||
attr.o: attr.c $(ATTR_SRCS) $(INCL) |
|||
barrier.o: barrier.c $(BARRIER_SRCS) $(INCL) |
|||
cancel.o: cancel.c $(CANCEL_SRCS) $(INCL) |
|||
condvar.o: condvar.c $(CONDVAR_SRCS) $(INCL) |
|||
exit.o: exit.c $(EXIT_SRCS) $(INCL) |
|||
misc.o: misc.c $(MISC_SRCS) $(INCL) |
|||
mutex.o: mutex.c $(MUTEX_SRCS) $(INCL) |
|||
nonportable.o: nonportable.c $(NONPORTABLE_SRCS) $(INCL) |
|||
private.o: private.c $(PRIVATE_SRCS) $(INCL) |
|||
rwlock.o: rwlock.c $(RWLOCK_SRCS) $(INCL) |
|||
sched.o: sched.c $(SCHED_SRCS) $(INCL) |
|||
semaphore.o: semaphore.c $(SEMAPHORE_SRCS) $(INCL) |
|||
spin.o: spin.c $(SPIN_SRCS) $(INCL) |
|||
sync.o: sync.c $(SYNC_SRCS) $(INCL) |
|||
tsd.o: tsd.c $(TSD_SRCS) $(INCL) |
|||
version.o: version.rc $(INCL) |
@ -1,4 +0,0 @@ |
|||
CVS Repository maintainers |
|||
|
|||
Ross Johnson rpj@ise.canberra.edu.au |
|||
Ben Elliston bje@cygnus.com |
@ -1,516 +0,0 @@ |
|||
# This makefile is compatible with MS nmake and can be used as a
|
|||
# replacement for buildlib.bat. I've changed the target from an ordinary dll
|
|||
# (/LD) to a debugging dll (/LDd).
|
|||
#
|
|||
# The variables $DLLDEST and $LIBDEST hold the destination directories for the
|
|||
# dll and the lib, respectively. Probably all that needs to change is $DEVROOT.
|
|||
|
|||
|
|||
# DLL_VER:
|
|||
# See pthread.h and README - This number is computed as 'current - age'
|
|||
DLL_VER = 2 |
|||
DLL_VERD= $(DLL_VER)d |
|||
|
|||
DEVROOT = C:\pthreads |
|||
|
|||
DLLDEST = $(DEVROOT)\dll |
|||
LIBDEST = $(DEVROOT)\lib |
|||
HDRDEST = $(DEVROOT)\include |
|||
|
|||
DLLS = pthreadVCE$(DLL_VER).dll pthreadVSE$(DLL_VER).dll pthreadVC$(DLL_VER).dll \
|
|||
pthreadVCE$(DLL_VERD).dll pthreadVSE$(DLL_VERD).dll pthreadVC$(DLL_VERD).dll |
|||
INLINED_STAMPS = pthreadVCE$(DLL_VER).stamp pthreadVSE$(DLL_VER).stamp pthreadVC$(DLL_VER).stamp \
|
|||
pthreadVCE$(DLL_VERD).stamp pthreadVSE$(DLL_VERD).stamp pthreadVC$(DLL_VERD).stamp |
|||
STATIC_STAMPS = pthreadVCE$(DLL_VER).static pthreadVSE$(DLL_VER).static pthreadVC$(DLL_VER).static \
|
|||
pthreadVCE$(DLL_VERD).static pthreadVSE$(DLL_VERD).static pthreadVC$(DLL_VERD).static |
|||
|
|||
CC = cl |
|||
CPPFLAGS = /I. /DHAVE_PTW32_CONFIG_H |
|||
STATICCRT = /MT |
|||
STATICCRTD = /MTd |
|||
DLLCRT = /MD |
|||
DLLCRTD = /MDd |
|||
XCFLAGS = /W3 /nologo |
|||
CFLAGS = /O2 /Ob2 $(XCFLAGS) |
|||
CFLAGSD = /Z7 $(XCFLAGS) |
|||
|
|||
# Uncomment this if config.h defines RETAIN_WSALASTERROR
|
|||
#XLIBS = wsock32.lib
|
|||
|
|||
# Default cleanup style
|
|||
CLEANUP = __CLEANUP_C |
|||
|
|||
# C++ Exceptions
|
|||
VCEFLAGS = /EHsc /TP $(CPPFLAGS) $(CFLAGS) |
|||
VCEFLAGSD = /EHsc /TP $(CPPFLAGS) $(CFLAGSD) |
|||
#Structured Exceptions
|
|||
VSEFLAGS = $(CPPFLAGS) $(CFLAGS) |
|||
VSEFLAGSD = $(CPPFLAGS) $(CFLAGSD) |
|||
#C cleanup code
|
|||
VCFLAGS = $(CPPFLAGS) $(CFLAGS) |
|||
VCFLAGSD = $(CPPFLAGS) $(CFLAGSD) |
|||
|
|||
DLL_INLINED_OBJS = \
|
|||
pthread.obj \
|
|||
version.res |
|||
|
|||
# Aggregate modules for inlinability
|
|||
DLL_OBJS = \
|
|||
attr.obj \
|
|||
barrier.obj \
|
|||
cancel.obj \
|
|||
cleanup.obj \
|
|||
condvar.obj \
|
|||
create.obj \
|
|||
dll.obj \
|
|||
autostatic.obj \
|
|||
errno.obj \
|
|||
exit.obj \
|
|||
fork.obj \
|
|||
global.obj \
|
|||
misc.obj \
|
|||
mutex.obj \
|
|||
nonportable.obj \
|
|||
private.obj \
|
|||
rwlock.obj \
|
|||
sched.obj \
|
|||
semaphore.obj \
|
|||
signal.obj \
|
|||
spin.obj \
|
|||
sync.obj \
|
|||
tsd.obj \
|
|||
version.res |
|||
|
|||
# Separate modules for minimising the size of statically linked images
|
|||
SMALL_STATIC_OBJS = \
|
|||
pthread_attr_init.obj \
|
|||
pthread_attr_destroy.obj \
|
|||
pthread_attr_getdetachstate.obj \
|
|||
pthread_attr_setdetachstate.obj \
|
|||
pthread_attr_getstackaddr.obj \
|
|||
pthread_attr_setstackaddr.obj \
|
|||
pthread_attr_getstacksize.obj \
|
|||
pthread_attr_setstacksize.obj \
|
|||
pthread_attr_getscope.obj \
|
|||
pthread_attr_setscope.obj \
|
|||
pthread_attr_setschedpolicy.obj \
|
|||
pthread_attr_getschedpolicy.obj \
|
|||
pthread_attr_setschedparam.obj \
|
|||
pthread_attr_getschedparam.obj \
|
|||
pthread_attr_setinheritsched.obj \
|
|||
pthread_attr_getinheritsched.obj \
|
|||
pthread_barrier_init.obj \
|
|||
pthread_barrier_destroy.obj \
|
|||
pthread_barrier_wait.obj \
|
|||
pthread_barrierattr_init.obj \
|
|||
pthread_barrierattr_destroy.obj \
|
|||
pthread_barrierattr_setpshared.obj \
|
|||
pthread_barrierattr_getpshared.obj \
|
|||
pthread_setcancelstate.obj \
|
|||
pthread_setcanceltype.obj \
|
|||
pthread_testcancel.obj \
|
|||
pthread_cancel.obj \
|
|||
cleanup.obj \
|
|||
pthread_condattr_destroy.obj \
|
|||
pthread_condattr_getpshared.obj \
|
|||
pthread_condattr_init.obj \
|
|||
pthread_condattr_setpshared.obj \
|
|||
pthread_cond_destroy.obj \
|
|||
pthread_cond_init.obj \
|
|||
pthread_cond_signal.obj \
|
|||
pthread_cond_wait.obj \
|
|||
create.obj \
|
|||
dll.obj \
|
|||
autostatic.obj \
|
|||
errno.obj \
|
|||
pthread_exit.obj \
|
|||
fork.obj \
|
|||
global.obj \
|
|||
pthread_mutex_init.obj \
|
|||
pthread_mutex_destroy.obj \
|
|||
pthread_mutexattr_init.obj \
|
|||
pthread_mutexattr_destroy.obj \
|
|||
pthread_mutexattr_getpshared.obj \
|
|||
pthread_mutexattr_setpshared.obj \
|
|||
pthread_mutexattr_settype.obj \
|
|||
pthread_mutexattr_gettype.obj \
|
|||
pthread_mutexattr_setrobust.obj \
|
|||
pthread_mutexattr_getrobust.obj \
|
|||
pthread_mutex_lock.obj \
|
|||
pthread_mutex_timedlock.obj \
|
|||
pthread_mutex_unlock.obj \
|
|||
pthread_mutex_trylock.obj \
|
|||
pthread_mutex_consistent.obj \
|
|||
pthread_mutexattr_setkind_np.obj \
|
|||
pthread_mutexattr_getkind_np.obj \
|
|||
pthread_getw32threadhandle_np.obj \
|
|||
pthread_getunique_np.obj \
|
|||
pthread_delay_np.obj \
|
|||
pthread_num_processors_np.obj \
|
|||
pthread_win32_attach_detach_np.obj \
|
|||
pthread_equal.obj \
|
|||
pthread_getconcurrency.obj \
|
|||
pthread_once.obj \
|
|||
pthread_self.obj \
|
|||
pthread_setconcurrency.obj \
|
|||
pthread_rwlock_init.obj \
|
|||
pthread_rwlock_destroy.obj \
|
|||
pthread_rwlockattr_init.obj \
|
|||
pthread_rwlockattr_destroy.obj \
|
|||
pthread_rwlockattr_getpshared.obj \
|
|||
pthread_rwlockattr_setpshared.obj \
|
|||
pthread_rwlock_rdlock.obj \
|
|||
pthread_rwlock_wrlock.obj \
|
|||
pthread_rwlock_unlock.obj \
|
|||
pthread_rwlock_tryrdlock.obj \
|
|||
pthread_rwlock_trywrlock.obj \
|
|||
pthread_setschedparam.obj \
|
|||
pthread_getschedparam.obj \
|
|||
pthread_timechange_handler_np.obj \
|
|||
ptw32_is_attr.obj \
|
|||
ptw32_processInitialize.obj \
|
|||
ptw32_processTerminate.obj \
|
|||
ptw32_threadStart.obj \
|
|||
ptw32_threadDestroy.obj \
|
|||
ptw32_tkAssocCreate.obj \
|
|||
ptw32_tkAssocDestroy.obj \
|
|||
ptw32_callUserDestroyRoutines.obj \
|
|||
ptw32_timespec.obj \
|
|||
ptw32_throw.obj \
|
|||
ptw32_getprocessors.obj \
|
|||
ptw32_calloc.obj \
|
|||
ptw32_new.obj \
|
|||
ptw32_reuse.obj \
|
|||
ptw32_rwlock_check_need_init.obj \
|
|||
ptw32_cond_check_need_init.obj \
|
|||
ptw32_mutex_check_need_init.obj \
|
|||
ptw32_semwait.obj \
|
|||
ptw32_relmillisecs.obj \
|
|||
ptw32_MCS_lock.obj \
|
|||
sched_get_priority_max.obj \
|
|||
sched_get_priority_min.obj \
|
|||
sched_setscheduler.obj \
|
|||
sched_getscheduler.obj \
|
|||
sched_yield.obj \
|
|||
sem_init.obj \
|
|||
sem_destroy.obj \
|
|||
sem_trywait.obj \
|
|||
sem_timedwait.obj \
|
|||
sem_wait.obj \
|
|||
sem_post.obj \
|
|||
sem_post_multiple.obj \
|
|||
sem_getvalue.obj \
|
|||
sem_open.obj \
|
|||
sem_close.obj \
|
|||
sem_unlink.obj \
|
|||
signal.obj \
|
|||
pthread_kill.obj \
|
|||
ptw32_spinlock_check_need_init.obj \
|
|||
pthread_spin_init.obj \
|
|||
pthread_spin_destroy.obj \
|
|||
pthread_spin_lock.obj \
|
|||
pthread_spin_unlock.obj \
|
|||
pthread_spin_trylock.obj \
|
|||
pthread_detach.obj \
|
|||
pthread_join.obj \
|
|||
pthread_key_create.obj \
|
|||
pthread_key_delete.obj \
|
|||
pthread_setspecific.obj \
|
|||
pthread_getspecific.obj \
|
|||
w32_CancelableWait.obj \
|
|||
version.res |
|||
|
|||
INCL = config.h implement.h semaphore.h pthread.h need_errno.h |
|||
|
|||
ATTR_SRCS = \
|
|||
pthread_attr_init.c \
|
|||
pthread_attr_destroy.c \
|
|||
pthread_attr_getdetachstate.c \
|
|||
pthread_attr_setdetachstate.c \
|
|||
pthread_attr_getstackaddr.c \
|
|||
pthread_attr_setstackaddr.c \
|
|||
pthread_attr_getstacksize.c \
|
|||
pthread_attr_setstacksize.c \
|
|||
pthread_attr_getscope.c \
|
|||
pthread_attr_setscope.c |
|||
|
|||
BARRIER_SRCS = \
|
|||
pthread_barrier_init.c \
|
|||
pthread_barrier_destroy.c \
|
|||
pthread_barrier_wait.c \
|
|||
pthread_barrierattr_init.c \
|
|||
pthread_barrierattr_destroy.c \
|
|||
pthread_barrierattr_setpshared.c \
|
|||
pthread_barrierattr_getpshared.c |
|||
|
|||
CANCEL_SRCS = \
|
|||
pthread_setcancelstate.c \
|
|||
pthread_setcanceltype.c \
|
|||
pthread_testcancel.c \
|
|||
pthread_cancel.c |
|||
|
|||
CONDVAR_SRCS = \
|
|||
ptw32_cond_check_need_init.c \
|
|||
pthread_condattr_destroy.c \
|
|||
pthread_condattr_getpshared.c \
|
|||
pthread_condattr_init.c \
|
|||
pthread_condattr_setpshared.c \
|
|||
pthread_cond_destroy.c \
|
|||
pthread_cond_init.c \
|
|||
pthread_cond_signal.c \
|
|||
pthread_cond_wait.c |
|||
|
|||
EXIT_SRCS = \
|
|||
pthread_exit.c |
|||
|
|||
MISC_SRCS = \
|
|||
pthread_equal.c \
|
|||
pthread_getconcurrency.c \
|
|||
pthread_kill.c \
|
|||
pthread_once.c \
|
|||
pthread_self.c \
|
|||
pthread_setconcurrency.c \
|
|||
ptw32_calloc.c \
|
|||
ptw32_MCS_lock.c \
|
|||
ptw32_new.c \
|
|||
ptw32_reuse.c \
|
|||
ptw32_relmillisecs.c \
|
|||
w32_CancelableWait.c |
|||
|
|||
MUTEX_SRCS = \
|
|||
ptw32_mutex_check_need_init.c \
|
|||
pthread_mutex_init.c \
|
|||
pthread_mutex_destroy.c \
|
|||
pthread_mutexattr_init.c \
|
|||
pthread_mutexattr_destroy.c \
|
|||
pthread_mutexattr_getpshared.c \
|
|||
pthread_mutexattr_setpshared.c \
|
|||
pthread_mutexattr_settype.c \
|
|||
pthread_mutexattr_gettype.c \
|
|||
pthread_mutexattr_setrobust.c \
|
|||
pthread_mutexattr_getrobust.c \
|
|||
pthread_mutex_lock.c \
|
|||
pthread_mutex_timedlock.c \
|
|||
pthread_mutex_unlock.c \
|
|||
pthread_mutex_trylock.c \
|
|||
pthread_mutex_consistent.c |
|||
|
|||
NONPORTABLE_SRCS = \
|
|||
pthread_mutexattr_setkind_np.c \
|
|||
pthread_mutexattr_getkind_np.c \
|
|||
pthread_getw32threadhandle_np.c \
|
|||
pthread_getunique_np.c \
|
|||
pthread_delay_np.c \
|
|||
pthread_num_processors_np.c \
|
|||
pthread_win32_attach_detach_np.c \
|
|||
pthread_timechange_handler_np.c |
|||
|
|||
PRIVATE_SRCS = \
|
|||
ptw32_is_attr.c \
|
|||
ptw32_processInitialize.c \
|
|||
ptw32_processTerminate.c \
|
|||
ptw32_threadStart.c \
|
|||
ptw32_threadDestroy.c \
|
|||
ptw32_tkAssocCreate.c \
|
|||
ptw32_tkAssocDestroy.c \
|
|||
ptw32_callUserDestroyRoutines.c \
|
|||
ptw32_semwait.c \
|
|||
ptw32_timespec.c \
|
|||
ptw32_throw.c \
|
|||
ptw32_getprocessors.c |
|||
|
|||
RWLOCK_SRCS = \
|
|||
ptw32_rwlock_check_need_init.c \
|
|||
ptw32_rwlock_cancelwrwait.c \
|
|||
pthread_rwlock_init.c \
|
|||
pthread_rwlock_destroy.c \
|
|||
pthread_rwlockattr_init.c \
|
|||
pthread_rwlockattr_destroy.c \
|
|||
pthread_rwlockattr_getpshared.c \
|
|||
pthread_rwlockattr_setpshared.c \
|
|||
pthread_rwlock_rdlock.c \
|
|||
pthread_rwlock_timedrdlock.c \
|
|||
pthread_rwlock_wrlock.c \
|
|||
pthread_rwlock_timedwrlock.c \
|
|||
pthread_rwlock_unlock.c \
|
|||
pthread_rwlock_tryrdlock.c \
|
|||
pthread_rwlock_trywrlock.c |
|||
|
|||
SCHED_SRCS = \
|
|||
pthread_attr_setschedpolicy.c \
|
|||
pthread_attr_getschedpolicy.c \
|
|||
pthread_attr_setschedparam.c \
|
|||
pthread_attr_getschedparam.c \
|
|||
pthread_attr_setinheritsched.c \
|
|||
pthread_attr_getinheritsched.c \
|
|||
pthread_setschedparam.c \
|
|||
pthread_getschedparam.c \
|
|||
sched_get_priority_max.c \
|
|||
sched_get_priority_min.c \
|
|||
sched_setscheduler.c \
|
|||
sched_getscheduler.c \
|
|||
sched_yield.c |
|||
|
|||
SEMAPHORE_SRCS = \
|
|||
sem_init.c \
|
|||
sem_destroy.c \
|
|||
sem_trywait.c \
|
|||
sem_timedwait.c \
|
|||
sem_wait.c \
|
|||
sem_post.c \
|
|||
sem_post_multiple.c \
|
|||
sem_getvalue.c \
|
|||
sem_open.c \
|
|||
sem_close.c \
|
|||
sem_unlink.c |
|||
|
|||
SPIN_SRCS = \
|
|||
ptw32_spinlock_check_need_init.c \
|
|||
pthread_spin_init.c \
|
|||
pthread_spin_destroy.c \
|
|||
pthread_spin_lock.c \
|
|||
pthread_spin_unlock.c \
|
|||
pthread_spin_trylock.c |
|||
|
|||
SYNC_SRCS = \
|
|||
pthread_detach.c \
|
|||
pthread_join.c |
|||
|
|||
TSD_SRCS = \
|
|||
pthread_key_create.c \
|
|||
pthread_key_delete.c \
|
|||
pthread_setspecific.c \
|
|||
pthread_getspecific.c |
|||
|
|||
|
|||
help: |
|||
@ echo Run one of the following command lines: |
|||
@ echo nmake clean VCE (to build the MSVC dll with C++ exception handling) |
|||
@ echo nmake clean VSE (to build the MSVC dll with structured exception handling) |
|||
@ echo nmake clean VC (to build the MSVC dll with C cleanup code) |
|||
@ echo nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) |
|||
@ echo nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) |
|||
@ echo nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) |
|||
@ echo nmake clean VC-static (to build the MSVC static lib with C cleanup code) |
|||
@ echo nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) |
|||
@ echo nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) |
|||
@ echo nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) |
|||
@ echo nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) |
|||
@ echo nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) |
|||
@ echo nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) |
|||
@ echo nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) |
|||
|
|||
all: |
|||
@ $(MAKE) /E clean VCE-inlined |
|||
@ $(MAKE) /E clean VSE-inlined |
|||
@ $(MAKE) /E clean VC-inlined |
|||
@ $(MAKE) /E clean VCE-inlined-debug |
|||
@ $(MAKE) /E clean VSE-inlined-debug |
|||
@ $(MAKE) /E clean VC-inlined-debug |
|||
|
|||
VCE: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGS) $(DLLCRT)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).dll |
|||
|
|||
VCE-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGSD) $(DLLCRTD)" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).dll |
|||
|
|||
VSE: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGS) $(DLLCRT)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).dll |
|||
|
|||
VSE-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGSD) $(DLLCRTD)" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).dll |
|||
|
|||
VC: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS) $(DLLCRT)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).dll |
|||
|
|||
VC-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGSD) $(DLLCRTD)" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).dll |
|||
|
|||
#
|
|||
# The so-called inlined DLL is just a single translation unit with
|
|||
# inlining optimisation turned on.
|
|||
#
|
|||
VCE-inlined: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGS) $(DLLCRT) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VER).stamp |
|||
|
|||
VCE-inlined-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCEFLAGSD) $(DLLCRTD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_CXX pthreadVCE$(DLL_VERD).stamp |
|||
|
|||
VSE-inlined: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGS) $(DLLCRT) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VER).stamp |
|||
|
|||
VSE-inlined-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VSEFLAGSD) $(DLLCRTD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_SEH pthreadVSE$(DLL_VERD).stamp |
|||
|
|||
VC-inlined: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS) $(DLLCRT) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).stamp |
|||
|
|||
VC-inlined-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGSD) $(DLLCRTD) /DPTW32_BUILD_INLINED" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).stamp |
|||
|
|||
VC-static: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGS) $(STATICCRT) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VER).static |
|||
|
|||
VC-static-debug: |
|||
@ $(MAKE) /E /nologo EHFLAGS="$(VCFLAGSD) $(STATICCRTD) /DPTW32_BUILD_INLINED /DPTW32_STATIC_LIB" CLEANUP=__CLEANUP_C pthreadVC$(DLL_VERD).static |
|||
|
|||
realclean: clean |
|||
if exist pthread*.dll del pthread*.dll |
|||
if exist pthread*.lib del pthread*.lib |
|||
if exist *.manifest del *.manifest |
|||
if exist *.stamp del *.stamp |
|||
|
|||
clean: |
|||
if exist *.obj del *.obj |
|||
if exist *.def del *.def |
|||
if exist *.ilk del *.ilk |
|||
if exist *.pdb del *.pdb |
|||
if exist *.exp del *.exp |
|||
if exist *.map del *.map |
|||
if exist *.o del *.o |
|||
if exist *.i del *.i |
|||
if exist *.res del *.res |
|||
|
|||
|
|||
install: |
|||
copy pthread*.dll $(DLLDEST) |
|||
copy pthread*.lib $(LIBDEST) |
|||
copy pthread.h $(HDRDEST) |
|||
copy sched.h $(HDRDEST) |
|||
copy semaphore.h $(HDRDEST) |
|||
|
|||
$(DLLS): $(DLL_OBJS) |
|||
$(CC) /LDd /Zi /nologo $(DLL_OBJS) /link /implib:$*.lib $(XLIBS) /out:$@ |
|||
|
|||
$(INLINED_STAMPS): $(DLL_INLINED_OBJS) |
|||
$(CC) /LDd /Zi /nologo $(DLL_INLINED_OBJS) /link /implib:$*.lib $(XLIBS) /out:$*.dll |
|||
|
|||
$(STATIC_STAMPS): $(DLL_INLINED_OBJS) |
|||
if exist $*.lib del $*.lib |
|||
lib $(DLL_INLINED_OBJS) /out:$*.lib |
|||
|
|||
.c.obj: |
|||
$(CC) $(EHFLAGS) /D$(CLEANUP) -c $< |
|||
|
|||
.rc.res: |
|||
rc /dPTW32_RC_MSC /d$(CLEANUP) $< |
|||
|
|||
.c.i: |
|||
$(CC) /P /O2 /Ob1 $(VCFLAGS) $< |
|||
|
|||
attr.obj: attr.c $(ATTR_SRCS) $(INCL) |
|||
barrier.obj: barrier.c $(BARRIER_SRCS) $(INCL) |
|||
cancel.obj: cancel.c $(CANCEL_SRCS) $(INCL) |
|||
condvar.obj: condvar.c $(CONDVAR_SRCS) $(INCL) |
|||
exit.obj: exit.c $(EXIT_SRCS) $(INCL) |
|||
misc.obj: misc.c $(MISC_SRCS) $(INCL) |
|||
mutex.obj: mutex.c $(MUTEX_SRCS) $(INCL) |
|||
nonportable.obj: nonportable.c $(NONPORTABLE_SRCS) $(INCL) |
|||
private.obj: private.c $(PRIVATE_SRCS) $(INCL) |
|||
rwlock.obj: rwlock.c $(RWLOCK_SRCS) $(INCL) |
|||
sched.obj: sched.c $(SCHED_SRCS) $(INCL) |
|||
semaphore.obj: semaphore.c $(SEMAPHORE_SRCS) $(INCL) |
|||
spin.obj: spin.c $(SPIN_SRCS) $(INCL) |
|||
sync.obj: sync.c $(SYNC_SRCS) $(INCL) |
|||
tsd.obj: tsd.c $(TSD_SRCS) $(INCL) |
|||
version.res: version.rc $(INCL) |
File diff suppressed because it is too large
@ -1,24 +0,0 @@ |
|||
/* |
|||
* nmake file for uwin pthread library |
|||
*/ |
|||
|
|||
VERSION = - |
|||
CCFLAGS = -V -g $(CC.DLL) |
|||
HAVE_PTW32_CONFIG_H == 1 |
|||
_MT == 1 |
|||
_timeb == timeb |
|||
_ftime == ftime |
|||
_errno == _ast_errno |
|||
|
|||
$(INCLUDEDIR) :INSTALLDIR: pthread.h sched.h |
|||
|
|||
pthread $(VERSION) :LIBRARY: attr.c barrier.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 spin.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 |
|||
|
@ -1,260 +0,0 @@ |
|||
/* 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 |
|||
sizes:: sizes.c |
|||
loadfree:: loadfree.c |
|||
mutex1:: mutex1.c |
|||
mutex1e:: mutex1e.c |
|||
mutex1n:: mutex1n.c |
|||
mutex1r:: mutex1r.c |
|||
mutex2:: mutex2.c |
|||
mutex2r:: mutex2r.c |
|||
mutex2e:: mutex2e.c |
|||
exit1:: exit1.c |
|||
condvar1:: condvar1.c |
|||
condvar1_1:: condvar1_1.c |
|||
condvar1_2:: condvar1_2.c |
|||
self1:: self1.c |
|||
condvar2:: condvar2.c |
|||
condvar2_1:: condvar2_1.c |
|||
condvar3_1:: condvar3_1.c |
|||
condvar3_2:: condvar3_2.c |
|||
condvar3_3:: condvar3_3.c |
|||
create1.:: create1.c |
|||
create2.:: create2.c |
|||
cancel1:: cancel1.c |
|||
cancel2:: cancel2.c |
|||
mutex3:: mutex3.c |
|||
mutex3r:: mutex3r.c |
|||
mutex3e:: mutex3e.c |
|||
mutex4:: mutex4.c |
|||
mutex5:: mutex5.c |
|||
mutex6:: mutex6.c |
|||
mutex6e:: mutex6e.c |
|||
mutex6n:: mutex6n.c |
|||
mutex6r:: mutex6r.c |
|||
mutex7:: mutex7.c |
|||
mutex6s:: mutex6s.c |
|||
mutex6rs:: mutex6rs.c |
|||
mutex6es:: mutex6es.c |
|||
mutex7e:: mutex7e.c |
|||
mutex7n:: mutex7n.c |
|||
mutex7r:: mutex7r.c |
|||
mutex8:: mutex8.c |
|||
mutex8e:: mutex8e.c |
|||
mutex8n:: mutex8n.c |
|||
mutex8r:: mutex8r.c |
|||
equal1:: equal1.c |
|||
exit2:: exit2.c |
|||
exit3:: exit3.c |
|||
exit4:: exit4.c |
|||
exit5:: exit5.c |
|||
join0:: join0.c |
|||
join1:: join1.c |
|||
join2:: join2.c |
|||
join3:: join3.c |
|||
kill1:: kill1.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 |
|||
reuse1.:: reuse1.c |
|||
reuse2.:: reuse2.c |
|||
rwlock1:: rwlock1.c |
|||
rwlock2:: rwlock2.c |
|||
rwlock3:: rwlock3.c |
|||
rwlock4:: rwlock4.c |
|||
rwlock5:: rwlock5.c |
|||
rwlock6:: rwlock6.c |
|||
rwlock7:: rwlock7.c |
|||
rwlock8:: rwlock8.c |
|||
rwlock2_t:: rwlock2_t.c |
|||
rwlock3_t:: rwlock3_t.c |
|||
rwlock4_t:: rwlock4_t.c |
|||
rwlock5_t:: rwlock5_t.c |
|||
rwlock6_t:: rwlock6_t.c |
|||
rwlock6_t2:: rwlock6_t2.c |
|||
semaphore1:: semaphore1.c |
|||
semaphore2:: semaphore2.c |
|||
semaphore3:: semaphore3.c |
|||
context1:: context1.c |
|||
cancel3:: cancel3.c |
|||
cancel4:: cancel4.c |
|||
cancel5:: cancel5.c |
|||
cancel6a:: cancel6a.c |
|||
cancel6d:: cancel6d.c |
|||
cancel7:: cancel7.c |
|||
cleanup0:: cleanup0.c |
|||
cleanup1:: cleanup1.c |
|||
cleanup2:: cleanup2.c |
|||
cleanup3:: cleanup3.c |
|||
priority1:: priority1.c |
|||
priority2:: priority2.c |
|||
inherit1:: inherit1.c |
|||
spin1:: spin1.c |
|||
spin2:: spin2.c |
|||
spin3:: spin3.c |
|||
spin4:: spin4.c |
|||
barrier1:: barrier1.c |
|||
barrier2:: barrier2.c |
|||
barrier3:: barrier3.c |
|||
barrier4:: barrier4.c |
|||
barrier5:: barrier5.c |
|||
exception1:: exception1.c |
|||
exception2:: exception2.c |
|||
exception3:: exception3.c |
|||
benchtest1:: benchtest1.c |
|||
benchtest2:: benchtest2.c |
|||
benchtest3:: benchtest3.c |
|||
benchtest4:: benchtest4.c |
|||
benchtest5:: benchtest5.c |
|||
valid1:: valid1.c |
|||
valid2:: valid2.c |
|||
cancel9:: cancel9.c |
|||
|
|||
sizes: :test: sizes |
|||
loadfree: :test: |
|||
mutex5 :test: loadfree |
|||
mutex1 :test: loadfree |
|||
mutex1n :test: loadfree |
|||
mutex1r :test: loadfree |
|||
mutex1e :test: loadfree |
|||
semaphore1 :test: loadfree |
|||
semaphore2 :test: loadfree |
|||
semaphore3 :test: loadfree |
|||
mutex2 :test: loadfree |
|||
mutex2r :test: loadfree |
|||
mutex2e :test: loadfree |
|||
exit1 :test: loadfree |
|||
condvar1 :test: loadfree |
|||
kill1 :test: loadfree |
|||
condvar1_1 :test: condvar1 |
|||
condvar1_2 :test: join2 |
|||
self1 :test: loadfree |
|||
condvar2 :test: condvar1 |
|||
condvar2_1 :test: condvar2 |
|||
create1 :test: mutex2 |
|||
create2 :test: create1 |
|||
reuse1 :test: create2 |
|||
reuse2 :test: reuse1 |
|||
cancel1 :test: create1 |
|||
cancel2 :test: cancel1 |
|||
mutex3 :test: create1 |
|||
mutex3r :test: create1 |
|||
mutex3e :test: create1 |
|||
mutex4 :test: mutex3 |
|||
mutex6 :test: mutex4 |
|||
mutex6n :test: mutex4 |
|||
mutex6e :test: mutex4 |
|||
mutex6r :test: mutex4 |
|||
mutex6s :test: mutex6 |
|||
mutex6rs :test: mutex6r |
|||
mutex6es :test: mutex6e |
|||
mutex7 :test: mutex6 |
|||
mutex7n :test: mutex6n |
|||
mutex7e :test: mutex6e |
|||
mutex7r :test: mutex6r |
|||
mutex8 :test: mutex7 |
|||
mutex8n :test: mutex7n |
|||
mutex8e :test: mutex7e |
|||
mutex8r :test: mutex7r |
|||
equal1 :test: create1 |
|||
exit2 :test: create1 |
|||
exit3 :test: create1 |
|||
exit4 :test: kill1 |
|||
exit5 :test: exit4 |
|||
join0 :test: create1 |
|||
join1 :test: create1 |
|||
join2 :test: create1 |
|||
join3 :test: join2 |
|||
count1 :test: join1 |
|||
once1 :test: create1 |
|||
tsd1 :test: join1 |
|||
self2 :test: create1 |
|||
eyal1 :test: tsd1 |
|||
condvar3 :test: create1 |
|||
condvar3_1 :test: condvar3 |
|||
condvar3_2 :test: condvar3_1 |
|||
condvar3_3 :test: condvar3_2 |
|||
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 |
|||
rwlock7 :test: rwlock6 |
|||
rwlock8 :test: rwlock7 |
|||
rwlock2_t :test: rwlock2 |
|||
rwlock3_t :test: rwlock2_t |
|||
rwlock4_t :test: rwlock3_t |
|||
rwlock5_t :test: rwlock4_t |
|||
rwlock6_t :test: rwlock5_t |
|||
rwlock6_t2 :test: rwlock6_t |
|||
context1 :test: cancel2 |
|||
cancel3 :test: context1 |
|||
cancel4 :test: cancel3 |
|||
cancel5 :test: cancel3 |
|||
cancel6a :test: cancel3 |
|||
cancel6d :test: cancel3 |
|||
cancel7 :test: kill1 |
|||
cleanup0 :test: cancel5 |
|||
cleanup1 :test: cleanup0 |
|||
cleanup2 :test: cleanup1 |
|||
cleanup3 :test: cleanup2 |
|||
priority1 :test: join1 |
|||
priority2 :test: priority1 |
|||
inherit1 :test: join1 |
|||
spin1 :test: |
|||
spin2 :test: spin1.c |
|||
spin3 :test: spin2.c |
|||
spin4 :test: spin3.c |
|||
barrier1 :test: |
|||
barrier2 :test: barrier1.c |
|||
barrier3 :test: barrier2.c |
|||
barrier4 :test: barrier3.c |
|||
barrier5 :test: barrier4.c |
|||
benchtest1 :test: mutex3 |
|||
benchtest2 :test: benchtest1 |
|||
benchtest3 :test: benchtest2 |
|||
benchtest4 :test: benchtest3 |
|||
benchtest5 :test: benchtest4 |
|||
exception1 :test: cancel4 |
|||
exception2 :test: exception1 |
|||
exception3 :test: exception2 |
|||
exit4 :test: exit3 |
|||
valid1 :test: join1 |
|||
valid2 :test: valid1 |
|||
cancel9 :test: cancel8 |
@ -1,4 +0,0 @@ |
|||
Please see the ANNOUNCE file "Level of Standards Conformance" |
|||
or the web page: |
|||
|
|||
http://sources.redhat.com/pthreads-win32/conformance.html |
@ -1,601 +0,0 @@ |
|||
PTHREADS-WIN32 |
|||
============== |
|||
|
|||
Pthreads-win32 is free software, distributed under the GNU Lesser |
|||
General Public License (LGPL). See the file 'COPYING.LIB' for terms |
|||
and conditions. Also see the file 'COPYING' for information |
|||
specific to pthreads-win32, copyrights and the LGPL. |
|||
|
|||
|
|||
What is it? |
|||
----------- |
|||
|
|||
Pthreads-win32 is an Open Source Software implementation of the |
|||
Threads component of the POSIX 1003.1c 1995 Standard (or later) |
|||
for Microsoft's Win32 environment. Some functions from POSIX |
|||
1003.1b are also supported including semaphores. Other related |
|||
functions include the set of read-write lock functions. The |
|||
library also supports some of the functionality of the Open |
|||
Group's Single Unix specification, version 2, namely mutex types, |
|||
plus some common and pthreads-win32 specific non-portable |
|||
routines (see README.NONPORTABLE). |
|||
|
|||
See the file "ANNOUNCE" for more information including standards |
|||
conformance details and the list of supported and unsupported |
|||
routines. |
|||
|
|||
|
|||
Prerequisites |
|||
------------- |
|||
MSVC or GNU C (MinGW32 MSys development kit) |
|||
To build from source. |
|||
|
|||
QueueUserAPCEx by Panagiotis E. Hadjidoukas |
|||
To support any thread cancelation in C++ library builds or |
|||
to support cancelation of blocked threads in any build. |
|||
This library is not required otherwise. |
|||
|
|||
For true async cancelation of threads (including blocked threads). |
|||
This is a DLL and Windows driver that provides pre-emptive APC |
|||
by forcing threads into an alertable state when the APC is queued. |
|||
Both the DLL and driver are provided with the pthreads-win32.exe |
|||
self-unpacking ZIP, and on the pthreads-win32 FTP site (in source |
|||
and pre-built forms). Currently this is a separate LGPL package to |
|||
pthreads-win32. See the README in the QueueUserAPCEx folder for |
|||
installation instructions. |
|||
|
|||
Pthreads-win32 will automatically detect if the QueueUserAPCEx DLL |
|||
QuserEx.DLL is available and whether the driver AlertDrv.sys is |
|||
loaded. If it is not available, pthreads-win32 will simulate async |
|||
cancelation, which means that it can async cancel only threads that |
|||
are runnable. The simulated async cancellation cannot cancel blocked |
|||
threads. |
|||
|
|||
[FOR SECURITY] To be found Quserex.dll MUST be installed in the |
|||
Windows System Folder. This is not an unreasonable constraint given a |
|||
driver must also be installed and loaded at system startup. |
|||
|
|||
|
|||
Library naming |
|||
-------------- |
|||
|
|||
Because the library is being built using various exception |
|||
handling schemes and compilers - and because the library |
|||
may not work reliably if these are mixed in an application, |
|||
each different version of the library has it's own name. |
|||
|
|||
Note 1: the incompatibility is really between EH implementations |
|||
of the different compilers. It should be possible to use the |
|||
standard C version from either compiler with C++ applications |
|||
built with a different compiler. If you use an EH version of |
|||
the library, then you must use the same compiler for the |
|||
application. This is another complication and dependency that |
|||
can be avoided by using only the standard C library version. |
|||
|
|||
Note 2: if you use a standard C pthread*.dll with a C++ |
|||
application, then any functions that you define that are |
|||
intended to be called via pthread_cleanup_push() must be |
|||
__cdecl. |
|||
|
|||
Note 3: the intention was to also name either the VC or GC |
|||
version (it should be arbitrary) as pthread.dll, including |
|||
pthread.lib and libpthread.a as appropriate. This is no longer |
|||
likely to happen. |
|||
|
|||
Note 4: the compatibility number was added so that applications |
|||
can differentiate between binary incompatible versions of the |
|||
libs and dlls. |
|||
|
|||
In general: |
|||
pthread[VG]{SE,CE,C}[c].dll |
|||
pthread[VG]{SE,CE,C}[c].lib |
|||
|
|||
where: |
|||
[VG] indicates the compiler |
|||
V - MS VC, or |
|||
G - GNU C |
|||
|
|||
{SE,CE,C} indicates the exception handling scheme |
|||
SE - Structured EH, or |
|||
CE - C++ EH, or |
|||
C - no exceptions - uses setjmp/longjmp |
|||
|
|||
c - DLL compatibility number indicating ABI and API |
|||
compatibility with applications built against |
|||
a snapshot with the same compatibility number. |
|||
See 'Version numbering' below. |
|||
|
|||
The name may also be suffixed by a 'd' to indicate a debugging version |
|||
of the library. E.g. pthreadVC2d.lib. Debugging versions contain |
|||
additional information for debugging (symbols etc) and are often not |
|||
optimised in any way (compiled with optimisation turned off). |
|||
|
|||
Examples: |
|||
pthreadVSE.dll (MSVC/SEH) |
|||
pthreadGCE.dll (GNUC/C++ EH) |
|||
pthreadGC.dll (GNUC/not dependent on exceptions) |
|||
pthreadVC1.dll (MSVC/not dependent on exceptions - not binary |
|||
compatible with pthreadVC.dll) |
|||
pthreadVC2.dll (MSVC/not dependent on exceptions - not binary |
|||
compatible with pthreadVC1.dll or pthreadVC.dll) |
|||
|
|||
The GNU library archive file names have correspondingly changed to: |
|||
|
|||
libpthreadGCEc.a |
|||
libpthreadGCc.a |
|||
|
|||
|
|||
Versioning numbering |
|||
-------------------- |
|||
|
|||
Version numbering is separate from the snapshot dating system, and |
|||
is the canonical version identification system embedded within the |
|||
DLL using the Microsoft version resource system. The versioning |
|||
system chosen follows the GNU Libtool system. See |
|||
http://www.gnu.org/software/libtool/manual.html section 6.2. |
|||
|
|||
See the resource file 'version.rc'. |
|||
|
|||
Microsoft version numbers use 4 integers: |
|||
|
|||
0.0.0.0 |
|||
|
|||
Pthreads-win32 uses the first 3 following the Libtool convention. |
|||
The fourth is commonly used for the build number, but will be reserved |
|||
for future use. |
|||
|
|||
current.revision.age.0 |
|||
|
|||
The numbers are changed as follows: |
|||
|
|||
1. If the library source code has changed at all since the last update, |
|||
then increment revision (`c:r:a' becomes `c:r+1:a'). |
|||
2. If any interfaces have been added, removed, or changed since the last |
|||
update, increment current, and set revision to 0. |
|||
3. If any interfaces have been added since the last public release, then |
|||
increment age. |
|||
4. If any interfaces have been removed or changed since the last public |
|||
release, then set age to 0. |
|||
|
|||
|
|||
DLL compatibility numbering is an attempt to ensure that applications |
|||
always load a compatible pthreads-win32 DLL by using a DLL naming system |
|||
that is consistent with the version numbering system. It also allows |
|||
older and newer DLLs to coexist in the same filesystem so that older |
|||
applications can continue to be used. For pre .NET Windows systems, |
|||
this inevitably requires incompatible versions of the same DLLs to have |
|||
different names. |
|||
|
|||
Pthreads-win32 has adopted the Cygwin convention of appending a single |
|||
integer number to the DLL name. The number used is based on the library |
|||
version number and is computed as 'current' - 'age'. |
|||
|
|||
(See http://home.att.net/~perlspinr/libversioning.html for a nicely |
|||
detailed explanation.) |
|||
|
|||
Using this method, DLL name/s will only change when the DLL's |
|||
backwards compatibility changes. Note that the addition of new |
|||
'interfaces' will not of itself change the DLL's compatibility for older |
|||
applications. |
|||
|
|||
|
|||
Which of the several dll versions to use? |
|||
----------------------------------------- |
|||
or, |
|||
--- |
|||
What are all these pthread*.dll and pthread*.lib files? |
|||
------------------------------------------------------- |
|||
|
|||
Simple, use either pthreadGCv.* if you use GCC, or pthreadVCv.* if you |
|||
use MSVC - where 'v' is the DLL versioning (compatibility) number. |
|||
|
|||
Otherwise, you need to choose carefully and know WHY. |
|||
|
|||
The most important choice you need to make is whether to use a |
|||
version that uses exceptions internally, or not. There are versions |
|||
of the library that use exceptions as part of the thread |
|||
cancelation and exit implementation. The default version uses |
|||
setjmp/longjmp. |
|||
|
|||
There is some contension amongst POSIX threads experts as |
|||
to how POSIX threads cancelation and exit should work |
|||
with languages that use exceptions, e.g. C++ and even C |
|||
(Microsoft's Structured Exceptions). |
|||
|
|||
The issue is: should cancelation of a thread in, say, |
|||
a C++ application cause object destructors and C++ exception |
|||
handlers to be invoked as the stack unwinds during thread |
|||
exit, or not? |
|||
|
|||
There seems to be more opinion in favour of using the |
|||
standard C version of the library (no EH) with C++ applications |
|||
for the reason that this appears to be the assumption commercial |
|||
pthreads implementations make. Therefore, if you use an EH version |
|||
of pthreads-win32 then you may be under the illusion that |
|||
your application will be portable, when in fact it is likely to |
|||
behave differently when linked with other pthreads libraries. |
|||
|
|||
Now you may be asking: then why have you kept the EH versions of |
|||
the library? |
|||
|
|||
There are a couple of reasons: |
|||
- there is division amongst the experts and so the code may |
|||
be needed in the future. Yes, it's in the repository and we |
|||
can get it out anytime in the future, but it would be difficult |
|||
to find. |
|||
- pthreads-win32 is one of the few implementations, and possibly |
|||
the only freely available one, that has EH versions. It may be |
|||
useful to people who want to play with or study application |
|||
behaviour under these conditions. |
|||
|
|||
Notes: |
|||
|
|||
[If you use either pthreadVCE or pthreadGCE] |
|||
|
|||
1. [See also the discussion in the FAQ file - Q2, Q4, and Q5] |
|||
|
|||
If your application contains catch(...) blocks in your POSIX |
|||
threads then you will need to replace the "catch(...)" with the macro |
|||
"PtW32Catch", eg. |
|||
|
|||
#ifdef PtW32Catch |
|||
PtW32Catch { |
|||
... |
|||
} |
|||
#else |
|||
catch(...) { |
|||
... |
|||
} |
|||
#endif |
|||
|
|||
Otherwise neither pthreads cancelation nor pthread_exit() will work |
|||
reliably when using versions of the library that use C++ exceptions |
|||
for cancelation and thread exit. |
|||
|
|||
This is due to what is believed to be a C++ compliance error in VC++ |
|||
whereby you may not have multiple handlers for the same exception in |
|||
the same try/catch block. GNU G++ doesn't have this restriction. |
|||
|
|||
|
|||
Other name changes |
|||
------------------ |
|||
|
|||
All snapshots prior to and including snapshot 2000-08-13 |
|||
used "_pthread_" as the prefix to library internal |
|||
functions, and "_PTHREAD_" to many library internal |
|||
macros. These have now been changed to "ptw32_" and "PTW32_" |
|||
respectively so as to not conflict with the ANSI standard's |
|||
reservation of identifiers beginning with "_" and "__" for |
|||
use by compiler implementations only. |
|||
|
|||
If you have written any applications and you are linking |
|||
statically with the pthreads-win32 library then you may have |
|||
included a call to _pthread_processInitialize. You will |
|||
now have to change that to ptw32_processInitialize. |
|||
|
|||
|
|||
Cleanup code default style |
|||
-------------------------- |
|||
|
|||
Previously, if not defined, the cleanup style was determined automatically |
|||
from the compiler used, and one of the following was defined accordingly: |
|||
|
|||
__CLEANUP_SEH MSVC only |
|||
__CLEANUP_CXX C++, including MSVC++, GNU G++ |
|||
__CLEANUP_C C, including GNU GCC, not MSVC |
|||
|
|||
These defines determine the style of cleanup (see pthread.h) and, |
|||
most importantly, the way that cancelation and thread exit (via |
|||
pthread_exit) is performed (see the routine ptw32_throw()). |
|||
|
|||
In short, the exceptions versions of the library throw an exception |
|||
when a thread is canceled, or exits via pthread_exit(). This exception is |
|||
caught by a handler in the thread startup routine, so that the |
|||
the correct stack unwinding occurs regardless of where the thread |
|||
is when it's canceled or exits via pthread_exit(). |
|||
|
|||
In this snapshot, unless the build explicitly defines (e.g. via a |
|||
compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then |
|||
the build NOW always defaults to __CLEANUP_C style cleanup. This style |
|||
uses setjmp/longjmp in the cancelation and pthread_exit implementations, |
|||
and therefore won't do stack unwinding even when linked to applications |
|||
that have it (e.g. C++ apps). This is for consistency with most/all |
|||
commercial Unix POSIX threads implementations. |
|||
|
|||
Although it was not clearly documented before, it is still necessary to |
|||
build your application using the same __CLEANUP_* define as was |
|||
used for the version of the library that you link with, so that the |
|||
correct parts of pthread.h are included. That is, the possible |
|||
defines require the following library versions: |
|||
|
|||
__CLEANUP_SEH pthreadVSE.dll |
|||
__CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll |
|||
__CLEANUP_C pthreadVC.dll or pthreadGC.dll |
|||
|
|||
It is recommended that you let pthread.h use it's default __CLEANUP_C |
|||
for both library and application builds. That is, don't define any of |
|||
the above, and then link with pthreadVC.lib (MSVC or MSVC++) and |
|||
libpthreadGC.a (MinGW GCC or G++). The reason is explained below, but |
|||
another reason is that the prebuilt pthreadVCE.dll is currently broken. |
|||
Versions built with MSVC++ later than version 6 may not be broken, but I |
|||
can't verify this yet. |
|||
|
|||
WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY? |
|||
Because no commercial Unix POSIX threads implementation allows you to |
|||
choose to have stack unwinding. Therefore, providing it in pthread-win32 |
|||
as a default is dangerous. We still provide the choice but unless |
|||
you consciously choose to do otherwise, your pthreads applications will |
|||
now run or crash in similar ways irrespective of the pthreads platform |
|||
you use. Or at least this is the hope. |
|||
|
|||
|
|||
Building under VC++ using C++ EH, Structured EH, or just C |
|||
---------------------------------------------------------- |
|||
|
|||
From the source directory run nmake without any arguments to list |
|||
help information. E.g. |
|||
|
|||
$ nmake |
|||
|
|||
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 |
|||
Copyright (C) Microsoft Corp 1988-1998. All rights reserved. |
|||
|
|||
Run one of the following command lines: |
|||
nmake clean VCE (to build the MSVC dll with C++ exception handling) |
|||
nmake clean VSE (to build the MSVC dll with structured exception handling) |
|||
nmake clean VC (to build the MSVC dll with C cleanup code) |
|||
nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) |
|||
nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) |
|||
nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) |
|||
nmake clean VC-static (to build the MSVC static lib with C cleanup code) |
|||
nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) |
|||
nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) |
|||
nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) |
|||
nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) |
|||
nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) |
|||
nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) |
|||
nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) |
|||
|
|||
|
|||
The pre-built dlls are normally built using the *-inlined targets. |
|||
|
|||
You can run the testsuite by changing to the "tests" directory and |
|||
running nmake. E.g.: |
|||
|
|||
$ cd tests |
|||
$ nmake |
|||
|
|||
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 |
|||
Copyright (C) Microsoft Corp 1988-1998. All rights reserved. |
|||
|
|||
Run one of the following command lines: |
|||
nmake clean VC (to test using VC dll with VC (no EH) applications) |
|||
nmake clean VCX (to test using VC dll with VC++ (EH) applications) |
|||
nmake clean VCE (to test using the VCE dll with VC++ EH applications) |
|||
nmake clean VSE (to test using VSE dll with VC (SEH) applications) |
|||
nmake clean VC-bench (to benchtest using VC dll with C bench app) |
|||
nmake clean VCX-bench (to benchtest using VC dll with C++ bench app) |
|||
nmake clean VCE-bench (to benchtest using VCE dll with C++ bench app) |
|||
nmake clean VSE-bench (to benchtest using VSE dll with SEH bench app) |
|||
nmake clean VC-static (to test using VC static lib with VC (no EH) applications) |
|||
|
|||
|
|||
Building under Mingw32 |
|||
---------------------- |
|||
|
|||
The dll can be built easily with recent versions of Mingw32. |
|||
(The distributed versions are built using Mingw32 and MsysDTK |
|||
from www.mingw32.org.) |
|||
|
|||
From the source directory, run make for help information. E.g.: |
|||
|
|||
$ make |
|||
Run one of the following command lines: |
|||
make clean GC (to build the GNU C dll with C cleanup code) |
|||
make clean GCE (to build the GNU C dll with C++ exception handling) |
|||
make clean GC-inlined (to build the GNU C inlined dll with C cleanup code) |
|||
make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling) |
|||
make clean GC-static (to build the GNU C inlined static lib with C cleanup code) |
|||
make clean GC-debug (to build the GNU C debug dll with C cleanup code) |
|||
make clean GCE-debug (to build the GNU C debug dll with C++ exception handling) |
|||
make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code) |
|||
make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling) |
|||
make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code) |
|||
|
|||
|
|||
The pre-built dlls are normally built using the *-inlined targets. |
|||
|
|||
You can run the testsuite by changing to the "tests" directory and |
|||
running make for help information. E.g.: |
|||
|
|||
$ cd tests |
|||
$ make |
|||
Run one of the following command lines: |
|||
make clean GC (to test using GC dll with C (no EH) applications) |
|||
make clean GCX (to test using GC dll with C++ (EH) applications) |
|||
make clean GCE (to test using GCE dll with C++ (EH) applications) |
|||
make clean GC-bench (to benchtest using GNU C dll with C cleanup code) |
|||
make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling) |
|||
make clean GC-static (to test using GC static lib with C (no EH) applications) |
|||
|
|||
|
|||
Building under Linux using the Mingw32 cross development tools |
|||
-------------------------------------------------------------- |
|||
|
|||
You can build the library without leaving Linux by using the Mingw32 cross |
|||
development toolchain. See http://www.libsdl.org/extras/win32/cross/ for |
|||
tools and info. The GNUmakefile contains some support for this, for example: |
|||
|
|||
make CROSS=i386-mingw32msvc- clean GC-inlined |
|||
|
|||
will build pthreadGCn.dll and libpthreadGCn.a (n=version#), provided your |
|||
cross-tools/bin directory is in your PATH (or use the cross-make.sh script |
|||
at the URL above). |
|||
|
|||
|
|||
Building the library as a statically linkable library |
|||
----------------------------------------------------- |
|||
|
|||
General: PTW32_STATIC_LIB must be defined for both the library build and the |
|||
application build. The makefiles supplied and used by the following 'make' |
|||
command lines will define this for you. |
|||
|
|||
MSVC (creates pthreadVCn.lib as a static link lib): |
|||
|
|||
nmake clean VC-static |
|||
|
|||
|
|||
MinGW32 (creates libpthreadGCn.a as a static link lib): |
|||
|
|||
make clean GC-static |
|||
|
|||
|
|||
Define PTW32_STATIC_LIB when building your application. Also, your |
|||
application must call a two non-portable routines to initialise the |
|||
some state on startup and cleanup before exit. One other routine needs |
|||
to be called to cleanup after any Win32 threads have called POSIX API |
|||
routines. See README.NONPORTABLE or the html reference manual pages for |
|||
details on these routines: |
|||
|
|||
BOOL pthread_win32_process_attach_np (void); |
|||
BOOL pthread_win32_process_detach_np (void); |
|||
BOOL pthread_win32_thread_attach_np (void); // Currently a no-op |
|||
BOOL pthread_win32_thread_detach_np (void); |
|||
|
|||
|
|||
The tests makefiles have the same targets but only check that the |
|||
static library is statically linkable. They don't run the full |
|||
testsuite. To run the full testsuite, build the dlls and run the |
|||
dll test targets. |
|||
|
|||
|
|||
Building the library under Cygwin |
|||
--------------------------------- |
|||
|
|||
Cygwin is implementing it's own POSIX threads routines and these |
|||
will be the ones to use if you develop using Cygwin. |
|||
|
|||
|
|||
Ready to run binaries |
|||
--------------------- |
|||
|
|||
For convenience, the following ready-to-run files can be downloaded |
|||
from the FTP site (see under "Availability" below): |
|||
|
|||
pthread.h |
|||
semaphore.h |
|||
sched.h |
|||
pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp |
|||
pthreadVC.lib |
|||
pthreadVCE.dll - built with MSVC++ compiler using C++ EH |
|||
pthreadVCE.lib |
|||
pthreadVSE.dll - built with MSVC compiler using SEH |
|||
pthreadVSE.lib |
|||
pthreadGC.dll - built with Mingw32 GCC |
|||
libpthreadGC.a - derived from pthreadGC.dll |
|||
pthreadGCE.dll - built with Mingw32 G++ |
|||
libpthreadGCE.a - derived from pthreadGCE.dll |
|||
|
|||
As of August 2003 pthreads-win32 pthreadG* versions are built and tested |
|||
using the MinGW + MsysDTK environment current as of that date or later. |
|||
The following file MAY be needed for older MinGW environments. |
|||
|
|||
gcc.dll - needed to build and run applications that use |
|||
pthreadGCE.dll. |
|||
|
|||
|
|||
Building applications with GNU compilers |
|||
---------------------------------------- |
|||
|
|||
If you're using pthreadGC.dll: |
|||
|
|||
With the three header files, pthreadGC.dll and libpthreadGC.a in the |
|||
same directory as your application myapp.c, you could compile, link |
|||
and run myapp.c under Mingw32 as follows: |
|||
|
|||
gcc -o myapp.exe myapp.c -I. -L. -lpthreadGC |
|||
myapp |
|||
|
|||
Or put pthreadGC.dll in an appropriate directory in your PATH, |
|||
put libpthreadGC.a in your system lib directory, and |
|||
put the three header files in your system include directory, |
|||
then use: |
|||
|
|||
gcc -o myapp.exe myapp.c -lpthreadGC |
|||
myapp |
|||
|
|||
|
|||
If you're using pthreadGCE.dll: |
|||
|
|||
With the three header files, pthreadGCE.dll, gcc.dll and libpthreadGCE.a |
|||
in the same directory as your application myapp.c, you could compile, |
|||
link and run myapp.c under Mingw32 as follows: |
|||
|
|||
gcc -x c++ -o myapp.exe myapp.c -I. -L. -lpthreadGCE |
|||
myapp |
|||
|
|||
Or put pthreadGCE.dll and gcc.dll in an appropriate directory in |
|||
your PATH, put libpthreadGCE.a in your system lib directory, and |
|||
put the three header files in your system include directory, |
|||
then use: |
|||
|
|||
gcc -x c++ -o myapp.exe myapp.c -lpthreadGCE |
|||
myapp |
|||
|
|||
|
|||
Availability |
|||
------------ |
|||
|
|||
The complete source code in either unbundled, self-extracting |
|||
Zip file, or tar/gzipped format can be found at: |
|||
|
|||
ftp://sources.redhat.com/pub/pthreads-win32 |
|||
|
|||
The pre-built DLL, export libraries and matching pthread.h can |
|||
be found at: |
|||
|
|||
ftp://sources.redhat.com/pub/pthreads-win32/dll-latest |
|||
|
|||
Home page: |
|||
|
|||
http://sources.redhat.com/pthreads-win32/ |
|||
|
|||
|
|||
Mailing list |
|||
------------ |
|||
|
|||
There is a mailing list for discussing pthreads on Win32. |
|||
To join, send email to: |
|||
|
|||
pthreads-win32-subscribe@sources.redhat.com |
|||
|
|||
Unsubscribe by sending mail to: |
|||
|
|||
pthreads-win32-unsubscribe@sources.redhat.com |
|||
|
|||
|
|||
Acknowledgements |
|||
---------------- |
|||
|
|||
See the ANNOUNCE file for acknowledgements. |
|||
See the 'CONTRIBUTORS' file for the list of contributors. |
|||
|
|||
As much as possible, the ChangeLog file attributes |
|||
contributions and patches that have been incorporated |
|||
in the library to the individuals responsible. |
|||
|
|||
Finally, thanks to all those who work on and contribute to the |
|||
POSIX and Single Unix Specification standards. The maturity of an |
|||
industry can be measured by it's open standards. |
|||
|
|||
---- |
|||
Ross Johnson |
|||
<rpj@callisto.canberra.edu.au> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -1,57 +0,0 @@ |
|||
In ptw32_InterlockedCompareExchange.c, I've added a section for |
|||
Borland's compiler; it's identical to that for the MS compiler except |
|||
that it uses /* ... */ comments instead of ; comments. |
|||
|
|||
[RPJ: need to define HAVE_TASM32 in config.h to use the above.] |
|||
|
|||
|
|||
The other file is a makefile suitable for use with Borland's compiler |
|||
(run "make -fBmakefile" in the directory). It builds a single version |
|||
of the library, pthreadBC.dll and the corresponding pthreadBC.lib |
|||
import library, which is comparable to the pthreadVC version; I can't |
|||
personally see any demand for the versions that include structured or |
|||
C++ exception cancellation handling so I haven't attempted to build |
|||
those versions of the library. (I imagine a static version might be |
|||
of use to some, but we can't legally use that on my commercial |
|||
projects so I can't try that out, unfortunately.) |
|||
|
|||
[RPJ: Added tests\Bmakefile as well.] |
|||
|
|||
Borland C++ doesn't define the ENOSYS constant used by pthreads-win32; |
|||
rather than make more extensive patches to the pthreads-win32 source I |
|||
have a mostly-arbitrary constant for it in the makefile. However this |
|||
doesn't make it visible to the application using the library, so if |
|||
anyone actually wants to use this constant in their apps (why?) |
|||
someone might like to make a seperate NEED_BCC_something define to add |
|||
this stuff. |
|||
|
|||
The makefile also #defines EDEADLK as EDEADLOCK, _timeb as timeb, and |
|||
_ftime as ftime, to deal with the minor differences between the two |
|||
RTLs' naming conventions, and sets the compiler flags as required to |
|||
get a normal compile of the library. |
|||
|
|||
[RPJ: Moved errno values and _timeb etc to pthread.h, so apps will also |
|||
use them.] |
|||
|
|||
(While I'm on the subject, the reason Borland users should recompile |
|||
the library, rather than using the impdef/implib technique suggested |
|||
previously on the mailing list, is that a) the errno constants are |
|||
different, so the results returned by the pthread_* functions can be |
|||
meaningless, and b) the errno variable/pseudo-variable itself is |
|||
different in the MS & BCC runtimes, so you can't access the |
|||
pthreadVC's errno from a Borland C++-compiled host application |
|||
correctly - I imagine there are other potential problems from the RTL |
|||
mismatch too.) |
|||
|
|||
[RPJ: Make sure you use the same RTL in both dll and application builds. |
|||
The dll and tests Bmakefiles use cw32mti.lib. Having some trouble with |
|||
memory read exceptions running the test suite using BCC55.] |
|||
|
|||
Best regards, |
|||
Will |
|||
|
|||
-- |
|||
Will Bryant |
|||
Systems Architect, eCOSM Limited |
|||
Cell +64 21 655 443, office +64 3 365 4176 |
|||
http://www.ecosm.com/ |
File diff suppressed because it is too large
@ -1,783 +0,0 @@ |
|||
This file documents non-portable functions and other issues. |
|||
|
|||
Non-portable functions included in pthreads-win32 |
|||
------------------------------------------------- |
|||
|
|||
BOOL |
|||
pthread_win32_test_features_np(int mask) |
|||
|
|||
This routine allows an application to check which |
|||
run-time auto-detected features are available within |
|||
the library. |
|||
|
|||
The possible features are: |
|||
|
|||
PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE |
|||
Return TRUE if the native version of |
|||
InterlockedCompareExchange() is being used. |
|||
This feature is not meaningful in recent |
|||
library versions as MSVC builds only support |
|||
system implemented ICE. Note that all Mingw |
|||
builds use inlined asm versions of all the |
|||
Interlocked routines. |
|||
PTW32_ALERTABLE_ASYNC_CANCEL |
|||
Return TRUE is the QueueUserAPCEx package |
|||
QUSEREX.DLL is available and the AlertDrv.sys |
|||
driver is loaded into Windows, providing |
|||
alertable (pre-emptive) asyncronous threads |
|||
cancelation. If this feature returns FALSE |
|||
then the default async cancel scheme is in |
|||
use, which cannot cancel blocked threads. |
|||
|
|||
Features may be Or'ed into the mask parameter, in which case |
|||
the routine returns TRUE if any of the Or'ed features would |
|||
return TRUE. At this stage it doesn't make sense to Or features |
|||
but it may some day. |
|||
|
|||
|
|||
void * |
|||
pthread_timechange_handler_np(void *) |
|||
|
|||
To improve tolerance against operator or time service |
|||
initiated system clock changes. |
|||
|
|||
This routine can be called by an application when it |
|||
receives a WM_TIMECHANGE message from the system. At |
|||
present it broadcasts all condition variables so that |
|||
waiting threads can wake up and re-evaluate their |
|||
conditions and restart their timed waits if required. |
|||
|
|||
It has the same return type and argument type as a |
|||
thread routine so that it may be called directly |
|||
through pthread_create(), i.e. as a separate thread. |
|||
|
|||
Parameters |
|||
|
|||
Although a parameter must be supplied, it is ignored. |
|||
The value NULL can be used. |
|||
|
|||
Return values |
|||
|
|||
It can return an error EAGAIN to indicate that not |
|||
all condition variables were broadcast for some reason. |
|||
Otherwise, 0 is returned. |
|||
|
|||
If run as a thread, the return value is returned |
|||
through pthread_join(). |
|||
|
|||
The return value should be cast to an integer. |
|||
|
|||
|
|||
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. |
|||
|
|||
DWORD |
|||
pthread_getw32threadid_np (pthread_t thread) |
|||
|
|||
Returns the Windows native thread ID that the POSIX |
|||
thread "thread" is running as. |
|||
|
|||
Only valid when the library is built where |
|||
! (defined(__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) || defined (__DMC__) |
|||
and otherwise returns 0. |
|||
|
|||
|
|||
int |
|||
pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, int kind) |
|||
|
|||
int |
|||
pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, int *kind) |
|||
|
|||
These two routines are included for Linux compatibility |
|||
and are direct equivalents to the standard routines |
|||
pthread_mutexattr_settype |
|||
pthread_mutexattr_gettype |
|||
|
|||
pthread_mutexattr_setkind_np accepts the following |
|||
mutex kinds: |
|||
PTHREAD_MUTEX_FAST_NP |
|||
PTHREAD_MUTEX_ERRORCHECK_NP |
|||
PTHREAD_MUTEX_RECURSIVE_NP |
|||
|
|||
These are really just equivalent to (respectively): |
|||
PTHREAD_MUTEX_NORMAL |
|||
PTHREAD_MUTEX_ERRORCHECK |
|||
PTHREAD_MUTEX_RECURSIVE |
|||
|
|||
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. |
|||
|
|||
int |
|||
pthread_num_processors_np (void) |
|||
|
|||
This routine (found on HPUX systems) returns the number of processors |
|||
in the system. This implementation actually returns the number of |
|||
processors available to the process, which can be a lower number |
|||
than the system's number, depending on the process's affinity mask. |
|||
|
|||
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. As of version 2.9.0 of the library, static |
|||
builds using either MSC or GCC will call pthread_win32_process_* |
|||
automatically at application startup and exit respectively. |
|||
|
|||
Otherwise, 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 |
|||
the implicit pthread handle that is allocated to a Win32 thread if |
|||
it calls any pthreads routines. Call this routine when the |
|||
Win32 thread exits. |
|||
|
|||
Threads created through pthread_create() do not need to call |
|||
pthread_win32_thread_detach_np(). |
|||
|
|||
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. |
|||
|
|||
|
|||
Non-portable issues |
|||
------------------- |
|||
|
|||
Thread priority |
|||
|
|||
POSIX defines a single contiguous range of numbers that determine a |
|||
thread's priority. Win32 defines priority classes and priority |
|||
levels relative to these classes. Classes are simply priority base |
|||
levels that the defined priority levels are relative to such that, |
|||
changing a process's priority class will change the priority of all |
|||
of it's threads, while the threads retain the same relativity to each |
|||
other. |
|||
|
|||
A Win32 system defines a single contiguous monotonic range of values |
|||
that define system priority levels, just like POSIX. However, Win32 |
|||
restricts individual threads to a subset of this range on a |
|||
per-process basis. |
|||
|
|||
The following table shows the base priority levels for combinations |
|||
of priority class and priority value in Win32. |
|||
|
|||
Process Priority Class Thread Priority Level |
|||
----------------------------------------------------------------- |
|||
1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE |
|||
17 REALTIME_PRIORITY_CLASS -7 |
|||
18 REALTIME_PRIORITY_CLASS -6 |
|||
19 REALTIME_PRIORITY_CLASS -5 |
|||
20 REALTIME_PRIORITY_CLASS -4 |
|||
21 REALTIME_PRIORITY_CLASS -3 |
|||
22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST |
|||
23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL |
|||
24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL |
|||
25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL |
|||
26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST |
|||
27 REALTIME_PRIORITY_CLASS 3 |
|||
28 REALTIME_PRIORITY_CLASS 4 |
|||
29 REALTIME_PRIORITY_CLASS 5 |
|||
30 REALTIME_PRIORITY_CLASS 6 |
|||
31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL |
|||
|
|||
Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported. |
|||
|
|||
|
|||
As you can see, the real priority levels available to any individual |
|||
Win32 thread are non-contiguous. |
|||
|
|||
An application using pthreads-win32 should not make assumptions about |
|||
the numbers used to represent thread priority levels, except that they |
|||
are monotonic between the values returned by sched_get_priority_min() |
|||
and sched_get_priority_max(). E.g. Windows 95, 98, NT, 2000, XP make |
|||
available a non-contiguous range of numbers between -15 and 15, while |
|||
at least one version of WinCE (3.0) defines the minimum priority |
|||
(THREAD_PRIORITY_LOWEST) as 5, and the maximum priority |
|||
(THREAD_PRIORITY_HIGHEST) as 1. |
|||
|
|||
Internally, pthreads-win32 maps any priority levels between |
|||
THREAD_PRIORITY_IDLE and THREAD_PRIORITY_LOWEST to THREAD_PRIORITY_LOWEST, |
|||
or between THREAD_PRIORITY_TIME_CRITICAL and THREAD_PRIORITY_HIGHEST to |
|||
THREAD_PRIORITY_HIGHEST. Currently, this also applies to |
|||
REALTIME_PRIORITY_CLASSi even if levels -7, -6, -5, -4, -3, 3, 4, 5, and 6 |
|||
are supported. |
|||
|
|||
If it wishes, a Win32 application using pthreads-win32 can use the Win32 |
|||
defined priority macros THREAD_PRIORITY_IDLE through |
|||
THREAD_PRIORITY_TIME_CRITICAL. |
|||
|
|||
|
|||
The opacity of the pthread_t datatype |
|||
------------------------------------- |
|||
and possible solutions for portable null/compare/hash, etc |
|||
---------------------------------------------------------- |
|||
|
|||
Because pthread_t is an opague datatype an implementation is permitted to define |
|||
pthread_t in any way it wishes. That includes defining some bits, if it is |
|||
scalar, or members, if it is an aggregate, to store information that may be |
|||
extra to the unique identifying value of the ID. As a result, pthread_t values |
|||
may not be directly comparable. |
|||
|
|||
If you want your code to be portable you must adhere to the following contraints: |
|||
|
|||
1) Don't assume it is a scalar data type, e.g. an integer or pointer value. There |
|||
are several other implementations where pthread_t is also a struct. See our FAQ |
|||
Question 11 for our reasons for defining pthread_t as a struct. |
|||
|
|||
2) You must not compare them using relational or equality operators. You must use |
|||
the API function pthread_equal() to test for equality. |
|||
|
|||
3) Never attempt to reference individual members. |
|||
|
|||
|
|||
The problem |
|||
|
|||
Certain applications would like to be able to access only the 'pure' pthread_t |
|||
id values, primarily to use as keys into data structures to manage threads or |
|||
thread-related data, but this is not possible in a maximally portable and |
|||
standards compliant way for current POSIX threads implementations. |
|||
|
|||
For implementations that define pthread_t as a scalar, programmers often employ |
|||
direct relational and equality operators on pthread_t. This code will break when |
|||
ported to an implementation that defines pthread_t as an aggregate type. |
|||
|
|||
For implementations that define pthread_t as an aggregate, e.g. a struct, |
|||
programmers can use memcmp etc., but then face the prospect that the struct may |
|||
include alignment padding bytes or bits as well as extra implementation-specific |
|||
members that are not part of the unique identifying value. |
|||
|
|||
[While this is not currently the case for pthreads-win32, opacity also |
|||
means that an implementation is free to change the definition, which should |
|||
generally only require that applications be recompiled and relinked, not |
|||
rewritten.] |
|||
|
|||
|
|||
Doesn't the compiler take care of padding? |
|||
|
|||
The C89 and later standards only effectively guarrantee element-by-element |
|||
equivalence following an assignment or pass by value of a struct or union, |
|||
therefore undefined areas of any two otherwise equivalent pthread_t instances |
|||
can still compare differently, e.g. attempting to compare two such pthread_t |
|||
variables byte-by-byte, e.g. memcmp(&t1, &t2, sizeof(pthread_t) may give an |
|||
incorrect result. In practice I'm reasonably confident that compilers routinely |
|||
also copy the padding bytes, mainly because assignment of unions would be far |
|||
too complicated otherwise. But it just isn't guarranteed by the standard. |
|||
|
|||
Illustration: |
|||
|
|||
We have two thread IDs t1 and t2 |
|||
|
|||
pthread_t t1, t2; |
|||
|
|||
In an application we create the threads and intend to store the thread IDs in an |
|||
ordered data structure (linked list, tree, etc) so we need to be able to compare |
|||
them in order to insert them initially and also to traverse. |
|||
|
|||
Suppose pthread_t contains undefined padding bits and our compiler copies our |
|||
pthread_t [struct] element-by-element, then for the assignment: |
|||
|
|||
pthread_t temp = t1; |
|||
|
|||
temp and t1 will be equivalent and correct but a byte-for-byte comparison such as |
|||
memcmp(&temp, &t1, sizeof(pthread_t)) == 0 may not return true as we expect because |
|||
the undefined bits may not have the same values in the two variable instances. |
|||
|
|||
Similarly if passing by value under the same conditions. |
|||
|
|||
If, on the other hand, the undefined bits are at least constant through every |
|||
assignment and pass-by-value then the byte-for-byte comparison |
|||
memcmp(&temp, &t1, sizeof(pthread_t)) == 0 will always return the expected result. |
|||
How can we force the behaviour we need? |
|||
|
|||
|
|||
Solutions |
|||
|
|||
Adding new functions to the standard API or as non-portable extentions is |
|||
the only reliable and portable way to provide the necessary operations. |
|||
Remember also that POSIX is not tied to the C language. The most common |
|||
functions that have been suggested are: |
|||
|
|||
pthread_null() |
|||
pthread_compare() |
|||
pthread_hash() |
|||
|
|||
A single more general purpose function could also be defined as a |
|||
basis for at least the last two of the above functions. |
|||
|
|||
First we need to list the freedoms and constraints with restpect |
|||
to pthread_t so that we can be sure our solution is compatible with the |
|||
standard. |
|||
|
|||
What is known or may be deduced from the standard: |
|||
1) pthread_t must be able to be passed by value, so it must be a single object. |
|||
2) from (1) it must be copyable so cannot embed thread-state information, locks |
|||
or other volatile objects required to manage the thread it associates with. |
|||
3) pthread_t may carry additional information, e.g. for debugging or to manage |
|||
itself. |
|||
4) there is an implicit requirement that the size of pthread_t is determinable |
|||
at compile-time and size-invariant, because it must be able to copy the object |
|||
(i.e. through assignment and pass-by-value). Such copies must be genuine |
|||
duplicates, not merely a copy of a pointer to a common instance such as |
|||
would be the case if pthread_t were defined as an array. |
|||
|
|||
|
|||
Suppose we define the following function: |
|||
|
|||
/* This function shall return it's argument */ |
|||
pthread_t* pthread_normalize(pthread_t* thread); |
|||
|
|||
For scalar or aggregate pthread_t types this function would simply zero any bits |
|||
within the pthread_t that don't uniquely identify the thread, including padding, |
|||
such that client code can return consistent results from operations done on the |
|||
result. If the additional bits are a pointer to an associate structure then |
|||
this function would ensure that the memory used to store that associate |
|||
structure does not leak. After normalization the following compare would be |
|||
valid and repeatable: |
|||
|
|||
memcmp(pthread_normalize(&t1),pthread_normalize(&t2),sizeof(pthread_t)) |
|||
|
|||
Note 1: such comparisons are intended merely to order and sort pthread_t values |
|||
and allow them to index various data structures. They are not intended to reveal |
|||
anything about the relationships between threads, like startup order. |
|||
|
|||
Note 2: the normalized pthread_t is also a valid pthread_t that uniquely |
|||
identifies the same thread. |
|||
|
|||
Advantages: |
|||
1) In most existing implementations this function would reduce to a no-op that |
|||
emits no additional instructions, i.e after in-lining or optimisation, or if |
|||
defined as a macro: |
|||
#define pthread_normalise(tptr) (tptr) |
|||
|
|||
2) This single function allows an application to portably derive |
|||
application-level versions of any of the other required functions. |
|||
|
|||
3) It is a generic function that could enable unanticipated uses. |
|||
|
|||
Disadvantages: |
|||
1) Less efficient than dedicated compare or hash functions for implementations |
|||
that include significant extra non-id elements in pthread_t. |
|||
|
|||
2) Still need to be concerned about padding if copying normalized pthread_t. |
|||
See the later section on defining pthread_t to neutralise padding issues. |
|||
|
|||
Generally a pthread_t may need to be normalized every time it is used, |
|||
which could have a significant impact. However, this is a design decision |
|||
for the implementor in a competitive environment. An implementation is free |
|||
to define a pthread_t in a way that minimises or eliminates padding or |
|||
renders this function a no-op. |
|||
|
|||
Hazards: |
|||
1) Pass-by-reference directly modifies 'thread' so the application must |
|||
synchronise access or ensure that the pointer refers to a copy. The alternative |
|||
of pass-by-value/return-by-value was considered but then this requires two copy |
|||
operations, disadvantaging implementations where this function is not a no-op |
|||
in terms of speed of execution. This function is intended to be used in high |
|||
frequency situations and needs to be efficient, or at least not unnecessarily |
|||
inefficient. The alternative also sits awkwardly with functions like memcmp. |
|||
|
|||
2) [Non-compliant] code that uses relational and equality operators on |
|||
arithmetic or pointer style pthread_t types would need to be rewritten, but it |
|||
should be rewritten anyway. |
|||
|
|||
|
|||
C implementation of null/compare/hash functions using pthread_normalize(): |
|||
|
|||
/* In pthread.h */ |
|||
pthread_t* pthread_normalize(pthread_t* thread); |
|||
|
|||
/* In user code */ |
|||
/* User-level bitclear function - clear bits in loc corresponding to mask */ |
|||
void* bitclear (void* loc, void* mask, size_t count); |
|||
|
|||
typedef unsigned int hash_t; |
|||
|
|||
/* User-level hash function */ |
|||
hash_t hash(void* ptr, size_t count); |
|||
|
|||
/* |
|||
* User-level pthr_null function - modifies the origin thread handle. |
|||
* The concept of a null pthread_t is highly implementation dependent |
|||
* and this design may be far from the mark. For example, in an |
|||
* implementation "null" may mean setting a special value inside one |
|||
* element of pthread_t to mean "INVALID". However, if that value was zero and |
|||
* formed part of the id component then we may get away with this design. |
|||
*/ |
|||
pthread_t* pthr_null(pthread_t* tp) |
|||
{ |
|||
/* |
|||
* This should have the same effect as memset(tp, 0, sizeof(pthread_t)) |
|||
* We're just showing that we can do it. |
|||
*/ |
|||
void* p = (void*) pthread_normalize(tp); |
|||
return (pthread_t*) bitclear(p, p, sizeof(pthread_t)); |
|||
} |
|||
|
|||
/* |
|||
* Safe user-level pthr_compare function - modifies temporary thread handle copies |
|||
*/ |
|||
int pthr_compare_safe(pthread_t thread1, pthread_t thread2) |
|||
{ |
|||
return memcmp(pthread_normalize(&thread1), pthread_normalize(&thread2), sizeof(pthread_t)); |
|||
} |
|||
|
|||
/* |
|||
* Fast user-level pthr_compare function - modifies origin thread handles |
|||
*/ |
|||
int pthr_compare_fast(pthread_t* thread1, pthread_t* thread2) |
|||
{ |
|||
return memcmp(pthread_normalize(&thread1), pthread_normalize(&thread2), sizeof(pthread_t)); |
|||
} |
|||
|
|||
/* |
|||
* Safe user-level pthr_hash function - modifies temporary thread handle copy |
|||
*/ |
|||
hash_t pthr_hash_safe(pthread_t thread) |
|||
{ |
|||
return hash((void *) pthread_normalize(&thread), sizeof(pthread_t)); |
|||
} |
|||
|
|||
/* |
|||
* Fast user-level pthr_hash function - modifies origin thread handle |
|||
*/ |
|||
hash_t pthr_hash_fast(pthread_t thread) |
|||
{ |
|||
return hash((void *) pthread_normalize(&thread), sizeof(pthread_t)); |
|||
} |
|||
|
|||
/* User-level bitclear function - modifies the origin array */ |
|||
void* bitclear(void* loc, void* mask, size_t count) |
|||
{ |
|||
int i; |
|||
for (i=0; i < count; i++) { |
|||
(unsigned char) *loc++ &= ~((unsigned char) *mask++); |
|||
} |
|||
} |
|||
|
|||
/* Donald Knuth hash */ |
|||
hash_t hash(void* str, size_t count) |
|||
{ |
|||
hash_t hash = (hash_t) count; |
|||
unsigned int i = 0; |
|||
|
|||
for(i = 0; i < len; str++, i++) |
|||
{ |
|||
hash = ((hash << 5) ^ (hash >> 27)) ^ (*str); |
|||
} |
|||
return hash; |
|||
} |
|||
|
|||
/* Example of advantage point (3) - split a thread handle into its id and non-id values */ |
|||
pthread_t id = thread, non-id = thread; |
|||
bitclear((void*) &non-id, (void*) pthread_normalize(&id), sizeof(pthread_t)); |
|||
|
|||
|
|||
A pthread_t type change proposal to neutralise the effects of padding |
|||
|
|||
Even if pthread_nornalize() is available, padding is still a problem because |
|||
the standard only garrantees element-by-element equivalence through |
|||
copy operations (assignment and pass-by-value). So padding bit values can |
|||
still change randomly after calls to pthread_normalize(). |
|||
|
|||
[I suspect that most compilers take the easy path and always byte-copy anyway, |
|||
partly because it becomes too complex to do (e.g. unions that contain sub-aggregates) |
|||
but also because programmers can easily design their aggregates to minimise and |
|||
often eliminate padding]. |
|||
|
|||
How can we eliminate the problem of padding bytes in structs? Could |
|||
defining pthread_t as a union rather than a struct provide a solution? |
|||
|
|||
In fact, the Linux pthread.h defines most of it's pthread_*_t objects (but not |
|||
pthread_t itself) as unions, possibly for this and/or other reasons. We'll |
|||
borrow some element naming from there but the ideas themselves are well known |
|||
- the __align element used to force alignment of the union comes from K&R's |
|||
storage allocator example. |
|||
|
|||
/* Essentially our current pthread_t renamed */ |
|||
typedef struct { |
|||
struct thread_state_t * __p; |
|||
long __x; /* sequence counter */ |
|||
} thread_id_t; |
|||
|
|||
Ensuring that the last element in the above struct is a long ensures that the |
|||
overall struct size is a multiple of sizeof(long), so there should be no trailing |
|||
padding in this struct or the union we define below. |
|||
(Later we'll see that we can handle internal but not trailing padding.) |
|||
|
|||
/* New pthread_t */ |
|||
typedef union { |
|||
char __size[sizeof(thread_id_t)]; /* array as the first element */ |
|||
thread_id_t __tid; |
|||
long __align; /* Ensure that the union starts on long boundary */ |
|||
} pthread_t; |
|||
|
|||
This guarrantees that, during an assignment or pass-by-value, the compiler copies |
|||
every byte in our thread_id_t because the compiler guarrantees that the __size |
|||
array, which we have ensured is the equal-largest element in the union, retains |
|||
equivalence. |
|||
|
|||
This means that pthread_t values stored, assigned and passed by value will at least |
|||
carry the value of any undefined padding bytes along and therefore ensure that |
|||
those values remain consistent. Our comparisons will return consistent results and |
|||
our hashes of [zero initialised] pthread_t values will also return consistent |
|||
results. |
|||
|
|||
We have also removed the need for a pthread_null() function; we can initialise |
|||
at declaration time or easily create our own const pthread_t to use in assignments |
|||
later: |
|||
|
|||
const pthread_t null_tid = {0}; /* braces are required */ |
|||
|
|||
pthread_t t; |
|||
... |
|||
t = null_tid; |
|||
|
|||
|
|||
Note that we don't have to explicitly make use of the __size array at all. It's |
|||
there just to force the compiler behaviour we want. |
|||
|
|||
|
|||
Partial solutions without a pthread_normalize function |
|||
|
|||
|
|||
An application-level pthread_null and pthread_compare proposal |
|||
(and pthread_hash proposal by extention) |
|||
|
|||
In order to deal with the problem of scalar/aggregate pthread_t type disparity in |
|||
portable code I suggest using an old-fashioned union, e.g.: |
|||
|
|||
Contraints: |
|||
- there is no padding, or padding values are preserved through assignment and |
|||
pass-by-value (see above); |
|||
- there are no extra non-id values in the pthread_t. |
|||
|
|||
|
|||
Example 1: A null initialiser for pthread_t variables... |
|||
|
|||
typedef union { |
|||
unsigned char b[sizeof(pthread_t)]; |
|||
pthread_t t; |
|||
} init_t; |
|||
|
|||
const init_t initial = {0}; |
|||
|
|||
pthread_t tid = initial.t; /* init tid to all zeroes */ |
|||
|
|||
|
|||
Example 2: A comparison function for pthread_t values |
|||
|
|||
typedef union { |
|||
unsigned char b[sizeof(pthread_t)]; |
|||
pthread_t t; |
|||
} pthcmp_t; |
|||
|
|||
int pthcmp(pthread_t left, pthread_t right) |
|||
{ |
|||
/* |
|||
* Compare two pthread handles in a way that imposes a repeatable but arbitrary |
|||
* ordering on them. |
|||
* I.e. given the same set of pthread_t handles the ordering should be the same |
|||
* each time but the order has no particular meaning other than that. E.g. |
|||
* the ordering does not imply the thread start sequence, or any other |
|||
* relationship between threads. |
|||
* |
|||
* Return values are: |
|||
* 1 : left is greater than right |
|||
* 0 : left is equal to right |
|||
* -1 : left is less than right |
|||
*/ |
|||
int i; |
|||
pthcmp_t L, R; |
|||
L.t = left; |
|||
R.t = right; |
|||
for (i = 0; i < sizeof(pthread_t); i++) |
|||
{ |
|||
if (L.b[i] > R.b[i]) |
|||
return 1; |
|||
else if (L.b[i] < R.b[i]) |
|||
return -1; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
It has been pointed out that the C99 standard allows for the possibility that |
|||
integer types also may include padding bits, which could invalidate the above |
|||
method. This addition to C99 was specifically included after it was pointed |
|||
out that there was one, presumably not particularly well known, architecture |
|||
that included a padding bit in it's 32 bit integer type. See section 6.2.6.2 |
|||
of both the standard and the rationale, specifically the paragraph starting at |
|||
line 16 on page 43 of the rationale. |
|||
|
|||
|
|||
An aside |
|||
|
|||
Certain compilers, e.g. gcc and one of the IBM compilers, include a feature |
|||
extention: provided the union contains a member of the same type as the |
|||
object then the object may be cast to the union itself. |
|||
|
|||
We could use this feature to speed up the pthrcmp() function from example 2 |
|||
above by casting rather than assigning the pthread_t arguments to the union, e.g.: |
|||
|
|||
int pthcmp(pthread_t left, pthread_t right) |
|||
{ |
|||
/* |
|||
* Compare two pthread handles in a way that imposes a repeatable but arbitrary |
|||
* ordering on them. |
|||
* I.e. given the same set of pthread_t handles the ordering should be the same |
|||
* each time but the order has no particular meaning other than that. E.g. |
|||
* the ordering does not imply the thread start sequence, or any other |
|||
* relationship between threads. |
|||
* |
|||
* Return values are: |
|||
* 1 : left is greater than right |
|||
* 0 : left is equal to right |
|||
* -1 : left is less than right |
|||
*/ |
|||
int i; |
|||
for (i = 0; i < sizeof(pthread_t); i++) |
|||
{ |
|||
if (((pthcmp_t)left).b[i] > ((pthcmp_t)right).b[i]) |
|||
return 1; |
|||
else if (((pthcmp_t)left).b[i] < ((pthcmp_t)right).b[i]) |
|||
return -1; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
Result thus far |
|||
|
|||
We can't remove undefined bits if they are there in pthread_t already, but we have |
|||
attempted to render them inert for comparison and hashing functions by making them |
|||
consistent through assignment, copy and pass-by-value. |
|||
|
|||
Note: Hashing pthread_t values requires that all pthread_t variables be initialised |
|||
to the same value (usually all zeros) before being assigned a proper thread ID, i.e. |
|||
to ensure that any padding bits are zero, or at least the same value for all |
|||
pthread_t. Since all pthread_t values are generated by the library in the first |
|||
instance this need not be an application-level operation. |
|||
|
|||
|
|||
Conclusion |
|||
|
|||
I've attempted to resolve the multiple issues of type opacity and the possible |
|||
presence of undefined bits and bytes in pthread_t values, which prevent |
|||
applications from comparing or hashing pthread handles. |
|||
|
|||
Two complimentary partial solutions have been proposed, one an application-level |
|||
scheme to handle both scalar and aggregate pthread_t types equally, plus a |
|||
definition of pthread_t itself that neutralises padding bits and bytes by |
|||
coercing semantics out of the compiler to eliminate variations in the values of |
|||
padding bits. |
|||
|
|||
I have not provided any solution to the problem of handling extra values embedded |
|||
in pthread_t, e.g. debugging or trap information that an implementation is entitled |
|||
to include. Therefore none of this replaces the portability and flexibility of API |
|||
functions but what functions are needed? The threads standard is unlikely to |
|||
include that can be implemented by a combination of existing features and more |
|||
generic functions (several references in the threads rationale suggest this. |
|||
Therefore I propose that the following function could replace the several functions |
|||
that have been suggested in conversations: |
|||
|
|||
pthread_t * pthread_normalize(pthread_t * handle); |
|||
|
|||
For most existing pthreads implementations this function, or macro, would reduce to |
|||
a no-op with zero call overhead. |
@ -1,62 +0,0 @@ |
|||
Watcom compiler notes |
|||
===================== |
|||
|
|||
Status |
|||
------ |
|||
Not yet usable. Although the library builds under Watcom it |
|||
substantially fails the test suite. |
|||
|
|||
There is a working Wmakefile for wmake for the library build. |
|||
|
|||
invoke as any of: |
|||
wmake -f Wmakefile clean WC |
|||
wmake -f Wmakefile clean WC-inlined |
|||
wmake -f Wmakefile clean WCE |
|||
wmake -f Wmakefile clean WCE-inlined |
|||
|
|||
These build pthreadWC.dll and pthreadWCE.dll. |
|||
|
|||
There is a working Wmakefile for wmake for the test suite. |
|||
|
|||
invoke as any of: |
|||
wmake -f Wmakefile clean WC |
|||
wmake -f Wmakefile clean WCX |
|||
wmake -f Wmakefile clean WCE |
|||
wmake -f Wmakefile clean WC-bench |
|||
wmake -f Wmakefile clean WCX-bench |
|||
wmake -f Wmakefile clean WCE-bench |
|||
|
|||
|
|||
Current known problems |
|||
---------------------- |
|||
|
|||
Library build: |
|||
The Watcom compiler uses a different default call convention to MS C or GNU C and so |
|||
applications are not compatible with pthreadVC.dll etc using pre 2003-10-14 versions |
|||
of pthread.h, sched.h, or semaphore.h. The cdecl attribute can be used on exposed |
|||
function prototypes to force compatibility with MS C built DLLs. |
|||
|
|||
However, there appear to be other incompatibilities. Errno.h, for example, defines |
|||
different values for the standard C and POSIX errors to those defined by the MS C |
|||
errno.h. It may be that references to Watcom's threads compatible 'errno' do set |
|||
and return translated numbers consistently, but I have not verified this. |
|||
|
|||
Watcom defines errno as a dereferenced pointer returned by the function |
|||
_get_errno_ptr(). This is similar to both the MS and GNU C environments for |
|||
multithreaded use. However, the Watcom version appears to have a number of problems: |
|||
|
|||
- different threads return the same pointer value. Compare with the MS and GNU C |
|||
versions which correctly return different values (since each thread must maintain |
|||
a thread specific errno value). |
|||
|
|||
- an errno value set within the DLL appears as zero in the application even though |
|||
both share the same thread. |
|||
|
|||
Therefore applications built using the Watcom compiler may need to use |
|||
a Watcom built version of the library (pthreadWC.dll). If this is the case, then |
|||
the cdecl function attribute should not be required. |
|||
|
|||
Application builds: |
|||
The test suite fails with the Watcom compiler. |
|||
|
|||
Test semaphore1.c fails for pthreadWC.dll because errno returns 0 instead of EAGAIN. |
@ -1,6 +0,0 @@ |
|||
WinCE port |
|||
---------- |
|||
(See the file WinCE-PORT for a detailed explanation.) |
|||
|
|||
Make sure you define "WINCE" amongst your compiler flags (eg. -DWINCE). |
|||
The config.h file will define all the necessary defines for you. |
@ -1,7 +0,0 @@ |
|||
Things that aren't done yet |
|||
--------------------------- |
|||
|
|||
1. Implement PTHREAD_PROCESS_SHARED for semaphores, mutexes, |
|||
condition variables, read/write locks, barriers. |
|||
|
|||
|
@ -1,222 +0,0 @@ |
|||
NOTE: The comments in this file relate to the original WinCE port |
|||
done by Tristan Savatier. The semaphore routines have been |
|||
completely rewritten since (2005-04-25), having been progressively |
|||
broken more and more by changes to the library. All of the semaphore |
|||
routines implemented for W9x/WNT/2000 and up should now also work for |
|||
WinCE. Also, pthread_mutex_timedlock should now work. |
|||
|
|||
Additional WinCE updates have been applied since this as well. Check the |
|||
ChangeLog file and search for WINCE for example. (2007-01-07) |
|||
|
|||
[RPJ] |
|||
|
|||
---- |
|||
|
|||
Some interesting news: |
|||
|
|||
I have been able to port pthread-win32 to Windows-CE, |
|||
which uses a subset of the WIN32 API. |
|||
|
|||
Since we intend to keep using pthread-win32 for our |
|||
Commercial WinCE developments, I would be very interested |
|||
if WinCE support could be added to the main source tree |
|||
of pthread-win32. Also, I would like to be credited |
|||
for this port :-) |
|||
|
|||
Now, here is the story... |
|||
|
|||
The port was performed and tested on a Casio "Cassiopeia" |
|||
PalmSize PC, which runs a MIP processor. The OS in the |
|||
Casio is WinCE version 2.11, but I used VC++ 6.0 with |
|||
the WinCE SDK for version 2.01. |
|||
|
|||
I used pthread-win32 to port a heavily multithreaded |
|||
commercial application (real-time MPEG video player) |
|||
from Linux to WinCE. I consider the changes that |
|||
I have done to be quite well tested. |
|||
|
|||
Overall the modifications that we had to do are minor. |
|||
|
|||
The WinCE port were based on pthread-win32-snap-1999-05-30, |
|||
but I am certain that they can be integrated very easiely |
|||
to more recent versions of the source. |
|||
|
|||
I have attached the modified source code: |
|||
pthread-win32-snap-1999-05-30-WinCE. |
|||
|
|||
All the changes do not affect the code compiled on non-WinCE |
|||
environment, provided that the macros used for WinCE compilation |
|||
are not used, of course! |
|||
|
|||
Overall description of the WinCE port: |
|||
------------------------------------- |
|||
|
|||
Most of the changes had to be made in areas where |
|||
pthread-win32 was relying on some standard-C librairies |
|||
(e.g. _ftime, calloc, errno), which are not available |
|||
on WinCE. We have changed the code to use native Win32 |
|||
API instead (or in some cases we made wrappers). |
|||
|
|||
The Win32 Semaphores are not available, |
|||
so we had to re-implement Semaphores using mutexes |
|||
and events. |
|||
|
|||
Limitations / known problems of the WinCE port: |
|||
---------------------------------------------- |
|||
|
|||
Not all the semaphore routines have been ported |
|||
(semaphores are defined by Posix but are not part |
|||
pf pthread). I have just done enough to make |
|||
pthread routines (that rely internally on semaphores) |
|||
work, like signal conditions. |
|||
|
|||
I noticed that the Win32 threads work slightly |
|||
differently on WinCE. This may have some impact |
|||
on some tricky parts of pthread-win32, but I have |
|||
not really investigated. For example, on WinCE, |
|||
the process is killed if the main thread falls off |
|||
the bottom (or calls pthread_exit), regardless |
|||
of the existence of any other detached thread. |
|||
Microsoft manual indicates that this behavior is |
|||
deffirent from that of Windows Threads for other |
|||
Win32 platforms. |
|||
|
|||
|
|||
Detailed descriptions of the changes and rationals: |
|||
|
|||
------------------------------------ |
|||
- use a new macro NEED_ERRNO. |
|||
|
|||
If defined, the code in errno.c that defines a reentrant errno |
|||
is compiled, regardless of _MT and _REENTRANT. |
|||
|
|||
Rational: On WinCE, there is no support for <stdio.h>, <errno.h> or |
|||
any other standard C library, i.e. even if _MT or _REENTRANT |
|||
is defined, errno is not provided by any library. NEED_ERRNO |
|||
must be set to compile for WinCE. |
|||
|
|||
------------------------------------ |
|||
- In implement.h, change #include <semaphore.h> to #include "semaphore.h". |
|||
|
|||
Rational: semaphore.h is provided in pthread-win32 and should not |
|||
be searched in the systems standard include. would not compile. |
|||
This change does not seem to create problems on "classic" win32 |
|||
(e.g. win95). |
|||
|
|||
------------------------------------ |
|||
- use a new macro NEED_CALLOC. |
|||
|
|||
If defined, some code in misc.c will provide a replacement |
|||
for calloc, which is not available on Win32. |
|||
|
|||
|
|||
------------------------------------ |
|||
- use a new macro NEED_CREATETHREAD. |
|||
|
|||
If defined, implement.h defines the macro _beginthreadex |
|||
and _endthreadex. |
|||
|
|||
Rational: On WinCE, the wrappers _beginthreadex and _endthreadex |
|||
do not exist. The native Win32 routines must be used. |
|||
|
|||
------------------------------------ |
|||
- in misc.c: |
|||
|
|||
#ifdef NEED_DUPLICATEHANDLE |
|||
/* DuplicateHandle does not exist on WinCE */ |
|||
self->threadH = GetCurrentThread(); |
|||
#else |
|||
if( !DuplicateHandle( |
|||
GetCurrentProcess(), |
|||
GetCurrentThread(), |
|||
GetCurrentProcess(), |
|||
&self->threadH, |
|||
0, |
|||
FALSE, |
|||
DUPLICATE_SAME_ACCESS ) ) |
|||
{ |
|||
free( self ); |
|||
return (NULL); |
|||
} |
|||
#endif |
|||
|
|||
Rational: On WinCE, DuplicateHandle does not exist. I could not understand |
|||
why DuplicateHandle must be used. It seems to me that getting the current |
|||
thread handle with GetCurrentThread() is sufficient, and it seems to work |
|||
perfectly fine, so maybe DuplicateHandle was just plain useless to begin with ? |
|||
|
|||
------------------------------------ |
|||
- In private.c, added some code at the beginning of ptw32_processInitialize |
|||
to detect the case of multiple calls to ptw32_processInitialize. |
|||
|
|||
Rational: In order to debug pthread-win32, it is easier to compile |
|||
it as a regular library (it is not possible to debug DLL's on winCE). |
|||
In that case, the application must call ptw32_rocessInitialize() |
|||
explicitely, to initialize pthread-win32. It is safer in this circumstance |
|||
to handle the case where ptw32_processInitialize() is called on |
|||
an already initialized library: |
|||
|
|||
int |
|||
ptw32_processInitialize (void) |
|||
{ |
|||
if (ptw32_processInitialized) { |
|||
/* |
|||
* ignore if already initialized. this is useful for |
|||
* programs that uses a non-dll pthread |
|||
* library. such programs must call ptw32_processInitialize() explicitely, |
|||
* since this initialization routine is automatically called only when |
|||
* the dll is loaded. |
|||
*/ |
|||
return TRUE; |
|||
} |
|||
ptw32_processInitialized = TRUE; |
|||
[...] |
|||
} |
|||
|
|||
------------------------------------ |
|||
- in private.c, if macro NEED_FTIME is defined, add routines to |
|||
convert timespec_to_filetime and filetime_to_timespec, and modified |
|||
code that was using _ftime() to use Win32 API instead. |
|||
|
|||
Rational: _ftime is not available on WinCE. It is necessary to use |
|||
the native Win32 time API instead. |
|||
|
|||
Note: the routine timespec_to_filetime is provided as a convenience and a mean |
|||
to test that filetime_to_timespec works, but it is not used by the library. |
|||
|
|||
------------------------------------ |
|||
- in semaphore.c, if macro NEED_SEM is defined, add code for the routines |
|||
_increase_semaphore and _decrease_semaphore, and modify significantly |
|||
the implementation of the semaphores so that it does not use CreateSemaphore. |
|||
|
|||
Rational: CreateSemaphore is not available on WinCE. I had to re-implement |
|||
semaphores using mutexes and Events. |
|||
|
|||
Note: Only the semaphore routines that are used by pthread are implemented |
|||
(i.e. signal conditions rely on a subset of the semaphores routines, and |
|||
this subset works). Some other semaphore routines (e.g. sem_trywait) are |
|||
not yet supported on my WinCE port (and since I don't need them, I am not |
|||
planning to do anything about them). |
|||
|
|||
------------------------------------ |
|||
- in tsd.c, changed the code that defines TLS_OUT_OF_INDEXES |
|||
|
|||
/* TLS_OUT_OF_INDEXES not defined on WinCE */ |
|||
#ifndef TLS_OUT_OF_INDEXES |
|||
#define TLS_OUT_OF_INDEXES 0xffffffff |
|||
#endif |
|||
|
|||
Rational: TLS_OUT_OF_INDEXES is not defined in any standard include file |
|||
on WinCE. |
|||
|
|||
------------------------------------ |
|||
- added file need_errno.h |
|||
|
|||
Rational: On WinCE, there is no errno.h file. need_errno.h is just a |
|||
copy of windows version of errno.h, with minor modifications due to the fact |
|||
that some of the error codes are defined by the WinCE socket library. |
|||
In pthread.h, if NEED_ERRNO is defined, the file need_errno.h is |
|||
included (instead of <errno.h>). |
|||
|
|||
|
|||
-- eof |
@ -1,53 +0,0 @@ |
|||
/*
|
|||
* attr.c |
|||
* |
|||
* Description: |
|||
* This translation unit agregates operations on thread attribute objects. |
|||
* It is used for inline optimisation. |
|||
* |
|||
* The included modules are used separately when static executable sizes |
|||
* must be minimised. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
#include "pthread_attr_init.c" |
|||
#include "pthread_attr_destroy.c" |
|||
#include "pthread_attr_getdetachstate.c" |
|||
#include "pthread_attr_setdetachstate.c" |
|||
#include "pthread_attr_getstackaddr.c" |
|||
#include "pthread_attr_setstackaddr.c" |
|||
#include "pthread_attr_getstacksize.c" |
|||
#include "pthread_attr_setstacksize.c" |
|||
#include "pthread_attr_getscope.c" |
|||
#include "pthread_attr_setscope.c" |
@ -1,69 +0,0 @@ |
|||
/*
|
|||
* autostatic.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements static auto-init and auto-exit logic. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if defined(PTW32_STATIC_LIB) |
|||
|
|||
#if defined(__MINGW64__) || defined(__MINGW32__) || defined(_MSC_VER) |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
static void on_process_init(void) |
|||
{ |
|||
pthread_win32_process_attach_np (); |
|||
} |
|||
|
|||
static void on_process_exit(void) |
|||
{ |
|||
pthread_win32_thread_detach_np (); |
|||
pthread_win32_process_detach_np (); |
|||
} |
|||
|
|||
#if defined(__MINGW64__) || defined(__MINGW32__) |
|||
# define attribute_section(a) __attribute__((section(a))) |
|||
#elif defined(_MSC_VER) |
|||
# define attribute_section(a) __pragma(section(a,long,read)); __declspec(allocate(a)) |
|||
#endif |
|||
|
|||
attribute_section(".ctors") void *gcc_ctor = on_process_init; |
|||
attribute_section(".dtors") void *gcc_dtor = on_process_exit; |
|||
|
|||
attribute_section(".CRT$XCU") void *msc_ctor = on_process_init; |
|||
attribute_section(".CRT$XPU") void *msc_dtor = on_process_exit; |
|||
|
|||
#endif /* defined(__MINGW64__) || defined(__MINGW32__) || defined(_MSC_VER) */ |
|||
|
|||
#endif /* PTW32_STATIC_LIB */ |
@ -1,47 +0,0 @@ |
|||
/*
|
|||
* barrier.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
#include "pthread_barrier_init.c" |
|||
#include "pthread_barrier_destroy.c" |
|||
#include "pthread_barrier_wait.c" |
|||
#include "pthread_barrierattr_init.c" |
|||
#include "pthread_barrierattr_destroy.c" |
|||
#include "pthread_barrierattr_getpshared.c" |
|||
#include "pthread_barrierattr_setpshared.c" |
@ -1,9 +0,0 @@ |
|||
; Build the pthreads library with the Digital Mars Compiler |
|||
; |
|||
set DMCDIR=c:\dm |
|||
|
|||
; RELEASE |
|||
%DMCDIR%\bin\dmc -D_WIN32_WINNT -D_MT -DHAVE_PTW32_CONFIG_H -I.;c:\dm\include -o+all -WD pthread.c user32.lib+kernel32.lib+wsock32.lib -L/impl -L/NODEBUG -L/SU:WINDOWS |
|||
|
|||
; DEBUG |
|||
%DMCDIR%\bin\dmc -g -D_WIN32_WINNT -D_MT -DHAVE_PTW32_CONFIG_H -I.;c:\dm\include -o+all -WD pthread.c user32.lib+kernel32.lib+wsock32.lib -L/impl -L/SU:WINDOWS |
@ -1,44 +0,0 @@ |
|||
/*
|
|||
* cancel.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions related to thread cancellation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
#include "pthread_setcancelstate.c" |
|||
#include "pthread_setcanceltype.c" |
|||
#include "pthread_testcancel.c" |
|||
#include "pthread_cancel.c" |
@ -1,148 +0,0 @@ |
|||
/*
|
|||
* cleanup.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines associated |
|||
* with cleaning up threads. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
/*
|
|||
* The functions ptw32_pop_cleanup and ptw32_push_cleanup |
|||
* are implemented here for applications written in C with no |
|||
* SEH or C++ destructor support. |
|||
*/ |
|||
|
|||
ptw32_cleanup_t * |
|||
ptw32_pop_cleanup (int execute) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function pops the most recently pushed cleanup |
|||
* handler. If execute is nonzero, then the cleanup handler |
|||
* is executed if non-null. |
|||
* |
|||
* PARAMETERS |
|||
* execute |
|||
* if nonzero, execute the cleanup handler |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function pops the most recently pushed cleanup |
|||
* handler. If execute is nonzero, then the cleanup handler |
|||
* is executed if non-null. |
|||
* NOTE: specify 'execute' as nonzero to avoid duplication |
|||
* of common cleanup code. |
|||
* |
|||
* RESULTS |
|||
* N/A |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
ptw32_cleanup_t *cleanup; |
|||
|
|||
cleanup = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); |
|||
|
|||
if (cleanup != NULL) |
|||
{ |
|||
if (execute && (cleanup->routine != NULL)) |
|||
{ |
|||
|
|||
(*cleanup->routine) (cleanup->arg); |
|||
|
|||
} |
|||
|
|||
pthread_setspecific (ptw32_cleanupKey, (void *) cleanup->prev); |
|||
|
|||
} |
|||
|
|||
return (cleanup); |
|||
|
|||
} /* ptw32_pop_cleanup */ |
|||
|
|||
|
|||
void |
|||
ptw32_push_cleanup (ptw32_cleanup_t * cleanup, |
|||
ptw32_cleanup_callback_t routine, void *arg) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function pushes a new cleanup handler onto the thread's stack |
|||
* of cleanup handlers. Each cleanup handler pushed onto the stack is |
|||
* popped and invoked with the argument 'arg' when |
|||
* a) the thread exits by calling 'pthread_exit', |
|||
* b) when the thread acts on a cancellation request, |
|||
* c) or when the thread calls pthread_cleanup_pop with a nonzero |
|||
* 'execute' argument |
|||
* |
|||
* PARAMETERS |
|||
* cleanup |
|||
* a pointer to an instance of pthread_cleanup_t, |
|||
* |
|||
* routine |
|||
* pointer to a cleanup handler, |
|||
* |
|||
* arg |
|||
* parameter to be passed to the cleanup handler |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function pushes a new cleanup handler onto the thread's stack |
|||
* of cleanup handlers. Each cleanup handler pushed onto the stack is |
|||
* popped and invoked with the argument 'arg' when |
|||
* a) the thread exits by calling 'pthread_exit', |
|||
* b) when the thread acts on a cancellation request, |
|||
* c) or when the thrad calls pthread_cleanup_pop with a nonzero |
|||
* 'execute' argument |
|||
* NOTE: pthread_push_cleanup, ptw32_pop_cleanup must be paired |
|||
* in the same lexical scope. |
|||
* |
|||
* RESULTS |
|||
* pthread_cleanup_t * |
|||
* pointer to the previous cleanup |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
cleanup->routine = routine; |
|||
cleanup->arg = arg; |
|||
|
|||
cleanup->prev = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); |
|||
|
|||
pthread_setspecific (ptw32_cleanupKey, (void *) cleanup); |
|||
|
|||
} /* ptw32_push_cleanup */ |
@ -1,50 +0,0 @@ |
|||
/*
|
|||
* condvar.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
* |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
#include "ptw32_cond_check_need_init.c" |
|||
#include "pthread_condattr_init.c" |
|||
#include "pthread_condattr_destroy.c" |
|||
#include "pthread_condattr_getpshared.c" |
|||
#include "pthread_condattr_setpshared.c" |
|||
#include "pthread_cond_init.c" |
|||
#include "pthread_cond_destroy.c" |
|||
#include "pthread_cond_wait.c" |
|||
#include "pthread_cond_signal.c" |
@ -1,153 +0,0 @@ |
|||
/* config.h */ |
|||
|
|||
#ifndef PTW32_CONFIG_H |
|||
#define PTW32_CONFIG_H |
|||
|
|||
/*********************************************************************
|
|||
* Defaults: see target specific redefinitions below. |
|||
*********************************************************************/ |
|||
|
|||
/* We're building the pthreads-win32 library */ |
|||
#define PTW32_BUILD |
|||
|
|||
/* Do we know about the C type sigset_t? */ |
|||
#undef HAVE_SIGSET_T |
|||
|
|||
/* Define if you have the <signal.h> header file. */ |
|||
#undef HAVE_SIGNAL_H |
|||
|
|||
/* Define if you have the Borland TASM32 or compatible assembler. */ |
|||
#undef HAVE_TASM32 |
|||
|
|||
/* Define if you don't have Win32 DuplicateHandle. (eg. WinCE) */ |
|||
#undef NEED_DUPLICATEHANDLE |
|||
|
|||
/* Define if you don't have Win32 _beginthreadex. (eg. WinCE) */ |
|||
#undef NEED_CREATETHREAD |
|||
|
|||
/* Define if you don't have Win32 errno. (eg. WinCE) */ |
|||
#undef NEED_ERRNO |
|||
|
|||
/* Define if you don't have Win32 calloc. (eg. WinCE) */ |
|||
#undef NEED_CALLOC |
|||
|
|||
/* Define if you don't have Win32 ftime. (eg. WinCE) */ |
|||
#undef NEED_FTIME |
|||
|
|||
/* Define if you don't have Win32 semaphores. (eg. WinCE 2.1 or earlier) */ |
|||
#undef NEED_SEM |
|||
|
|||
/* Define if you need to convert string parameters to unicode. (eg. WinCE) */ |
|||
#undef NEED_UNICODE_CONSTS |
|||
|
|||
/* Define if your C (not C++) compiler supports "inline" functions. */ |
|||
#undef HAVE_C_INLINE |
|||
|
|||
/* Do we know about type mode_t? */ |
|||
#undef HAVE_MODE_T |
|||
|
|||
/*
|
|||
* Define if GCC has atomic builtins, i.e. __sync_* intrinsics |
|||
* __sync_lock_* is implemented in mingw32 gcc 4.5.2 at least |
|||
* so this define does not turn those on or off. If you get an |
|||
* error from __sync_lock* then consider upgrading your gcc. |
|||
*/ |
|||
#undef HAVE_GCC_ATOMIC_BUILTINS |
|||
|
|||
/* Define if you have the timespec struct */ |
|||
#undef HAVE_STRUCT_TIMESPEC |
|||
|
|||
/* Define if you don't have the GetProcessAffinityMask() */ |
|||
#undef NEED_PROCESS_AFFINITY_MASK |
|||
|
|||
/* Define if your version of Windows TLSGetValue() clears WSALastError
|
|||
* and calling SetLastError() isn't enough restore it. You'll also need to |
|||
* link against wsock32.lib (or libwsock32.a for MinGW). |
|||
*/ |
|||
#undef RETAIN_WSALASTERROR |
|||
|
|||
/*
|
|||
# ---------------------------------------------------------------------- |
|||
# The library can be built with some alternative behaviour to better |
|||
# facilitate development of applications on Win32 that will be ported |
|||
# to other POSIX systems. |
|||
# |
|||
# Nothing described here will make the library non-compliant and strictly |
|||
# compliant applications will not be affected in any way, but |
|||
# applications that make assumptions that POSIX does not guarantee are |
|||
# not strictly compliant and may fail or misbehave with some settings. |
|||
# |
|||
# PTW32_THREAD_ID_REUSE_INCREMENT |
|||
# Purpose: |
|||
# POSIX says that applications should assume that thread IDs can be |
|||
# recycled. However, Solaris (and some other systems) use a [very large] |
|||
# sequence number as the thread ID, which provides virtual uniqueness. |
|||
# This provides a very high but finite level of safety for applications |
|||
# that are not meticulous in tracking thread lifecycles e.g. applications |
|||
# that call functions which target detached threads without some form of |
|||
# thread exit synchronisation. |
|||
# |
|||
# Usage: |
|||
# Set to any value in the range: 0 <= value < 2^wordsize. |
|||
# Set to 0 to emulate reusable thread ID behaviour like Linux or *BSD. |
|||
# Set to 1 for unique thread IDs like Solaris (this is the default). |
|||
# Set to some factor of 2^wordsize to emulate smaller word size types |
|||
# (i.e. will wrap sooner). This might be useful to emulate some embedded |
|||
# systems. |
|||
# |
|||
# define PTW32_THREAD_ID_REUSE_INCREMENT 0 |
|||
# |
|||
# ---------------------------------------------------------------------- |
|||
*/ |
|||
#undef PTW32_THREAD_ID_REUSE_INCREMENT |
|||
|
|||
|
|||
/*********************************************************************
|
|||
* Target specific groups |
|||
* |
|||
* If you find that these are incorrect or incomplete please report it |
|||
* to the pthreads-win32 maintainer. Thanks. |
|||
*********************************************************************/ |
|||
#if defined(WINCE) |
|||
#define NEED_DUPLICATEHANDLE |
|||
#define NEED_CREATETHREAD |
|||
#define NEED_ERRNO |
|||
#define NEED_CALLOC |
|||
#define NEED_FTIME |
|||
/* #define NEED_SEM */ |
|||
#define NEED_UNICODE_CONSTS |
|||
#define NEED_PROCESS_AFFINITY_MASK |
|||
/* This may not be needed */ |
|||
#define RETAIN_WSALASTERROR |
|||
#endif |
|||
|
|||
#if defined(_UWIN) |
|||
#define HAVE_MODE_T |
|||
#define HAVE_STRUCT_TIMESPEC |
|||
#endif |
|||
|
|||
#if defined(__GNUC__) |
|||
#define HAVE_C_INLINE |
|||
#endif |
|||
|
|||
#if defined(__MINGW64__) |
|||
#define HAVE_MODE_T |
|||
#define HAVE_STRUCT_TIMESPEC |
|||
#elif defined(__MINGW32__) |
|||
#define HAVE_MODE_T |
|||
#endif |
|||
|
|||
#if defined(__BORLANDC__) |
|||
#endif |
|||
|
|||
#if defined(__WATCOMC__) |
|||
#endif |
|||
|
|||
#if defined(__DMC__) |
|||
#define HAVE_SIGNAL_H |
|||
#define HAVE_C_INLINE |
|||
#endif |
|||
|
|||
|
|||
|
|||
#endif |
@ -1,74 +0,0 @@ |
|||
/*
|
|||
* context.h |
|||
* |
|||
* Description: |
|||
* POSIX thread macros related to thread cancellation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#ifndef PTW32_CONTEXT_H |
|||
#define PTW32_CONTEXT_H |
|||
|
|||
#undef PTW32_PROGCTR |
|||
|
|||
#if defined(_M_IX86) || (defined(_X86_) && !defined(__amd64__)) |
|||
#define PTW32_PROGCTR(Context) ((Context).Eip) |
|||
#endif |
|||
|
|||
#if defined (_M_IA64) || defined(_IA64) |
|||
#define PTW32_PROGCTR(Context) ((Context).StIIP) |
|||
#endif |
|||
|
|||
#if defined(_MIPS_) || defined(MIPS) |
|||
#define PTW32_PROGCTR(Context) ((Context).Fir) |
|||
#endif |
|||
|
|||
#if defined(_ALPHA_) |
|||
#define PTW32_PROGCTR(Context) ((Context).Fir) |
|||
#endif |
|||
|
|||
#if defined(_PPC_) |
|||
#define PTW32_PROGCTR(Context) ((Context).Iar) |
|||
#endif |
|||
|
|||
#if defined(_AMD64_) || defined(__amd64__) |
|||
#define PTW32_PROGCTR(Context) ((Context).Rip) |
|||
#endif |
|||
|
|||
#if defined(_ARM_) || defined(ARM) |
|||
#define PTW32_PROGCTR(Context) ((Context).Pc) |
|||
#endif |
|||
|
|||
#if !defined(PTW32_PROGCTR) |
|||
#error Module contains CPU-specific code; modify and recompile. |
|||
#endif |
|||
|
|||
#endif |
@ -1,308 +0,0 @@ |
|||
/*
|
|||
* create.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines associated with spawning a new |
|||
* thread. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#if ! defined(_UWIN) && ! defined(WINCE) |
|||
#include <process.h> |
|||
#endif |
|||
|
|||
int |
|||
pthread_create (pthread_t * tid, |
|||
const pthread_attr_t * attr, |
|||
void *(*start) (void *), void *arg) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function creates a thread running the start function, |
|||
* passing it the parameter value, 'arg'. The 'attr' |
|||
* argument specifies optional creation attributes. |
|||
* The identity of the new thread is returned |
|||
* via 'tid', which should not be NULL. |
|||
* |
|||
* PARAMETERS |
|||
* tid |
|||
* pointer to an instance of pthread_t |
|||
* |
|||
* attr |
|||
* optional pointer to an instance of pthread_attr_t |
|||
* |
|||
* start |
|||
* pointer to the starting routine for the new thread |
|||
* |
|||
* arg |
|||
* optional parameter passed to 'start' |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function creates a thread running the start function, |
|||
* passing it the parameter value, 'arg'. The 'attr' |
|||
* argument specifies optional creation attributes. |
|||
* The identity of the new thread is returned |
|||
* via 'tid', which should not be the NULL pointer. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully created thread, |
|||
* EINVAL attr invalid, |
|||
* EAGAIN insufficient resources. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
pthread_t thread; |
|||
ptw32_thread_t * tp; |
|||
register pthread_attr_t a; |
|||
HANDLE threadH = 0; |
|||
int result = EAGAIN; |
|||
int run = PTW32_TRUE; |
|||
ThreadParms *parms = NULL; |
|||
unsigned int stackSize; |
|||
int priority; |
|||
pthread_t self; |
|||
|
|||
/*
|
|||
* Before doing anything, check that tid can be stored through |
|||
* without invoking a memory protection error (segfault). |
|||
* Make sure that the assignment below can't be optimised out by the compiler. |
|||
* This is assured by conditionally assigning *tid again at the end. |
|||
*/ |
|||
tid->x = 0; |
|||
|
|||
if (attr != NULL) |
|||
{ |
|||
a = *attr; |
|||
} |
|||
else |
|||
{ |
|||
a = NULL; |
|||
} |
|||
|
|||
if ((thread = ptw32_new ()).p == NULL) |
|||
{ |
|||
goto FAIL0; |
|||
} |
|||
|
|||
tp = (ptw32_thread_t *) thread.p; |
|||
|
|||
priority = tp->sched_priority; |
|||
|
|||
if ((parms = (ThreadParms *) malloc (sizeof (*parms))) == NULL) |
|||
{ |
|||
goto FAIL0; |
|||
} |
|||
|
|||
parms->tid = thread; |
|||
parms->start = start; |
|||
parms->arg = arg; |
|||
|
|||
#if defined(HAVE_SIGSET_T) |
|||
|
|||
/*
|
|||
* Threads inherit their initial sigmask from their creator thread. |
|||
*/ |
|||
self = pthread_self(); |
|||
tp->sigmask = ((ptw32_thread_t *)self.p)->sigmask; |
|||
|
|||
#endif /* HAVE_SIGSET_T */ |
|||
|
|||
|
|||
if (a != NULL) |
|||
{ |
|||
stackSize = (unsigned int)a->stacksize; |
|||
tp->detachState = a->detachstate; |
|||
priority = a->param.sched_priority; |
|||
|
|||
#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL) |
|||
/* WinCE */ |
|||
#else |
|||
/* Everything else */ |
|||
|
|||
/*
|
|||
* Thread priority must be set to a valid system level |
|||
* without altering the value set by pthread_attr_setschedparam(). |
|||
*/ |
|||
|
|||
/*
|
|||
* PTHREAD_EXPLICIT_SCHED is the default because Win32 threads |
|||
* don't inherit their creator's priority. They are started with |
|||
* THREAD_PRIORITY_NORMAL (win32 value). The result of not supplying |
|||
* an 'attr' arg to pthread_create() is equivalent to defaulting to |
|||
* PTHREAD_EXPLICIT_SCHED and priority THREAD_PRIORITY_NORMAL. |
|||
*/ |
|||
if (PTHREAD_INHERIT_SCHED == a->inheritsched) |
|||
{ |
|||
/*
|
|||
* If the thread that called pthread_create() is a Win32 thread |
|||
* then the inherited priority could be the result of a temporary |
|||
* system adjustment. This is not the case for POSIX threads. |
|||
*/ |
|||
#if ! defined(HAVE_SIGSET_T) |
|||
self = pthread_self (); |
|||
#endif |
|||
priority = ((ptw32_thread_t *) self.p)->sched_priority; |
|||
} |
|||
|
|||
#endif |
|||
|
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Default stackSize |
|||
*/ |
|||
stackSize = PTHREAD_STACK_MIN; |
|||
} |
|||
|
|||
tp->state = run ? PThreadStateInitial : PThreadStateSuspended; |
|||
|
|||
tp->keys = NULL; |
|||
|
|||
/*
|
|||
* Threads must be started in suspended mode and resumed if necessary |
|||
* after _beginthreadex returns us the handle. Otherwise we set up a |
|||
* race condition between the creating and the created threads. |
|||
* Note that we also retain a local copy of the handle for use |
|||
* by us in case thread.p->threadH gets NULLed later but before we've |
|||
* finished with it here. |
|||
*/ |
|||
|
|||
#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) || defined (__DMC__) |
|||
|
|||
tp->threadH = |
|||
threadH = |
|||
(HANDLE) _beginthreadex ((void *) NULL, /* No security info */ |
|||
stackSize, /* default stack size */ |
|||
ptw32_threadStart, |
|||
parms, |
|||
(unsigned) |
|||
CREATE_SUSPENDED, |
|||
(unsigned *) &(tp->thread)); |
|||
|
|||
if (threadH != 0) |
|||
{ |
|||
if (a != NULL) |
|||
{ |
|||
(void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority); |
|||
} |
|||
|
|||
if (run) |
|||
{ |
|||
ResumeThread (threadH); |
|||
} |
|||
} |
|||
|
|||
#else |
|||
|
|||
{ |
|||
ptw32_mcs_local_node_t stateLock; |
|||
|
|||
/*
|
|||
* This lock will force pthread_threadStart() to wait until we have |
|||
* the thread handle and have set the priority. |
|||
*/ |
|||
ptw32_mcs_lock_acquire(&tp->stateLock, &stateLock); |
|||
|
|||
tp->threadH = |
|||
threadH = |
|||
(HANDLE) _beginthread (ptw32_threadStart, stackSize, /* default stack size */ |
|||
parms); |
|||
|
|||
/*
|
|||
* Make the return code match _beginthreadex's. |
|||
*/ |
|||
if (threadH == (HANDLE) - 1L) |
|||
{ |
|||
tp->threadH = threadH = 0; |
|||
} |
|||
else |
|||
{ |
|||
if (!run) |
|||
{ |
|||
/*
|
|||
* beginthread does not allow for create flags, so we do it now. |
|||
* Note that beginthread itself creates the thread in SUSPENDED |
|||
* mode, and then calls ResumeThread to start it. |
|||
*/ |
|||
SuspendThread (threadH); |
|||
} |
|||
|
|||
if (a != NULL) |
|||
{ |
|||
(void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority); |
|||
} |
|||
} |
|||
|
|||
ptw32_mcs_lock_release (&stateLock); |
|||
} |
|||
#endif |
|||
|
|||
result = (threadH != 0) ? 0 : EAGAIN; |
|||
|
|||
/*
|
|||
* Fall Through Intentionally |
|||
*/ |
|||
|
|||
/*
|
|||
* ------------ |
|||
* Failure Code |
|||
* ------------ |
|||
*/ |
|||
|
|||
FAIL0: |
|||
if (result != 0) |
|||
{ |
|||
|
|||
ptw32_threadDestroy (thread); |
|||
tp = NULL; |
|||
|
|||
if (parms != NULL) |
|||
{ |
|||
free (parms); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
*tid = thread; |
|||
} |
|||
|
|||
#if defined(_UWIN) |
|||
if (result == 0) |
|||
pthread_count++; |
|||
#endif |
|||
return (result); |
|||
|
|||
} /* pthread_create */ |
@ -1,92 +0,0 @@ |
|||
/*
|
|||
* dll.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements DLL initialisation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if !defined(PTW32_STATIC_LIB) |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
#if defined(_MSC_VER) |
|||
/*
|
|||
* lpvReserved yields an unreferenced formal parameter; |
|||
* ignore it |
|||
*/ |
|||
#pragma warning( disable : 4100 ) |
|||
#endif |
|||
|
|||
#if defined(__cplusplus) |
|||
/*
|
|||
* Dear c++: Please don't mangle this name. -thanks |
|||
*/ |
|||
extern "C" |
|||
#endif /* __cplusplus */ |
|||
BOOL WINAPI |
|||
DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) |
|||
{ |
|||
BOOL result = PTW32_TRUE; |
|||
|
|||
switch (fdwReason) |
|||
{ |
|||
|
|||
case DLL_PROCESS_ATTACH: |
|||
result = pthread_win32_process_attach_np (); |
|||
break; |
|||
|
|||
case DLL_THREAD_ATTACH: |
|||
/*
|
|||
* A thread is being created |
|||
*/ |
|||
result = pthread_win32_thread_attach_np (); |
|||
break; |
|||
|
|||
case DLL_THREAD_DETACH: |
|||
/*
|
|||
* A thread is exiting cleanly |
|||
*/ |
|||
result = pthread_win32_thread_detach_np (); |
|||
break; |
|||
|
|||
case DLL_PROCESS_DETACH: |
|||
(void) pthread_win32_thread_detach_np (); |
|||
result = pthread_win32_process_detach_np (); |
|||
break; |
|||
} |
|||
|
|||
return (result); |
|||
|
|||
} /* DllMain */ |
|||
|
|||
#endif /* PTW32_STATIC_LIB */ |
@ -1,94 +0,0 @@ |
|||
/*
|
|||
* errno.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines associated with spawning a new |
|||
* thread. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if defined(NEED_ERRNO) |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
static int reallyBad = ENOMEM; |
|||
|
|||
/*
|
|||
* Re-entrant errno. |
|||
* |
|||
* Each thread has it's own errno variable in pthread_t. |
|||
* |
|||
* The benefit of using the pthread_t structure |
|||
* instead of another TSD key is TSD keys are limited |
|||
* on Win32 to 64 per process. Secondly, to implement |
|||
* it properly without using pthread_t you'd need |
|||
* to dynamically allocate an int on starting the thread |
|||
* and store it manually into TLS and then ensure that you free |
|||
* it on thread termination. We get all that for free |
|||
* by simply storing the errno on the pthread_t structure. |
|||
* |
|||
* MSVC and Mingw32 already have their own thread-safe errno. |
|||
* |
|||
* #if defined( _REENTRANT ) || defined( _MT ) |
|||
* #define errno *_errno() |
|||
* |
|||
* int *_errno( void ); |
|||
* #else |
|||
* extern int errno; |
|||
* #endif |
|||
* |
|||
*/ |
|||
|
|||
int * |
|||
_errno (void) |
|||
{ |
|||
pthread_t self; |
|||
int *result; |
|||
|
|||
if ((self = pthread_self ()).p == NULL) |
|||
{ |
|||
/*
|
|||
* Yikes! unable to allocate a thread! |
|||
* Throw an exception? return an error? |
|||
*/ |
|||
result = &reallyBad; |
|||
} |
|||
else |
|||
{ |
|||
result = (int *)(&self.p->exitStatus); |
|||
} |
|||
|
|||
return (result); |
|||
|
|||
} /* _errno */ |
|||
|
|||
#endif /* (NEED_ERRNO) */ |
@ -1,44 +0,0 @@ |
|||
/*
|
|||
* exit.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines associated with exiting from |
|||
* a thread. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#if ! defined(_UWIN) && ! defined(WINCE) |
|||
# include <process.h> |
|||
#endif |
|||
|
|||
#include "pthread_exit.c" |
@ -1,39 +0,0 @@ |
|||
/*
|
|||
* fork.c |
|||
* |
|||
* Description: |
|||
* Implementation of fork() for POSIX threads. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
@ -1,107 +0,0 @@ |
|||
/*
|
|||
* global.c |
|||
* |
|||
* Description: |
|||
* This translation unit instantiates data associated with the implementation |
|||
* as a whole. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int ptw32_processInitialized = PTW32_FALSE; |
|||
ptw32_thread_t * ptw32_threadReuseTop = PTW32_THREAD_REUSE_EMPTY; |
|||
ptw32_thread_t * ptw32_threadReuseBottom = PTW32_THREAD_REUSE_EMPTY; |
|||
pthread_key_t ptw32_selfThreadKey = NULL; |
|||
pthread_key_t ptw32_cleanupKey = NULL; |
|||
pthread_cond_t ptw32_cond_list_head = NULL; |
|||
pthread_cond_t ptw32_cond_list_tail = NULL; |
|||
|
|||
int ptw32_concurrency = 0; |
|||
|
|||
/* What features have been auto-detected */ |
|||
int ptw32_features = 0; |
|||
|
|||
/*
|
|||
* Global [process wide] thread sequence Number |
|||
*/ |
|||
unsigned __int64 ptw32_threadSeqNumber = 0; |
|||
|
|||
/*
|
|||
* Function pointer to QueueUserAPCEx if it exists, otherwise |
|||
* it will be set at runtime to a substitute routine which cannot unblock |
|||
* blocked threads. |
|||
*/ |
|||
DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD) = NULL; |
|||
|
|||
/*
|
|||
* Global lock for managing pthread_t struct reuse. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_thread_reuse_lock = 0; |
|||
|
|||
/*
|
|||
* Global lock for testing internal state of statically declared mutexes. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_mutex_test_init_lock = 0; |
|||
|
|||
/*
|
|||
* Global lock for testing internal state of PTHREAD_COND_INITIALIZER |
|||
* created condition variables. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_cond_test_init_lock = 0; |
|||
|
|||
/*
|
|||
* Global lock for testing internal state of PTHREAD_RWLOCK_INITIALIZER |
|||
* created read/write locks. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_rwlock_test_init_lock = 0; |
|||
|
|||
/*
|
|||
* Global lock for testing internal state of PTHREAD_SPINLOCK_INITIALIZER |
|||
* created spin locks. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_spinlock_test_init_lock = 0; |
|||
|
|||
/*
|
|||
* Global lock for condition variable linked list. The list exists |
|||
* to wake up CVs when a WM_TIMECHANGE message arrives. See |
|||
* w32_TimeChangeHandler.c. |
|||
*/ |
|||
ptw32_mcs_lock_t ptw32_cond_list_lock = 0; |
|||
|
|||
#if defined(_UWIN) |
|||
/*
|
|||
* Keep a count of the number of threads. |
|||
*/ |
|||
int pthread_count = 0; |
|||
#endif |
@ -1,944 +0,0 @@ |
|||
/*
|
|||
* implement.h |
|||
* |
|||
* Definitions that don't need to be public. |
|||
* |
|||
* Keeps all the internals out of pthread.h |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: Ross.Johnson@homemail.com.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if !defined(_IMPLEMENT_H) |
|||
#define _IMPLEMENT_H |
|||
|
|||
#if !defined(_WIN32_WINNT) |
|||
#define _WIN32_WINNT 0x0400 |
|||
#endif |
|||
|
|||
#include <windows.h> |
|||
|
|||
/*
|
|||
* In case windows.h doesn't define it (e.g. WinCE perhaps) |
|||
*/ |
|||
#if defined(WINCE) |
|||
typedef VOID (APIENTRY *PAPCFUNC)(DWORD dwParam); |
|||
#endif |
|||
|
|||
/*
|
|||
* note: ETIMEDOUT is correctly defined in winsock.h |
|||
*/ |
|||
#include <winsock.h> |
|||
|
|||
/*
|
|||
* In case ETIMEDOUT hasn't been defined above somehow. |
|||
*/ |
|||
#if !defined(ETIMEDOUT) |
|||
# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ |
|||
#endif |
|||
|
|||
#if !defined(malloc) |
|||
#include <malloc.h> |
|||
#endif |
|||
|
|||
#if defined(__CLEANUP_C) |
|||
# include <setjmp.h> |
|||
#endif |
|||
|
|||
#if !defined(INT_MAX) |
|||
#include <limits.h> |
|||
#endif |
|||
|
|||
/* use local include files during development */ |
|||
#include "semaphore.h" |
|||
#include "sched.h" |
|||
|
|||
#if defined(HAVE_C_INLINE) || defined(__cplusplus) |
|||
#define INLINE inline |
|||
#else |
|||
#define INLINE |
|||
#endif |
|||
|
|||
#if defined(_MSC_VER) && _MSC_VER < 1300 |
|||
/*
|
|||
* MSVC 6 does not use the "volatile" qualifier |
|||
*/ |
|||
#define PTW32_INTERLOCKED_VOLATILE |
|||
#else |
|||
#define PTW32_INTERLOCKED_VOLATILE volatile |
|||
#endif |
|||
#define PTW32_INTERLOCKED_LONG long |
|||
#define PTW32_INTERLOCKED_SIZE size_t |
|||
#define PTW32_INTERLOCKED_PVOID PVOID |
|||
#define PTW32_INTERLOCKED_LONGPTR PTW32_INTERLOCKED_VOLATILE long* |
|||
#define PTW32_INTERLOCKED_SIZEPTR PTW32_INTERLOCKED_VOLATILE size_t* |
|||
#define PTW32_INTERLOCKED_PVOID_PTR PTW32_INTERLOCKED_VOLATILE PVOID* |
|||
|
|||
#if defined(__MINGW64__) || defined(__MINGW32__) |
|||
# include <stdint.h> |
|||
#elif defined(__BORLANDC__) |
|||
# define int64_t ULONGLONG |
|||
#else |
|||
# define int64_t _int64 |
|||
# if defined(_MSC_VER) && _MSC_VER < 1300 |
|||
typedef long intptr_t; |
|||
# endif |
|||
#endif |
|||
|
|||
typedef enum |
|||
{ |
|||
/*
|
|||
* This enumeration represents the state of the thread; |
|||
* The thread is still "alive" if the numeric value of the |
|||
* state is greater or equal "PThreadStateRunning". |
|||
*/ |
|||
PThreadStateInitial = 0, /* Thread not running */ |
|||
PThreadStateRunning, /* Thread alive & kicking */ |
|||
PThreadStateSuspended, /* Thread alive but suspended */ |
|||
PThreadStateCancelPending, /* Thread alive but */ |
|||
/* has cancelation pending. */ |
|||
PThreadStateCanceling, /* Thread alive but is */ |
|||
/* in the process of terminating */ |
|||
/* due to a cancellation request */ |
|||
PThreadStateExiting, /* Thread alive but exiting */ |
|||
/* due to an exception */ |
|||
PThreadStateLast, /* All handlers have been run and now */ |
|||
/* final cleanup can be done. */ |
|||
PThreadStateReuse /* In reuse pool. */ |
|||
} |
|||
PThreadState; |
|||
|
|||
typedef struct ptw32_mcs_node_t_ ptw32_mcs_local_node_t; |
|||
typedef struct ptw32_mcs_node_t_* ptw32_mcs_lock_t; |
|||
typedef struct ptw32_robust_node_t_ ptw32_robust_node_t; |
|||
typedef struct ptw32_thread_t_ ptw32_thread_t; |
|||
|
|||
|
|||
struct ptw32_thread_t_ |
|||
{ |
|||
unsigned __int64 seqNumber; /* Process-unique thread sequence number */ |
|||
HANDLE threadH; /* Win32 thread handle - POSIX thread is invalid if threadH == 0 */ |
|||
pthread_t ptHandle; /* This thread's permanent pthread_t handle */ |
|||
ptw32_thread_t * prevReuse; /* Links threads on reuse stack */ |
|||
volatile PThreadState state; |
|||
ptw32_mcs_lock_t threadLock; /* Used for serialised access to public thread state */ |
|||
ptw32_mcs_lock_t stateLock; /* Used for async-cancel safety */ |
|||
HANDLE cancelEvent; |
|||
void *exitStatus; |
|||
void *parms; |
|||
void *keys; |
|||
void *nextAssoc; |
|||
#if defined(__CLEANUP_C) |
|||
jmp_buf start_mark; /* Jump buffer follows void* so should be aligned */ |
|||
#endif /* __CLEANUP_C */ |
|||
#if defined(HAVE_SIGSET_T) |
|||
sigset_t sigmask; |
|||
#endif /* HAVE_SIGSET_T */ |
|||
ptw32_mcs_lock_t |
|||
robustMxListLock; /* robustMxList lock */ |
|||
ptw32_robust_node_t* |
|||
robustMxList; /* List of currenty held robust mutexes */ |
|||
int ptErrno; |
|||
int detachState; |
|||
int sched_priority; /* As set, not as currently is */ |
|||
int cancelState; |
|||
int cancelType; |
|||
int implicit:1; |
|||
DWORD thread; /* Win32 thread ID */ |
|||
#if defined(_UWIN) |
|||
DWORD dummy[5]; |
|||
#endif |
|||
size_t align; /* Force alignment if this struct is packed */ |
|||
}; |
|||
|
|||
|
|||
/*
|
|||
* Special value to mark attribute objects as valid. |
|||
*/ |
|||
#define PTW32_ATTR_VALID ((unsigned long) 0xC4C0FFEE) |
|||
|
|||
struct pthread_attr_t_ |
|||
{ |
|||
unsigned long valid; |
|||
void *stackaddr; |
|||
size_t stacksize; |
|||
int detachstate; |
|||
struct sched_param param; |
|||
int inheritsched; |
|||
int contentionscope; |
|||
#if defined(HAVE_SIGSET_T) |
|||
sigset_t sigmask; |
|||
#endif /* HAVE_SIGSET_T */ |
|||
}; |
|||
|
|||
|
|||
/*
|
|||
* ==================== |
|||
* ==================== |
|||
* Semaphores, Mutexes and Condition Variables |
|||
* ==================== |
|||
* ==================== |
|||
*/ |
|||
|
|||
struct sem_t_ |
|||
{ |
|||
int value; |
|||
pthread_mutex_t lock; |
|||
HANDLE sem; |
|||
#if defined(NEED_SEM) |
|||
int leftToUnblock; |
|||
#endif |
|||
}; |
|||
|
|||
#define PTW32_OBJECT_AUTO_INIT ((void *)(size_t) -1) |
|||
#define PTW32_OBJECT_INVALID NULL |
|||
|
|||
struct pthread_mutex_t_ |
|||
{ |
|||
LONG lock_idx; /* Provides exclusive access to mutex state
|
|||
via the Interlocked* mechanism. |
|||
0: unlocked/free. |
|||
1: locked - no other waiters. |
|||
-1: locked - with possible other waiters. |
|||
*/ |
|||
int recursive_count; /* Number of unlocks a thread needs to perform
|
|||
before the lock is released (recursive |
|||
mutexes only). */ |
|||
int kind; /* Mutex type. */ |
|||
pthread_t ownerThread; |
|||
HANDLE event; /* Mutex release notification to waiting
|
|||
threads. */ |
|||
ptw32_robust_node_t* |
|||
robustNode; /* Extra state for robust mutexes */ |
|||
}; |
|||
|
|||
enum ptw32_robust_state_t_ |
|||
{ |
|||
PTW32_ROBUST_CONSISTENT, |
|||
PTW32_ROBUST_INCONSISTENT, |
|||
PTW32_ROBUST_NOTRECOVERABLE |
|||
}; |
|||
|
|||
typedef enum ptw32_robust_state_t_ ptw32_robust_state_t; |
|||
|
|||
/*
|
|||
* Node used to manage per-thread lists of currently-held robust mutexes. |
|||
*/ |
|||
struct ptw32_robust_node_t_ |
|||
{ |
|||
pthread_mutex_t mx; |
|||
ptw32_robust_state_t stateInconsistent; |
|||
ptw32_robust_node_t* prev; |
|||
ptw32_robust_node_t* next; |
|||
}; |
|||
|
|||
struct pthread_mutexattr_t_ |
|||
{ |
|||
int pshared; |
|||
int kind; |
|||
int robustness; |
|||
}; |
|||
|
|||
/*
|
|||
* Possible values, other than PTW32_OBJECT_INVALID, |
|||
* for the "interlock" element in a spinlock. |
|||
* |
|||
* In this implementation, when a spinlock is initialised, |
|||
* the number of cpus available to the process is checked. |
|||
* If there is only one cpu then "interlock" is set equal to |
|||
* PTW32_SPIN_USE_MUTEX and u.mutex is an initialised mutex. |
|||
* If the number of cpus is greater than 1 then "interlock" |
|||
* is set equal to PTW32_SPIN_UNLOCKED and the number is |
|||
* stored in u.cpus. This arrangement allows the spinlock |
|||
* routines to attempt an InterlockedCompareExchange on "interlock" |
|||
* immediately and, if that fails, to try the inferior mutex. |
|||
* |
|||
* "u.cpus" isn't used for anything yet, but could be used at |
|||
* some point to optimise spinlock behaviour. |
|||
*/ |
|||
#define PTW32_SPIN_INVALID (0) |
|||
#define PTW32_SPIN_UNLOCKED (1) |
|||
#define PTW32_SPIN_LOCKED (2) |
|||
#define PTW32_SPIN_USE_MUTEX (3) |
|||
|
|||
struct pthread_spinlock_t_ |
|||
{ |
|||
long interlock; /* Locking element for multi-cpus. */ |
|||
union |
|||
{ |
|||
int cpus; /* No. of cpus if multi cpus, or */ |
|||
pthread_mutex_t mutex; /* mutex if single cpu. */ |
|||
} u; |
|||
}; |
|||
|
|||
/*
|
|||
* MCS lock queue node - see ptw32_MCS_lock.c |
|||
*/ |
|||
struct ptw32_mcs_node_t_ |
|||
{ |
|||
struct ptw32_mcs_node_t_ **lock; /* ptr to tail of queue */ |
|||
struct ptw32_mcs_node_t_ *next; /* ptr to successor in queue */ |
|||
HANDLE readyFlag; /* set after lock is released by
|
|||
predecessor */ |
|||
HANDLE nextFlag; /* set after 'next' ptr is set by
|
|||
successor */ |
|||
}; |
|||
|
|||
|
|||
struct pthread_barrier_t_ |
|||
{ |
|||
unsigned int nCurrentBarrierHeight; |
|||
unsigned int nInitialBarrierHeight; |
|||
int pshared; |
|||
sem_t semBarrierBreeched; |
|||
ptw32_mcs_lock_t lock; |
|||
ptw32_mcs_local_node_t proxynode; |
|||
}; |
|||
|
|||
struct pthread_barrierattr_t_ |
|||
{ |
|||
int pshared; |
|||
}; |
|||
|
|||
struct pthread_key_t_ |
|||
{ |
|||
DWORD key; |
|||
void (*destructor) (void *); |
|||
ptw32_mcs_lock_t keyLock; |
|||
void *threads; |
|||
}; |
|||
|
|||
|
|||
typedef struct ThreadParms ThreadParms; |
|||
|
|||
struct ThreadParms |
|||
{ |
|||
pthread_t tid; |
|||
void *(*start) (void *); |
|||
void *arg; |
|||
}; |
|||
|
|||
|
|||
struct pthread_cond_t_ |
|||
{ |
|||
long nWaitersBlocked; /* Number of threads blocked */ |
|||
long nWaitersGone; /* Number of threads timed out */ |
|||
long nWaitersToUnblock; /* Number of threads to unblock */ |
|||
sem_t semBlockQueue; /* Queue up threads waiting for the */ |
|||
/* condition to become signalled */ |
|||
sem_t semBlockLock; /* Semaphore that guards access to */ |
|||
/* | waiters blocked count/block queue */ |
|||
/* +-> Mandatory Sync.LEVEL-1 */ |
|||
pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to */ |
|||
/* | waiters (to)unblock(ed) counts */ |
|||
/* +-> Optional* Sync.LEVEL-2 */ |
|||
pthread_cond_t next; /* Doubly linked list */ |
|||
pthread_cond_t prev; |
|||
}; |
|||
|
|||
|
|||
struct pthread_condattr_t_ |
|||
{ |
|||
int pshared; |
|||
}; |
|||
|
|||
#define PTW32_RWLOCK_MAGIC 0xfacade2 |
|||
|
|||
struct pthread_rwlock_t_ |
|||
{ |
|||
pthread_mutex_t mtxExclusiveAccess; |
|||
pthread_mutex_t mtxSharedAccessCompleted; |
|||
pthread_cond_t cndSharedAccessCompleted; |
|||
int nSharedAccessCount; |
|||
int nExclusiveAccessCount; |
|||
int nCompletedSharedAccessCount; |
|||
int nMagic; |
|||
}; |
|||
|
|||
struct pthread_rwlockattr_t_ |
|||
{ |
|||
int pshared; |
|||
}; |
|||
|
|||
typedef struct ThreadKeyAssoc ThreadKeyAssoc; |
|||
|
|||
struct ThreadKeyAssoc |
|||
{ |
|||
/*
|
|||
* Purpose: |
|||
* This structure creates an association between a thread and a key. |
|||
* It is used to implement the implicit invocation of a user defined |
|||
* destroy routine for thread specific data registered by a user upon |
|||
* exiting a thread. |
|||
* |
|||
* Graphically, the arrangement is as follows, where: |
|||
* |
|||
* K - Key with destructor |
|||
* (head of chain is key->threads) |
|||
* T - Thread that has called pthread_setspecific(Kn) |
|||
* (head of chain is thread->keys) |
|||
* A - Association. Each association is a node at the |
|||
* intersection of two doubly-linked lists. |
|||
* |
|||
* T1 T2 T3 |
|||
* | | | |
|||
* | | | |
|||
* K1 -----+-----A-----A-----> |
|||
* | | | |
|||
* | | | |
|||
* K2 -----A-----A-----+-----> |
|||
* | | | |
|||
* | | | |
|||
* K3 -----A-----+-----A-----> |
|||
* | | | |
|||
* | | | |
|||
* V V V |
|||
* |
|||
* Access to the association is guarded by two locks: the key's |
|||
* general lock (guarding the row) and the thread's general |
|||
* lock (guarding the column). This avoids the need for a |
|||
* dedicated lock for each association, which not only consumes |
|||
* more handles but requires that the lock resources persist |
|||
* until both the key is deleted and the thread has called the |
|||
* destructor. The two-lock arrangement allows those resources |
|||
* to be freed as soon as either thread or key is concluded. |
|||
* |
|||
* To avoid deadlock, whenever both locks are required both the |
|||
* key and thread locks are acquired consistently in the order |
|||
* "key lock then thread lock". An exception to this exists |
|||
* when a thread calls the destructors, however, this is done |
|||
* carefully (but inelegantly) to avoid deadlock. |
|||
* |
|||
* An association is created when a thread first calls |
|||
* pthread_setspecific() on a key that has a specified |
|||
* destructor. |
|||
* |
|||
* An association is destroyed either immediately after the |
|||
* thread calls the key destructor function on thread exit, or |
|||
* when the key is deleted. |
|||
* |
|||
* Attributes: |
|||
* thread |
|||
* reference to the thread that owns the |
|||
* association. This is actually the pointer to the |
|||
* thread struct itself. Since the association is |
|||
* destroyed before the thread exits, this can never |
|||
* point to a different logical thread to the one that |
|||
* created the assoc, i.e. after thread struct reuse. |
|||
* |
|||
* key |
|||
* reference to the key that owns the association. |
|||
* |
|||
* nextKey |
|||
* The pthread_t->keys attribute is the head of a |
|||
* chain of associations that runs through the nextKey |
|||
* link. This chain provides the 1 to many relationship |
|||
* between a pthread_t and all pthread_key_t on which |
|||
* it called pthread_setspecific. |
|||
* |
|||
* prevKey |
|||
* Similarly. |
|||
* |
|||
* nextThread |
|||
* The pthread_key_t->threads attribute is the head of |
|||
* a chain of associations that runs through the |
|||
* nextThreads link. This chain provides the 1 to many |
|||
* relationship between a pthread_key_t and all the |
|||
* PThreads that have called pthread_setspecific for |
|||
* this pthread_key_t. |
|||
* |
|||
* prevThread |
|||
* Similarly. |
|||
* |
|||
* Notes: |
|||
* 1) As soon as either the key or the thread is no longer |
|||
* referencing the association, it can be destroyed. The |
|||
* association will be removed from both chains. |
|||
* |
|||
* 2) Under WIN32, an association is only created by |
|||
* pthread_setspecific if the user provided a |
|||
* destroyRoutine when they created the key. |
|||
* |
|||
* |
|||
*/ |
|||
ptw32_thread_t * thread; |
|||
pthread_key_t key; |
|||
ThreadKeyAssoc *nextKey; |
|||
ThreadKeyAssoc *nextThread; |
|||
ThreadKeyAssoc *prevKey; |
|||
ThreadKeyAssoc *prevThread; |
|||
}; |
|||
|
|||
|
|||
#if defined(__CLEANUP_SEH) |
|||
/*
|
|||
* -------------------------------------------------------------- |
|||
* MAKE_SOFTWARE_EXCEPTION |
|||
* This macro constructs a software exception code following |
|||
* the same format as the standard Win32 error codes as defined |
|||
* in WINERROR.H |
|||
* Values are 32 bit values laid out as follows: |
|||
* |
|||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 |
|||
* +---+-+-+-----------------------+-------------------------------+ |
|||
* |Sev|C|R| Facility | Code | |
|||
* +---+-+-+-----------------------+-------------------------------+ |
|||
* |
|||
* Severity Values: |
|||
*/ |
|||
#define SE_SUCCESS 0x00 |
|||
#define SE_INFORMATION 0x01 |
|||
#define SE_WARNING 0x02 |
|||
#define SE_ERROR 0x03 |
|||
|
|||
#define MAKE_SOFTWARE_EXCEPTION( _severity, _facility, _exception ) \ |
|||
( (DWORD) ( ( (_severity) << 30 ) | /* Severity code */ \ |
|||
( 1 << 29 ) | /* MS=0, User=1 */ \ |
|||
( 0 << 28 ) | /* Reserved */ \ |
|||
( (_facility) << 16 ) | /* Facility Code */ \ |
|||
( (_exception) << 0 ) /* Exception Code */ \ |
|||
) ) |
|||
|
|||
/*
|
|||
* We choose one specific Facility/Error code combination to |
|||
* identify our software exceptions vs. WIN32 exceptions. |
|||
* We store our actual component and error code within |
|||
* the optional information array. |
|||
*/ |
|||
#define EXCEPTION_PTW32_SERVICES \ |
|||
MAKE_SOFTWARE_EXCEPTION( SE_ERROR, \ |
|||
PTW32_SERVICES_FACILITY, \ |
|||
PTW32_SERVICES_ERROR ) |
|||
|
|||
#define PTW32_SERVICES_FACILITY 0xBAD |
|||
#define PTW32_SERVICES_ERROR 0xDEED |
|||
|
|||
#endif /* __CLEANUP_SEH */ |
|||
|
|||
/*
|
|||
* Services available through EXCEPTION_PTW32_SERVICES |
|||
* and also used [as parameters to ptw32_throw()] as |
|||
* generic exception selectors. |
|||
*/ |
|||
|
|||
#define PTW32_EPS_EXIT (1) |
|||
#define PTW32_EPS_CANCEL (2) |
|||
|
|||
|
|||
/* Useful macros */ |
|||
#define PTW32_MAX(a,b) ((a)<(b)?(b):(a)) |
|||
#define PTW32_MIN(a,b) ((a)>(b)?(b):(a)) |
|||
|
|||
|
|||
/* Declared in pthread_cancel.c */ |
|||
extern DWORD (*ptw32_register_cancelation) (PAPCFUNC, HANDLE, DWORD); |
|||
|
|||
/* Thread Reuse stack bottom marker. Must not be NULL or any valid pointer to memory. */ |
|||
#define PTW32_THREAD_REUSE_EMPTY ((ptw32_thread_t *)(size_t) 1) |
|||
|
|||
extern int ptw32_processInitialized; |
|||
extern ptw32_thread_t * ptw32_threadReuseTop; |
|||
extern ptw32_thread_t * ptw32_threadReuseBottom; |
|||
extern pthread_key_t ptw32_selfThreadKey; |
|||
extern pthread_key_t ptw32_cleanupKey; |
|||
extern pthread_cond_t ptw32_cond_list_head; |
|||
extern pthread_cond_t ptw32_cond_list_tail; |
|||
|
|||
extern int ptw32_mutex_default_kind; |
|||
|
|||
extern unsigned __int64 ptw32_threadSeqNumber; |
|||
|
|||
extern int ptw32_concurrency; |
|||
|
|||
extern int ptw32_features; |
|||
|
|||
extern ptw32_mcs_lock_t ptw32_thread_reuse_lock; |
|||
extern ptw32_mcs_lock_t ptw32_mutex_test_init_lock; |
|||
extern ptw32_mcs_lock_t ptw32_cond_list_lock; |
|||
extern ptw32_mcs_lock_t ptw32_cond_test_init_lock; |
|||
extern ptw32_mcs_lock_t ptw32_rwlock_test_init_lock; |
|||
extern ptw32_mcs_lock_t ptw32_spinlock_test_init_lock; |
|||
|
|||
#if defined(_UWIN) |
|||
extern int pthread_count; |
|||
#endif |
|||
|
|||
#if defined(__cplusplus) |
|||
extern "C" |
|||
{ |
|||
#endif /* __cplusplus */ |
|||
|
|||
/*
|
|||
* ===================== |
|||
* ===================== |
|||
* Forward Declarations |
|||
* ===================== |
|||
* ===================== |
|||
*/ |
|||
|
|||
int ptw32_is_attr (const pthread_attr_t * attr); |
|||
|
|||
int ptw32_cond_check_need_init (pthread_cond_t * cond); |
|||
int ptw32_mutex_check_need_init (pthread_mutex_t * mutex); |
|||
int ptw32_rwlock_check_need_init (pthread_rwlock_t * rwlock); |
|||
int ptw32_spinlock_check_need_init (pthread_spinlock_t * lock); |
|||
|
|||
int ptw32_robust_mutex_inherit(pthread_mutex_t * mutex); |
|||
void ptw32_robust_mutex_add(pthread_mutex_t* mutex, pthread_t self); |
|||
void ptw32_robust_mutex_remove(pthread_mutex_t* mutex, ptw32_thread_t* otp); |
|||
|
|||
DWORD |
|||
ptw32_RegisterCancelation (PAPCFUNC callback, |
|||
HANDLE threadH, DWORD callback_arg); |
|||
|
|||
int ptw32_processInitialize (void); |
|||
|
|||
void ptw32_processTerminate (void); |
|||
|
|||
void ptw32_threadDestroy (pthread_t tid); |
|||
|
|||
void ptw32_pop_cleanup_all (int execute); |
|||
|
|||
pthread_t ptw32_new (void); |
|||
|
|||
pthread_t ptw32_threadReusePop (void); |
|||
|
|||
void ptw32_threadReusePush (pthread_t thread); |
|||
|
|||
int ptw32_getprocessors (int *count); |
|||
|
|||
int ptw32_setthreadpriority (pthread_t thread, int policy, int priority); |
|||
|
|||
void ptw32_rwlock_cancelwrwait (void *arg); |
|||
|
|||
#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || (defined(__MSVCRT__) && ! defined(__DMC__)) |
|||
unsigned __stdcall |
|||
#else |
|||
void |
|||
#endif |
|||
ptw32_threadStart (void *vthreadParms); |
|||
|
|||
void ptw32_callUserDestroyRoutines (pthread_t thread); |
|||
|
|||
int ptw32_tkAssocCreate (ptw32_thread_t * thread, pthread_key_t key); |
|||
|
|||
void ptw32_tkAssocDestroy (ThreadKeyAssoc * assoc); |
|||
|
|||
int ptw32_semwait (sem_t * sem); |
|||
|
|||
DWORD ptw32_relmillisecs (const struct timespec * abstime); |
|||
|
|||
void ptw32_mcs_lock_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node); |
|||
|
|||
int ptw32_mcs_lock_try_acquire (ptw32_mcs_lock_t * lock, ptw32_mcs_local_node_t * node); |
|||
|
|||
void ptw32_mcs_lock_release (ptw32_mcs_local_node_t * node); |
|||
|
|||
void ptw32_mcs_node_transfer (ptw32_mcs_local_node_t * new_node, ptw32_mcs_local_node_t * old_node); |
|||
|
|||
#if defined(NEED_FTIME) |
|||
void ptw32_timespec_to_filetime (const struct timespec *ts, FILETIME * ft); |
|||
void ptw32_filetime_to_timespec (const FILETIME * ft, struct timespec *ts); |
|||
#endif |
|||
|
|||
/* Declared in misc.c */ |
|||
#if defined(NEED_CALLOC) |
|||
#define calloc(n, s) ptw32_calloc(n, s) |
|||
void *ptw32_calloc (size_t n, size_t s); |
|||
#endif |
|||
|
|||
/* Declared in private.c */ |
|||
#if defined(_MSC_VER) |
|||
/*
|
|||
* Ignore the warning: |
|||
* "C++ exception specification ignored except to indicate that |
|||
* the function is not __declspec(nothrow)." |
|||
*/ |
|||
#pragma warning(disable:4290) |
|||
#endif |
|||
void ptw32_throw (DWORD exception) |
|||
#if defined(__CLEANUP_CXX) |
|||
throw(ptw32_exception_cancel,ptw32_exception_exit) |
|||
#endif |
|||
; |
|||
|
|||
#if defined(__cplusplus) |
|||
} |
|||
#endif /* __cplusplus */ |
|||
|
|||
|
|||
#if defined(_UWIN_) |
|||
# if defined(_MT) |
|||
# if defined(__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); |
|||
# if defined(__cplusplus) |
|||
} |
|||
# endif |
|||
# endif |
|||
#else |
|||
# include <process.h> |
|||
# endif |
|||
|
|||
|
|||
/*
|
|||
* Use intrinsic versions wherever possible. VC will do this |
|||
* automatically where possible and GCC define these if available: |
|||
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 |
|||
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 |
|||
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 |
|||
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 |
|||
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 |
|||
* |
|||
* The full set of Interlocked intrinsics in GCC are (check versions): |
|||
* type __sync_fetch_and_add (type *ptr, type value, ...) |
|||
* type __sync_fetch_and_sub (type *ptr, type value, ...) |
|||
* type __sync_fetch_and_or (type *ptr, type value, ...) |
|||
* type __sync_fetch_and_and (type *ptr, type value, ...) |
|||
* type __sync_fetch_and_xor (type *ptr, type value, ...) |
|||
* type __sync_fetch_and_nand (type *ptr, type value, ...) |
|||
* type __sync_add_and_fetch (type *ptr, type value, ...) |
|||
* type __sync_sub_and_fetch (type *ptr, type value, ...) |
|||
* type __sync_or_and_fetch (type *ptr, type value, ...) |
|||
* type __sync_and_and_fetch (type *ptr, type value, ...) |
|||
* type __sync_xor_and_fetch (type *ptr, type value, ...) |
|||
* type __sync_nand_and_fetch (type *ptr, type value, ...) |
|||
* bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) |
|||
* type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...) |
|||
* __sync_synchronize (...) // Full memory barrier
|
|||
* type __sync_lock_test_and_set (type *ptr, type value, ...) // Acquire barrier
|
|||
* void __sync_lock_release (type *ptr, ...) // Release barrier
|
|||
* |
|||
* These are all overloaded and take 1,2,4,8 byte scalar or pointer types. |
|||
* |
|||
* The above aren't available in Mingw32 as of gcc 4.5.2 so define our own. |
|||
*/ |
|||
#if defined(__GNUC__) |
|||
# if defined(_WIN64) |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_64(location, value, comparand) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"cmpxchgq %2,(%1)" \ |
|||
:"=a" (_result) \ |
|||
:"r" (location), "r" (value), "a" (comparand) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_EXCHANGE_64(location, value) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"xchgq %0,(%1)" \ |
|||
:"=r" (_result) \ |
|||
:"r" (location), "0" (value) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_64(location, value) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddq %0,(%1)" \ |
|||
:"=r" (_result) \ |
|||
:"r" (location), "0" (value) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_INCREMENT_64(location) \ |
|||
({ \ |
|||
PTW32_INTERLOCKED_LONG _temp = 1; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddq %0,(%1)" \ |
|||
:"+r" (_temp) \ |
|||
:"r" (location) \ |
|||
:"memory", "cc"); \ |
|||
++_temp; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_DECREMENT_64(location) \ |
|||
({ \ |
|||
PTW32_INTERLOCKED_LONG _temp = -1; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddq %2,(%1)" \ |
|||
:"+r" (_temp) \ |
|||
:"r" (location) \ |
|||
:"memory", "cc"); \ |
|||
--_temp; \ |
|||
}) |
|||
#endif |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(location, value, comparand) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"cmpxchgl %2,(%1)" \ |
|||
:"=a" (_result) \ |
|||
:"r" (location), "r" (value), "a" (comparand) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_EXCHANGE_LONG(location, value) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"xchgl %0,(%1)" \ |
|||
:"=r" (_result) \ |
|||
:"r" (location), "0" (value) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_LONG(location, value) \ |
|||
({ \ |
|||
__typeof (value) _result; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddl %0,(%1)" \ |
|||
:"=r" (_result) \ |
|||
:"r" (location), "0" (value) \ |
|||
:"memory", "cc"); \ |
|||
_result; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_INCREMENT_LONG(location) \ |
|||
({ \ |
|||
PTW32_INTERLOCKED_LONG _temp = 1; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddl %0,(%1)" \ |
|||
:"+r" (_temp) \ |
|||
:"r" (location) \ |
|||
:"memory", "cc"); \ |
|||
++_temp; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_DECREMENT_LONG(location) \ |
|||
({ \ |
|||
PTW32_INTERLOCKED_LONG _temp = -1; \ |
|||
__asm__ __volatile__ \ |
|||
( \ |
|||
"lock\n\t" \ |
|||
"xaddl %0,(%1)" \ |
|||
:"+r" (_temp) \ |
|||
:"r" (location) \ |
|||
:"memory", "cc"); \ |
|||
--_temp; \ |
|||
}) |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(location, value, comparand) \ |
|||
PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE((PTW32_INTERLOCKED_SIZEPTR)location, \ |
|||
(PTW32_INTERLOCKED_SIZE)value, \ |
|||
(PTW32_INTERLOCKED_SIZE)comparand) |
|||
# define PTW32_INTERLOCKED_EXCHANGE_PTR(location, value) \ |
|||
PTW32_INTERLOCKED_EXCHANGE_SIZE((PTW32_INTERLOCKED_SIZEPTR)location, \ |
|||
(PTW32_INTERLOCKED_SIZE)value) |
|||
#else |
|||
# if defined(_WIN64) |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_64 InterlockedCompareExchange64 |
|||
# define PTW32_INTERLOCKED_EXCHANGE_64 InterlockedExchange64 |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_64 InterlockedExchangeAdd64 |
|||
# define PTW32_INTERLOCKED_INCREMENT_64 InterlockedIncrement64 |
|||
# define PTW32_INTERLOCKED_DECREMENT_64 InterlockedDecrement64 |
|||
# endif |
|||
# if defined(_MSC_VER) && _MSC_VER < 1300 && !defined(_WIN64) /* MSVC 6 */ |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(location, value, comparand) \ |
|||
((LONG)InterlockedCompareExchange((PVOID *)(location), (PVOID)(value), (PVOID)(comparand))) |
|||
# else |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG InterlockedCompareExchange |
|||
# endif |
|||
# define PTW32_INTERLOCKED_EXCHANGE_LONG InterlockedExchange |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_LONG InterlockedExchangeAdd |
|||
# define PTW32_INTERLOCKED_INCREMENT_LONG InterlockedIncrement |
|||
# define PTW32_INTERLOCKED_DECREMENT_LONG InterlockedDecrement |
|||
# if defined(_MSC_VER) && _MSC_VER < 1300 && !defined(_WIN64) /* MSVC 6 */ |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR InterlockedCompareExchange |
|||
# define PTW32_INTERLOCKED_EXCHANGE_PTR(location, value) \ |
|||
((PVOID)InterlockedExchange((LPLONG)(location), (LONG)(value))) |
|||
# else |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR InterlockedCompareExchangePointer |
|||
# define PTW32_INTERLOCKED_EXCHANGE_PTR InterlockedExchangePointer |
|||
# endif |
|||
#endif |
|||
#if defined(_WIN64) |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE PTW32_INTERLOCKED_COMPARE_EXCHANGE_64 |
|||
# define PTW32_INTERLOCKED_EXCHANGE_SIZE PTW32_INTERLOCKED_EXCHANGE_64 |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE PTW32_INTERLOCKED_EXCHANGE_ADD_64 |
|||
# define PTW32_INTERLOCKED_INCREMENT_SIZE PTW32_INTERLOCKED_INCREMENT_64 |
|||
# define PTW32_INTERLOCKED_DECREMENT_SIZE PTW32_INTERLOCKED_DECREMENT_64 |
|||
#else |
|||
# define PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG |
|||
# define PTW32_INTERLOCKED_EXCHANGE_SIZE PTW32_INTERLOCKED_EXCHANGE_LONG |
|||
# define PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE PTW32_INTERLOCKED_EXCHANGE_ADD_LONG |
|||
# define PTW32_INTERLOCKED_INCREMENT_SIZE PTW32_INTERLOCKED_INCREMENT_LONG |
|||
# define PTW32_INTERLOCKED_DECREMENT_SIZE PTW32_INTERLOCKED_DECREMENT_LONG |
|||
#endif |
|||
|
|||
#if defined(NEED_CREATETHREAD) |
|||
|
|||
/*
|
|||
* Macro uses args so we can cast start_proc to LPTHREAD_START_ROUTINE |
|||
* in order to avoid warnings because of return type |
|||
*/ |
|||
|
|||
#define _beginthreadex(security, \ |
|||
stack_size, \ |
|||
start_proc, \ |
|||
arg, \ |
|||
flags, \ |
|||
pid) \ |
|||
CreateThread(security, \ |
|||
stack_size, \ |
|||
(LPTHREAD_START_ROUTINE) start_proc, \ |
|||
arg, \ |
|||
flags, \ |
|||
pid) |
|||
|
|||
#define _endthreadex ExitThread |
|||
|
|||
#endif /* NEED_CREATETHREAD */ |
|||
|
|||
|
|||
#endif /* _IMPLEMENT_H */ |
@ -1,50 +0,0 @@ |
|||
/*
|
|||
* misc.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements miscellaneous thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
#include "pthread_kill.c" |
|||
#include "pthread_once.c" |
|||
#include "pthread_self.c" |
|||
#include "pthread_equal.c" |
|||
#include "pthread_setconcurrency.c" |
|||
#include "pthread_getconcurrency.c" |
|||
#include "ptw32_new.c" |
|||
#include "ptw32_calloc.c" |
|||
#include "ptw32_reuse.c" |
|||
#include "w32_CancelableWait.c" |
@ -1,62 +0,0 @@ |
|||
/*
|
|||
* mutex.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements mutual exclusion (mutex) primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if ! defined(_UWIN) && ! defined(WINCE) |
|||
# include <process.h> |
|||
#endif |
|||
#if !defined(NEED_FTIME) |
|||
#include <sys/timeb.h> |
|||
#endif |
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
#include "ptw32_mutex_check_need_init.c" |
|||
#include "pthread_mutex_init.c" |
|||
#include "pthread_mutex_destroy.c" |
|||
#include "pthread_mutexattr_init.c" |
|||
#include "pthread_mutexattr_destroy.c" |
|||
#include "pthread_mutexattr_getpshared.c" |
|||
#include "pthread_mutexattr_setpshared.c" |
|||
#include "pthread_mutexattr_settype.c" |
|||
#include "pthread_mutexattr_gettype.c" |
|||
#include "pthread_mutexattr_setrobust.c" |
|||
#include "pthread_mutexattr_getrobust.c" |
|||
#include "pthread_mutex_lock.c" |
|||
#include "pthread_mutex_timedlock.c" |
|||
#include "pthread_mutex_unlock.c" |
|||
#include "pthread_mutex_trylock.c" |
|||
#include "pthread_mutex_consistent.c" |
@ -1,145 +0,0 @@ |
|||
/***
|
|||
* errno.h - system wide error numbers (set by system calls) |
|||
* |
|||
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. |
|||
* |
|||
* Purpose: |
|||
* This file defines the system-wide error numbers (set by |
|||
* system calls). Conforms to the XENIX standard. Extended |
|||
* for compatibility with Uniforum standard. |
|||
* [System V] |
|||
* |
|||
* [Public] |
|||
* |
|||
****/ |
|||
|
|||
#if _MSC_VER > 1000 |
|||
#pragma once |
|||
#endif |
|||
|
|||
#if !defined(_INC_ERRNO) |
|||
#define _INC_ERRNO |
|||
|
|||
#if !defined(_WIN32) |
|||
#error ERROR: Only Win32 targets supported! |
|||
#endif |
|||
|
|||
#include <winsock.h> |
|||
|
|||
#if defined(__cplusplus) |
|||
extern "C" { |
|||
#endif |
|||
|
|||
|
|||
|
|||
/* Define _CRTIMP */ |
|||
|
|||
#ifndef _CRTIMP |
|||
#if defined(_DLL) |
|||
#define _CRTIMP __declspec(dllimport) |
|||
#else /* ndef _DLL */ |
|||
#define _CRTIMP |
|||
#endif /* _DLL */ |
|||
#endif /* _CRTIMP */ |
|||
|
|||
|
|||
/* Define __cdecl for non-Microsoft compilers */ |
|||
|
|||
#if ( !defined(_MSC_VER) && !defined(__cdecl) ) |
|||
#define __cdecl |
|||
#endif |
|||
|
|||
/* Define _CRTAPI1 (for compatibility with the NT SDK) */ |
|||
|
|||
#if !defined(_CRTAPI1) |
|||
#if _MSC_VER >= 800 && _M_IX86 >= 300 |
|||
#define _CRTAPI1 __cdecl |
|||
#else |
|||
#define _CRTAPI1 |
|||
#endif |
|||
#endif |
|||
|
|||
#if !defined(PTW32_STATIC_LIB) |
|||
# if defined(PTW32_BUILD) |
|||
# define PTW32_DLLPORT __declspec (dllexport) |
|||
# else |
|||
# define PTW32_DLLPORT __declspec (dllimport) |
|||
# endif |
|||
#else |
|||
# define PTW32_DLLPORT |
|||
#endif |
|||
|
|||
/* declare reference to errno */ |
|||
|
|||
#if (defined(_MT) || defined(_MD) || defined(_DLL)) && !defined(_MAC) |
|||
PTW32_DLLPORT int * __cdecl _errno(void); |
|||
#define errno (*_errno()) |
|||
#else /* ndef _MT && ndef _MD && ndef _DLL */ |
|||
_CRTIMP extern int errno; |
|||
#endif /* _MT || _MD || _DLL */ |
|||
|
|||
/* Error Codes */ |
|||
|
|||
#define EPERM 1 |
|||
#define ENOENT 2 |
|||
#define ESRCH 3 |
|||
#define EINTR 4 |
|||
#define EIO 5 |
|||
#define ENXIO 6 |
|||
#define E2BIG 7 |
|||
#define ENOEXEC 8 |
|||
#define EBADF 9 |
|||
#define ECHILD 10 |
|||
#define EAGAIN 11 |
|||
#define ENOMEM 12 |
|||
#define EACCES 13 |
|||
#define EFAULT 14 |
|||
#define EBUSY 16 |
|||
#define EEXIST 17 |
|||
#define EXDEV 18 |
|||
#define ENODEV 19 |
|||
#define ENOTDIR 20 |
|||
#define EISDIR 21 |
|||
#define EINVAL 22 |
|||
#define ENFILE 23 |
|||
#define EMFILE 24 |
|||
#define ENOTTY 25 |
|||
#define EFBIG 27 |
|||
#define ENOSPC 28 |
|||
#define ESPIPE 29 |
|||
#define EROFS 30 |
|||
#define EMLINK 31 |
|||
#define EPIPE 32 |
|||
#define EDOM 33 |
|||
#define ERANGE 34 |
|||
#define EDEADLK 36 |
|||
|
|||
/* defined differently in winsock.h on WinCE */ |
|||
#if !defined(ENAMETOOLONG) |
|||
#define ENAMETOOLONG 38 |
|||
#endif |
|||
|
|||
#define ENOLCK 39 |
|||
#define ENOSYS 40 |
|||
|
|||
/* defined differently in winsock.h on WinCE */ |
|||
#if !defined(ENOTEMPTY) |
|||
#define ENOTEMPTY 41 |
|||
#endif |
|||
|
|||
#define EILSEQ 42 |
|||
|
|||
/* POSIX 2008 - robust mutexes */ |
|||
#define EOWNERDEAD 43 |
|||
#define ENOTRECOVERABLE 44 |
|||
|
|||
/*
|
|||
* Support EDEADLOCK for compatibiity with older MS-C versions. |
|||
*/ |
|||
#define EDEADLOCK EDEADLK |
|||
|
|||
#if defined(__cplusplus) |
|||
} |
|||
#endif |
|||
|
|||
#endif /* _INC_ERRNO */ |
@ -1,47 +0,0 @@ |
|||
/*
|
|||
* nonportable.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements non-portable thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
#include "pthread_mutexattr_setkind_np.c" |
|||
#include "pthread_mutexattr_getkind_np.c" |
|||
#include "pthread_getw32threadhandle_np.c" |
|||
#include "pthread_getunique_np.c" |
|||
#include "pthread_delay_np.c" |
|||
#include "pthread_num_processors_np.c" |
|||
#include "pthread_win32_attach_detach_np.c" |
|||
#include "pthread_timechange_handler_np.c" |
@ -1,54 +0,0 @@ |
|||
/*
|
|||
* private.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines which are private to |
|||
* the implementation and may be used throughout it. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
#include "ptw32_MCS_lock.c" |
|||
#include "ptw32_is_attr.c" |
|||
#include "ptw32_processInitialize.c" |
|||
#include "ptw32_processTerminate.c" |
|||
#include "ptw32_threadStart.c" |
|||
#include "ptw32_threadDestroy.c" |
|||
#include "ptw32_tkAssocCreate.c" |
|||
#include "ptw32_tkAssocDestroy.c" |
|||
#include "ptw32_callUserDestroyRoutines.c" |
|||
#include "ptw32_semwait.c" |
|||
#include "ptw32_timespec.c" |
|||
#include "ptw32_relmillisecs.c" |
|||
#include "ptw32_throw.c" |
|||
#include "ptw32_getprocessors.c" |
@ -1,165 +0,0 @@ |
|||
{ |
|||
'targets': [ |
|||
{ |
|||
'target_name': 'pthread-win32', |
|||
'type': '<(library)', |
|||
'include_dirs': [ |
|||
'.' |
|||
], |
|||
'direct_dependent_settings': { |
|||
'include_dirs': [ |
|||
'.' |
|||
], |
|||
}, |
|||
'conditions': [ |
|||
['OS=="win"', { |
|||
'defines': [ |
|||
'HAVE_PTW32_CONFIG_H', |
|||
'__CLEANUP_C' |
|||
], |
|||
'sources': [ |
|||
'autostatic.c', |
|||
'cleanup.c', |
|||
'create.c', |
|||
'dll.c', |
|||
'errno.c', |
|||
'fork.c', |
|||
'global.c', |
|||
'pthread_attr_destroy.c', |
|||
'pthread_attr_getdetachstate.c', |
|||
'pthread_attr_getinheritsched.c', |
|||
'pthread_attr_getschedparam.c', |
|||
'pthread_attr_getschedpolicy.c', |
|||
'pthread_attr_getscope.c', |
|||
'pthread_attr_getstackaddr.c', |
|||
'pthread_attr_getstacksize.c', |
|||
'pthread_attr_init.c', |
|||
'pthread_attr_setdetachstate.c', |
|||
'pthread_attr_setinheritsched.c', |
|||
'pthread_attr_setschedparam.c', |
|||
'pthread_attr_setschedpolicy.c', |
|||
'pthread_attr_setscope.c', |
|||
'pthread_attr_setstackaddr.c', |
|||
'pthread_attr_setstacksize.c', |
|||
'pthread_barrierattr_destroy.c', |
|||
'pthread_barrierattr_getpshared.c', |
|||
'pthread_barrierattr_init.c', |
|||
'pthread_barrierattr_setpshared.c', |
|||
'pthread_barrier_destroy.c', |
|||
'pthread_barrier_init.c', |
|||
'pthread_barrier_wait.c', |
|||
'pthread_cancel.c', |
|||
'pthread_condattr_destroy.c', |
|||
'pthread_condattr_getpshared.c', |
|||
'pthread_condattr_init.c', |
|||
'pthread_condattr_setpshared.c', |
|||
'pthread_cond_destroy.c', |
|||
'pthread_cond_init.c', |
|||
'pthread_cond_signal.c', |
|||
'pthread_cond_wait.c', |
|||
'pthread_delay_np.c', |
|||
'pthread_detach.c', |
|||
'pthread_equal.c', |
|||
'pthread_exit.c', |
|||
'pthread_getconcurrency.c', |
|||
'pthread_getschedparam.c', |
|||
'pthread_getspecific.c', |
|||
'pthread_getunique_np.c', |
|||
'pthread_getw32threadhandle_np.c', |
|||
'pthread_join.c', |
|||
'pthread_key_create.c', |
|||
'pthread_key_delete.c', |
|||
'pthread_kill.c', |
|||
'pthread_mutexattr_destroy.c', |
|||
'pthread_mutexattr_getkind_np.c', |
|||
'pthread_mutexattr_getpshared.c', |
|||
'pthread_mutexattr_getrobust.c', |
|||
'pthread_mutexattr_gettype.c', |
|||
'pthread_mutexattr_init.c', |
|||
'pthread_mutexattr_setkind_np.c', |
|||
'pthread_mutexattr_setpshared.c', |
|||
'pthread_mutexattr_setrobust.c', |
|||
'pthread_mutexattr_settype.c', |
|||
'pthread_mutex_consistent.c', |
|||
'pthread_mutex_destroy.c', |
|||
'pthread_mutex_init.c', |
|||
'pthread_mutex_lock.c', |
|||
'pthread_mutex_timedlock.c', |
|||
'pthread_mutex_trylock.c', |
|||
'pthread_mutex_unlock.c', |
|||
'pthread_num_processors_np.c', |
|||
'pthread_once.c', |
|||
'pthread_rwlockattr_destroy.c', |
|||
'pthread_rwlockattr_getpshared.c', |
|||
'pthread_rwlockattr_init.c', |
|||
'pthread_rwlockattr_setpshared.c', |
|||
'pthread_rwlock_destroy.c', |
|||
'pthread_rwlock_init.c', |
|||
'pthread_rwlock_rdlock.c', |
|||
'pthread_rwlock_timedrdlock.c', |
|||
'pthread_rwlock_timedwrlock.c', |
|||
'pthread_rwlock_tryrdlock.c', |
|||
'pthread_rwlock_trywrlock.c', |
|||
'pthread_rwlock_unlock.c', |
|||
'pthread_rwlock_wrlock.c', |
|||
'pthread_self.c', |
|||
'pthread_setcancelstate.c', |
|||
'pthread_setcanceltype.c', |
|||
'pthread_setconcurrency.c', |
|||
'pthread_setschedparam.c', |
|||
'pthread_setspecific.c', |
|||
'pthread_spin_destroy.c', |
|||
'pthread_spin_init.c', |
|||
'pthread_spin_lock.c', |
|||
'pthread_spin_trylock.c', |
|||
'pthread_spin_unlock.c', |
|||
'pthread_testcancel.c', |
|||
'pthread_timechange_handler_np.c', |
|||
'pthread_win32_attach_detach_np.c', |
|||
'ptw32_calloc.c', |
|||
'ptw32_callUserDestroyRoutines.c', |
|||
'ptw32_cond_check_need_init.c', |
|||
'ptw32_getprocessors.c', |
|||
'ptw32_is_attr.c', |
|||
'ptw32_MCS_lock.c', |
|||
'ptw32_mutex_check_need_init.c', |
|||
'ptw32_new.c', |
|||
'ptw32_processInitialize.c', |
|||
'ptw32_processTerminate.c', |
|||
'ptw32_relmillisecs.c', |
|||
'ptw32_reuse.c', |
|||
'ptw32_rwlock_cancelwrwait.c', |
|||
'ptw32_rwlock_check_need_init.c', |
|||
'ptw32_semwait.c', |
|||
'ptw32_spinlock_check_need_init.c', |
|||
'ptw32_threadDestroy.c', |
|||
'ptw32_threadStart.c', |
|||
'ptw32_throw.c', |
|||
'ptw32_timespec.c', |
|||
'ptw32_tkAssocCreate.c', |
|||
'ptw32_tkAssocDestroy.c', |
|||
'sched_getscheduler.c', |
|||
'sched_get_priority_max.c', |
|||
'sched_get_priority_min.c', |
|||
'sched_setscheduler.c', |
|||
'sched_yield.c', |
|||
'sem_close.c', |
|||
'sem_destroy.c', |
|||
'sem_getvalue.c', |
|||
'sem_init.c', |
|||
'sem_open.c', |
|||
'sem_post.c', |
|||
'sem_post_multiple.c', |
|||
'sem_timedwait.c', |
|||
'sem_trywait.c', |
|||
'sem_unlink.c', |
|||
'sem_wait.c', |
|||
'signal.c', |
|||
'w32_CancelableWait.c', |
|||
], |
|||
}] |
|||
], |
|||
}, |
|||
] |
|||
} |
|||
|
@ -1,66 +0,0 @@ |
|||
/*
|
|||
* pthread.c |
|||
* |
|||
* Description: |
|||
* This translation unit agregates pthreads-win32 translation units. |
|||
* It is used for inline optimisation of the library, |
|||
* maximising for speed at the expense of size. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/* The following are ordered for inlining */ |
|||
|
|||
#include "private.c" |
|||
#include "attr.c" |
|||
#include "barrier.c" |
|||
#include "cancel.c" |
|||
#include "cleanup.c" |
|||
#include "condvar.c" |
|||
#include "create.c" |
|||
#include "dll.c" |
|||
#include "autostatic.c" |
|||
#include "errno.c" |
|||
#include "exit.c" |
|||
#include "fork.c" |
|||
#include "global.c" |
|||
#include "misc.c" |
|||
#include "mutex.c" |
|||
#include "nonportable.c" |
|||
#include "rwlock.c" |
|||
#include "sched.c" |
|||
#include "semaphore.c" |
|||
#include "signal.c" |
|||
#include "spin.c" |
|||
#include "sync.c" |
|||
#include "tsd.c" |
@ -1,142 +0,0 @@ |
|||
# Microsoft Developer Studio Project File - Name="pthread" - Package Owner=<4> |
|||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
|||
# ** DO NOT EDIT ** |
|||
|
|||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 |
|||
|
|||
CFG=pthread - Win32 Debug |
|||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
|||
!MESSAGE use the Export Makefile command and run |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "pthread.mak". |
|||
!MESSAGE |
|||
!MESSAGE You can specify a configuration when running NMAKE |
|||
!MESSAGE by defining the macro CFG on the command line. For example: |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "pthread.mak" CFG="pthread - Win32 Debug" |
|||
!MESSAGE |
|||
!MESSAGE Possible choices for configuration are: |
|||
!MESSAGE |
|||
!MESSAGE "pthread - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") |
|||
!MESSAGE "pthread - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") |
|||
!MESSAGE |
|||
|
|||
# Begin Project |
|||
# PROP AllowPerConfigDependencies 0 |
|||
# PROP Scc_ProjName "" |
|||
# PROP Scc_LocalPath "" |
|||
CPP=cl.exe |
|||
MTL=midl.exe |
|||
RSC=rc.exe |
|||
|
|||
!IF "$(CFG)" == "pthread - Win32 Release" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 0 |
|||
# PROP BASE Output_Dir "Release" |
|||
# PROP BASE Intermediate_Dir "Release" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 0 |
|||
# PROP Output_Dir "." |
|||
# PROP Intermediate_Dir "." |
|||
# PROP Ignore_Export_Lib 0 |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "__CLEANUP_C" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /c |
|||
# SUBTRACT CPP /u |
|||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 |
|||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 |
|||
# ADD BASE RSC /l 0x809 /d "NDEBUG" |
|||
# ADD RSC /l 0x409 /i "." /d "NDEBUG" /d "PTW32_RC_MSC" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LINK32=link.exe |
|||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 |
|||
# ADD LINK32 kernel32.lib user32.lib ws2_32.lib /nologo /dll /pdb:none /machine:I386 /out:".\pthreadVC2.dll" |
|||
|
|||
!ELSEIF "$(CFG)" == "pthread - Win32 Debug" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 1 |
|||
# PROP BASE Output_Dir "Debug" |
|||
# PROP BASE Intermediate_Dir "Debug" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 1 |
|||
# PROP Output_Dir "." |
|||
# PROP Intermediate_Dir "." |
|||
# PROP Ignore_Export_Lib 0 |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /GZ /c |
|||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "__CLEANUP_C" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PTW32_BUILD" /YX /FD /GZ /c |
|||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 |
|||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 |
|||
# ADD BASE RSC /l 0x809 /d "_DEBUG" |
|||
# ADD RSC /l 0x409 /i "." /d "_DEBUG" /d "PTW32_RC_MSC" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LINK32=link.exe |
|||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept |
|||
# ADD LINK32 kernel32.lib user32.lib ws2_32.lib /nologo /dll /map /debug /machine:I386 /out:".\pthreadVC2.dll" /pdbtype:sept |
|||
# SUBTRACT LINK32 /pdb:none |
|||
|
|||
!ENDIF |
|||
|
|||
# Begin Target |
|||
|
|||
# Name "pthread - Win32 Release" |
|||
# Name "pthread - Win32 Debug" |
|||
# Begin Group "Source Files" |
|||
|
|||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\pthread.c |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Header Files" |
|||
|
|||
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\implement.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\pthread.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\sched.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\semaphore.h |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Resource Files" |
|||
|
|||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\version.rc |
|||
|
|||
!IF "$(CFG)" == "pthread - Win32 Release" |
|||
|
|||
# ADD BASE RSC /l 0xc09 |
|||
# ADD RSC /l 0x409 /i "." /d "PTW32_RC_MSC" |
|||
|
|||
!ELSEIF "$(CFG)" == "pthread - Win32 Debug" |
|||
|
|||
# ADD BASE RSC /l 0xc09 |
|||
# ADD RSC /l 0x409 /i "." /d "PTW32_RC_MSC" |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# End Group |
|||
# End Target |
|||
# End Project |
@ -1,29 +0,0 @@ |
|||
Microsoft Developer Studio Workspace File, Format Version 6.00 |
|||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! |
|||
|
|||
############################################################################### |
|||
|
|||
Project: "pthread"=.\pthread.dsp - Package Owner=<4> |
|||
|
|||
Package=<5> |
|||
{{{ |
|||
}}} |
|||
|
|||
Package=<4> |
|||
{{{ |
|||
}}} |
|||
|
|||
############################################################################### |
|||
|
|||
Global: |
|||
|
|||
Package=<5> |
|||
{{{ |
|||
}}} |
|||
|
|||
Package=<3> |
|||
{{{ |
|||
}}} |
|||
|
|||
############################################################################### |
|||
|
File diff suppressed because it is too large
@ -1,79 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_destroy (pthread_attr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Destroys a thread attributes object. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Destroys a thread attributes object. |
|||
* |
|||
* NOTES: |
|||
* 1) Does not affect threads created with 'attr'. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully destroyed attr, |
|||
* EINVAL 'attr' is invalid. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/*
|
|||
* Set the attribute object to a specific invalid value. |
|||
*/ |
|||
(*attr)->valid = 0; |
|||
free (*attr); |
|||
*attr = NULL; |
|||
|
|||
return 0; |
|||
} |
@ -1,86 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getdetachstate.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_getdetachstate (const pthread_attr_t * attr, int *detachstate) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function determines whether threads created with |
|||
* 'attr' will run detached. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* detachstate |
|||
* pointer to an integer into which is returned one |
|||
* of: |
|||
* |
|||
* PTHREAD_CREATE_JOINABLE |
|||
* Thread ID is valid, must be joined |
|||
* |
|||
* PTHREAD_CREATE_DETACHED |
|||
* Thread ID is invalid, cannot be joined, |
|||
* canceled, or modified |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function determines whether threads created with |
|||
* 'attr' will run detached. |
|||
* |
|||
* NOTES: |
|||
* 1) You cannot join or cancel detached threads. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully retrieved detach state, |
|||
* EINVAL 'attr' is invalid |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0 || detachstate == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
*detachstate = (*attr)->detachstate; |
|||
return 0; |
|||
} |
@ -1,51 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getinheritsched.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_getinheritsched (const pthread_attr_t * attr, int *inheritsched) |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0 || inheritsched == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
*inheritsched = (*attr)->inheritsched; |
|||
return 0; |
|||
} |
@ -1,52 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getschedparam.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_getschedparam (const pthread_attr_t * attr, |
|||
struct sched_param *param) |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0 || param == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
memcpy (param, &(*attr)->param, sizeof (*param)); |
|||
return 0; |
|||
} |
@ -1,61 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getschedpolicy.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_getschedpolicy (const pthread_attr_t * attr, int *policy) |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0 || policy == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/*
|
|||
* Validate the policy arg. |
|||
* Check that a policy constant wasn't passed rather than &policy. |
|||
*/ |
|||
if (policy <= (int *) SCHED_MAX) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
*policy = SCHED_OTHER; |
|||
|
|||
return 0; |
|||
} |
@ -1,54 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getscope.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/* ignore warning "unreferenced formal parameter" */ |
|||
#if defined(_MSC_VER) |
|||
#pragma warning( disable : 4100 ) |
|||
#endif |
|||
|
|||
int |
|||
pthread_attr_getscope (const pthread_attr_t * attr, int *contentionscope) |
|||
{ |
|||
#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) |
|||
*contentionscope = (*attr)->contentionscope; |
|||
return 0; |
|||
#else |
|||
return ENOSYS; |
|||
#endif |
|||
} |
@ -1,97 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getstackaddr.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/* ignore warning "unreferenced formal parameter" */ |
|||
#if defined(_MSC_VER) |
|||
#pragma warning( disable : 4100 ) |
|||
#endif |
|||
|
|||
int |
|||
pthread_attr_getstackaddr (const pthread_attr_t * attr, void **stackaddr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function determines the address of the stack |
|||
* on which threads created with 'attr' will run. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* stackaddr |
|||
* pointer into which is returned the stack address. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function determines the address of the stack |
|||
* on which threads created with 'attr' will run. |
|||
* |
|||
* NOTES: |
|||
* 1) Function supported only if this macro is |
|||
* defined: |
|||
* |
|||
* _POSIX_THREAD_ATTR_STACKADDR |
|||
* |
|||
* 2) Create only one thread for each stack |
|||
* address.. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully retreived stack address, |
|||
* EINVAL 'attr' is invalid |
|||
* ENOSYS function not supported |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
#if defined( _POSIX_THREAD_ATTR_STACKADDR ) |
|||
|
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
*stackaddr = (*attr)->stackaddr; |
|||
return 0; |
|||
|
|||
#else |
|||
|
|||
return ENOSYS; |
|||
|
|||
#endif /* _POSIX_THREAD_ATTR_STACKADDR */ |
|||
} |
@ -1,100 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_getstacksize.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/* ignore warning "unreferenced formal parameter" */ |
|||
#if defined(_MSC_VER) |
|||
#pragma warning( disable : 4100 ) |
|||
#endif |
|||
|
|||
int |
|||
pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * stacksize) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function determines the size of the stack on |
|||
* which threads created with 'attr' will run. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* stacksize |
|||
* pointer to size_t into which is returned the |
|||
* stack size, in bytes. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function determines the size of the stack on |
|||
* which threads created with 'attr' will run. |
|||
* |
|||
* NOTES: |
|||
* 1) Function supported only if this macro is |
|||
* defined: |
|||
* |
|||
* _POSIX_THREAD_ATTR_STACKSIZE |
|||
* |
|||
* 2) Use on newly created attributes object to |
|||
* find the default stack size. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully retrieved stack size, |
|||
* EINVAL 'attr' is invalid |
|||
* ENOSYS function not supported |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
#if defined(_POSIX_THREAD_ATTR_STACKSIZE) |
|||
|
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/* Everything is okay. */ |
|||
*stacksize = (*attr)->stacksize; |
|||
return 0; |
|||
|
|||
#else |
|||
|
|||
return ENOSYS; |
|||
|
|||
#endif /* _POSIX_THREAD_ATTR_STACKSIZE */ |
|||
|
|||
} |
@ -1,117 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_init (pthread_attr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Initializes a thread attributes object with default |
|||
* attributes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Initializes a thread attributes object with default |
|||
* attributes. |
|||
* |
|||
* NOTES: |
|||
* 1) Used to define thread attributes |
|||
* |
|||
* RESULTS |
|||
* 0 successfully initialized attr, |
|||
* ENOMEM insufficient memory for attr. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
pthread_attr_t attr_result; |
|||
|
|||
if (attr == NULL) |
|||
{ |
|||
/* This is disallowed. */ |
|||
return EINVAL; |
|||
} |
|||
|
|||
attr_result = (pthread_attr_t) malloc (sizeof (*attr_result)); |
|||
|
|||
if (attr_result == NULL) |
|||
{ |
|||
return ENOMEM; |
|||
} |
|||
|
|||
#if defined(_POSIX_THREAD_ATTR_STACKSIZE) |
|||
/*
|
|||
* Default to zero size. Unless changed explicitly this |
|||
* will allow Win32 to set the size to that of the |
|||
* main thread. |
|||
*/ |
|||
attr_result->stacksize = 0; |
|||
#endif |
|||
|
|||
#if defined(_POSIX_THREAD_ATTR_STACKADDR) |
|||
/* FIXME: Set this to something sensible when we support it. */ |
|||
attr_result->stackaddr = NULL; |
|||
#endif |
|||
|
|||
attr_result->detachstate = PTHREAD_CREATE_JOINABLE; |
|||
|
|||
#if defined(HAVE_SIGSET_T) |
|||
memset (&(attr_result->sigmask), 0, sizeof (sigset_t)); |
|||
#endif /* HAVE_SIGSET_T */ |
|||
|
|||
/*
|
|||
* Win32 sets new threads to THREAD_PRIORITY_NORMAL and |
|||
* not to that of the parent thread. We choose to default to |
|||
* this arrangement. |
|||
*/ |
|||
attr_result->param.sched_priority = THREAD_PRIORITY_NORMAL; |
|||
attr_result->inheritsched = PTHREAD_EXPLICIT_SCHED; |
|||
attr_result->contentionscope = PTHREAD_SCOPE_SYSTEM; |
|||
|
|||
attr_result->valid = PTW32_ATTR_VALID; |
|||
|
|||
*attr = attr_result; |
|||
|
|||
return 0; |
|||
} |
@ -1,91 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setdetachstate.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function specifies whether threads created with |
|||
* 'attr' will run detached. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* detachstate |
|||
* an integer containing one of: |
|||
* |
|||
* PTHREAD_CREATE_JOINABLE |
|||
* Thread ID is valid, must be joined |
|||
* |
|||
* PTHREAD_CREATE_DETACHED |
|||
* Thread ID is invalid, cannot be joined, |
|||
* canceled, or modified |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function specifies whether threads created with |
|||
* 'attr' will run detached. |
|||
* |
|||
* NOTES: |
|||
* 1) You cannot join or cancel detached threads. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully set detach state, |
|||
* EINVAL 'attr' or 'detachstate' is invalid |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (detachstate != PTHREAD_CREATE_JOINABLE && |
|||
detachstate != PTHREAD_CREATE_DETACHED) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
(*attr)->detachstate = detachstate; |
|||
return 0; |
|||
} |
@ -1,57 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setinheritsched.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_setinheritsched (pthread_attr_t * attr, int inheritsched) |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (PTHREAD_INHERIT_SCHED != inheritsched |
|||
&& PTHREAD_EXPLICIT_SCHED != inheritsched) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
(*attr)->inheritsched = inheritsched; |
|||
return 0; |
|||
} |
@ -1,63 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setschedparam.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_setschedparam (pthread_attr_t * attr, |
|||
const struct sched_param *param) |
|||
{ |
|||
int priority; |
|||
|
|||
if (ptw32_is_attr (attr) != 0 || param == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
priority = param->sched_priority; |
|||
|
|||
/* Validate priority level. */ |
|||
if (priority < sched_get_priority_min (SCHED_OTHER) || |
|||
priority > sched_get_priority_max (SCHED_OTHER)) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
memcpy (&(*attr)->param, param, sizeof (*param)); |
|||
return 0; |
|||
} |
@ -1,55 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setschedpolicy.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_attr_setschedpolicy (pthread_attr_t * attr, int policy) |
|||
{ |
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (policy != SCHED_OTHER) |
|||
{ |
|||
return ENOTSUP; |
|||
} |
|||
|
|||
return 0; |
|||
} |
@ -1,62 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setscope.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/* ignore warning "unreferenced formal parameter" */ |
|||
#if defined(_MSC_VER) |
|||
#pragma warning( disable : 4100 ) |
|||
#endif |
|||
|
|||
int |
|||
pthread_attr_setscope (pthread_attr_t * attr, int contentionscope) |
|||
{ |
|||
#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) |
|||
switch (contentionscope) |
|||
{ |
|||
case PTHREAD_SCOPE_SYSTEM: |
|||
(*attr)->contentionscope = contentionscope; |
|||
return 0; |
|||
case PTHREAD_SCOPE_PROCESS: |
|||
return ENOTSUP; |
|||
default: |
|||
return EINVAL; |
|||
} |
|||
#else |
|||
return ENOSYS; |
|||
#endif |
|||
} |
@ -1,97 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setstackaddr.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_setstackaddr (pthread_attr_t * attr, void *stackaddr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Threads created with 'attr' will run on the stack |
|||
* starting at 'stackaddr'. |
|||
* Stack must be at least PTHREAD_STACK_MIN bytes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* stackaddr |
|||
* the address of the stack to use |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Threads created with 'attr' will run on the stack |
|||
* starting at 'stackaddr'. |
|||
* Stack must be at least PTHREAD_STACK_MIN bytes. |
|||
* |
|||
* NOTES: |
|||
* 1) Function supported only if this macro is |
|||
* defined: |
|||
* |
|||
* _POSIX_THREAD_ATTR_STACKADDR |
|||
* |
|||
* 2) Create only one thread for each stack |
|||
* address.. |
|||
* |
|||
* 3) Ensure that stackaddr is aligned. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully set stack address, |
|||
* EINVAL 'attr' is invalid |
|||
* ENOSYS function not supported |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
#if defined( _POSIX_THREAD_ATTR_STACKADDR ) |
|||
|
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
(*attr)->stackaddr = stackaddr; |
|||
return 0; |
|||
|
|||
#else |
|||
|
|||
return ENOSYS; |
|||
|
|||
#endif /* _POSIX_THREAD_ATTR_STACKADDR */ |
|||
} |
@ -1,110 +0,0 @@ |
|||
/*
|
|||
* pthread_attr_setstacksize.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements operations on thread attribute objects. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_attr_setstacksize (pthread_attr_t * attr, size_t stacksize) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function specifies the size of the stack on |
|||
* which threads created with 'attr' will run. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_attr_t |
|||
* |
|||
* stacksize |
|||
* stack size, in bytes. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function specifies the size of the stack on |
|||
* which threads created with 'attr' will run. |
|||
* |
|||
* NOTES: |
|||
* 1) Function supported only if this macro is |
|||
* defined: |
|||
* |
|||
* _POSIX_THREAD_ATTR_STACKSIZE |
|||
* |
|||
* 2) Find the default first (using |
|||
* pthread_attr_getstacksize), then increase |
|||
* by multiplying. |
|||
* |
|||
* 3) Only use if thread needs more than the |
|||
* default. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully set stack size, |
|||
* EINVAL 'attr' is invalid or stacksize too |
|||
* small or too big. |
|||
* ENOSYS function not supported |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
#if defined(_POSIX_THREAD_ATTR_STACKSIZE) |
|||
|
|||
#if PTHREAD_STACK_MIN > 0 |
|||
|
|||
/* Verify that the stack size is within range. */ |
|||
if (stacksize < PTHREAD_STACK_MIN) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
#endif |
|||
|
|||
if (ptw32_is_attr (attr) != 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/* Everything is okay. */ |
|||
(*attr)->stacksize = stacksize; |
|||
return 0; |
|||
|
|||
#else |
|||
|
|||
return ENOSYS; |
|||
|
|||
#endif /* _POSIX_THREAD_ATTR_STACKSIZE */ |
|||
|
|||
} |
@ -1,103 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
int |
|||
pthread_barrier_destroy (pthread_barrier_t * barrier) |
|||
{ |
|||
int result = 0; |
|||
pthread_barrier_t b; |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
if (barrier == NULL || *barrier == (pthread_barrier_t) PTW32_OBJECT_INVALID) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (0 != ptw32_mcs_lock_try_acquire(&(*barrier)->lock, &node)) |
|||
{ |
|||
return EBUSY; |
|||
} |
|||
|
|||
b = *barrier; |
|||
|
|||
if (b->nCurrentBarrierHeight < b->nInitialBarrierHeight) |
|||
{ |
|||
result = EBUSY; |
|||
} |
|||
else |
|||
{ |
|||
if (0 == (result = sem_destroy (&(b->semBarrierBreeched)))) |
|||
{ |
|||
*barrier = (pthread_barrier_t) PTW32_OBJECT_INVALID; |
|||
/*
|
|||
* Release the lock before freeing b. |
|||
* |
|||
* FIXME: There may be successors which, when we release the lock, |
|||
* will be linked into b->lock, which will be corrupted at some |
|||
* point with undefined results for the application. To fix this |
|||
* will require changing pthread_barrier_t from a pointer to |
|||
* pthread_barrier_t_ to an instance. This is a change to the ABI |
|||
* and will require a major version number increment. |
|||
*/ |
|||
ptw32_mcs_lock_release(&node); |
|||
(void) free (b); |
|||
return 0; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* This should not ever be reached. |
|||
* Restore the barrier to working condition before returning. |
|||
*/ |
|||
(void) sem_init (&(b->semBarrierBreeched), b->pshared, 0); |
|||
} |
|||
|
|||
if (result != 0) |
|||
{ |
|||
/*
|
|||
* The barrier still exists and is valid |
|||
* in the event of any error above. |
|||
*/ |
|||
result = EBUSY; |
|||
} |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
return (result); |
|||
} |
@ -1,69 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrier_init (pthread_barrier_t * barrier, |
|||
const pthread_barrierattr_t * attr, unsigned int count) |
|||
{ |
|||
pthread_barrier_t b; |
|||
|
|||
if (barrier == NULL || count == 0) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (NULL != (b = (pthread_barrier_t) calloc (1, sizeof (*b)))) |
|||
{ |
|||
b->pshared = (attr != NULL && *attr != NULL |
|||
? (*attr)->pshared : PTHREAD_PROCESS_PRIVATE); |
|||
|
|||
b->nCurrentBarrierHeight = b->nInitialBarrierHeight = count; |
|||
b->lock = 0; |
|||
|
|||
if (0 == sem_init (&(b->semBarrierBreeched), b->pshared, 0)) |
|||
{ |
|||
*barrier = b; |
|||
return 0; |
|||
} |
|||
(void) free (b); |
|||
} |
|||
|
|||
return ENOMEM; |
|||
} |
@ -1,104 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_wait.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrier_wait (pthread_barrier_t * barrier) |
|||
{ |
|||
int result; |
|||
pthread_barrier_t b; |
|||
|
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
if (barrier == NULL || *barrier == (pthread_barrier_t) PTW32_OBJECT_INVALID) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
ptw32_mcs_lock_acquire(&(*barrier)->lock, &node); |
|||
|
|||
b = *barrier; |
|||
if (--b->nCurrentBarrierHeight == 0) |
|||
{ |
|||
/*
|
|||
* We are the last thread to arrive at the barrier before it releases us. |
|||
* Move our MCS local node to the global scope barrier handle so that the |
|||
* last thread out (not necessarily us) can release the lock. |
|||
*/ |
|||
ptw32_mcs_node_transfer(&b->proxynode, &node); |
|||
|
|||
/*
|
|||
* Any threads that have not quite entered sem_wait below when the |
|||
* multiple_post has completed will nevertheless continue through |
|||
* the semaphore (barrier). |
|||
*/ |
|||
result = (b->nInitialBarrierHeight > 1 |
|||
? sem_post_multiple (&(b->semBarrierBreeched), |
|||
b->nInitialBarrierHeight - 1) : 0); |
|||
} |
|||
else |
|||
{ |
|||
ptw32_mcs_lock_release(&node); |
|||
/*
|
|||
* Use the non-cancelable version of sem_wait(). |
|||
* |
|||
* It is possible that all nInitialBarrierHeight-1 threads are |
|||
* at this point when the last thread enters the barrier, resets |
|||
* nCurrentBarrierHeight = nInitialBarrierHeight and leaves. |
|||
* If pthread_barrier_destroy is called at that moment then the |
|||
* barrier will be destroyed along with the semas. |
|||
*/ |
|||
result = ptw32_semwait (&(b->semBarrierBreeched)); |
|||
} |
|||
|
|||
if ((PTW32_INTERLOCKED_LONG)PTW32_INTERLOCKED_INCREMENT_LONG((PTW32_INTERLOCKED_LONGPTR)&b->nCurrentBarrierHeight) |
|||
== (PTW32_INTERLOCKED_LONG)b->nInitialBarrierHeight) |
|||
{ |
|||
/*
|
|||
* We are the last thread to cross this barrier |
|||
*/ |
|||
ptw32_mcs_lock_release(&b->proxynode); |
|||
if (0 == result) |
|||
{ |
|||
result = PTHREAD_BARRIER_SERIAL_THREAD; |
|||
} |
|||
} |
|||
|
|||
return (result); |
|||
} |
@ -1,83 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_attr_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrierattr_destroy (pthread_barrierattr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Destroys a barrier attributes object. The object can |
|||
* no longer be used. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_barrierattr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Destroys a barrier attributes object. The object can |
|||
* no longer be used. |
|||
* |
|||
* NOTES: |
|||
* 1) Does not affect barrieres created using 'attr' |
|||
* |
|||
* RESULTS |
|||
* 0 successfully released attr, |
|||
* EINVAL 'attr' is invalid. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result = 0; |
|||
|
|||
if (attr == NULL || *attr == NULL) |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
else |
|||
{ |
|||
pthread_barrierattr_t ba = *attr; |
|||
|
|||
*attr = NULL; |
|||
free (ba); |
|||
} |
|||
|
|||
return (result); |
|||
} /* pthread_barrierattr_destroy */ |
@ -1,95 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_attr_getpshared.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrierattr_getpshared (const pthread_barrierattr_t * attr, |
|||
int *pshared) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Determine whether barriers created with 'attr' can be |
|||
* shared between processes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_barrierattr_t |
|||
* |
|||
* pshared |
|||
* will be set to one of: |
|||
* |
|||
* PTHREAD_PROCESS_SHARED |
|||
* May be shared if in shared memory |
|||
* |
|||
* PTHREAD_PROCESS_PRIVATE |
|||
* Cannot be shared. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Mutexes creatd with 'attr' can be shared between |
|||
* processes if pthread_barrier_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* NOTES: |
|||
* 1) pshared barriers MUST be allocated in shared |
|||
* memory. |
|||
* 2) The following macro is defined if shared barriers |
|||
* are supported: |
|||
* _POSIX_THREAD_PROCESS_SHARED |
|||
* |
|||
* RESULTS |
|||
* 0 successfully retrieved attribute, |
|||
* EINVAL 'attr' is invalid, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
|
|||
if ((attr != NULL && *attr != NULL) && (pshared != NULL)) |
|||
{ |
|||
*pshared = (*attr)->pshared; |
|||
result = 0; |
|||
} |
|||
else |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return (result); |
|||
} /* pthread_barrierattr_getpshared */ |
@ -1,85 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_attr_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrierattr_init (pthread_barrierattr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Initializes a barrier attributes object with default |
|||
* attributes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_barrierattr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Initializes a barrier attributes object with default |
|||
* attributes. |
|||
* |
|||
* NOTES: |
|||
* 1) Used to define barrier types |
|||
* |
|||
* RESULTS |
|||
* 0 successfully initialized attr, |
|||
* ENOMEM insufficient memory for attr. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
pthread_barrierattr_t ba; |
|||
int result = 0; |
|||
|
|||
ba = (pthread_barrierattr_t) calloc (1, sizeof (*ba)); |
|||
|
|||
if (ba == NULL) |
|||
{ |
|||
result = ENOMEM; |
|||
} |
|||
else |
|||
{ |
|||
ba->pshared = PTHREAD_PROCESS_PRIVATE; |
|||
} |
|||
|
|||
*attr = ba; |
|||
|
|||
return (result); |
|||
} /* pthread_barrierattr_init */ |
@ -1,119 +0,0 @@ |
|||
/*
|
|||
* pthread_barrier_attr_setpshared.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements barrier primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, int pshared) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Barriers created with 'attr' can be shared between |
|||
* processes if pthread_barrier_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_barrierattr_t |
|||
* |
|||
* pshared |
|||
* must be one of: |
|||
* |
|||
* PTHREAD_PROCESS_SHARED |
|||
* May be shared if in shared memory |
|||
* |
|||
* PTHREAD_PROCESS_PRIVATE |
|||
* Cannot be shared. |
|||
* |
|||
* DESCRIPTION |
|||
* Mutexes creatd with 'attr' can be shared between |
|||
* processes if pthread_barrier_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* |
|||
* NOTES: |
|||
* 1) pshared barriers MUST be allocated in shared |
|||
* memory. |
|||
* |
|||
* 2) The following macro is defined if shared barriers |
|||
* are supported: |
|||
* _POSIX_THREAD_PROCESS_SHARED |
|||
* |
|||
* RESULTS |
|||
* 0 successfully set attribute, |
|||
* EINVAL 'attr' or pshared is invalid, |
|||
* ENOSYS PTHREAD_PROCESS_SHARED not supported, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
|
|||
if ((attr != NULL && *attr != NULL) && |
|||
((pshared == PTHREAD_PROCESS_SHARED) || |
|||
(pshared == PTHREAD_PROCESS_PRIVATE))) |
|||
{ |
|||
if (pshared == PTHREAD_PROCESS_SHARED) |
|||
{ |
|||
|
|||
#if !defined( _POSIX_THREAD_PROCESS_SHARED ) |
|||
|
|||
result = ENOSYS; |
|||
pshared = PTHREAD_PROCESS_PRIVATE; |
|||
|
|||
#else |
|||
|
|||
result = 0; |
|||
|
|||
#endif /* _POSIX_THREAD_PROCESS_SHARED */ |
|||
|
|||
} |
|||
else |
|||
{ |
|||
result = 0; |
|||
} |
|||
|
|||
(*attr)->pshared = pshared; |
|||
} |
|||
else |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return (result); |
|||
|
|||
} /* pthread_barrierattr_setpshared */ |
@ -1,189 +0,0 @@ |
|||
/*
|
|||
* pthread_cancel.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions related to thread cancellation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "context.h" |
|||
|
|||
static void |
|||
ptw32_cancel_self (void) |
|||
{ |
|||
ptw32_throw (PTW32_EPS_CANCEL); |
|||
|
|||
/* Never reached */ |
|||
} |
|||
|
|||
static void CALLBACK |
|||
ptw32_cancel_callback (ULONG_PTR unused) |
|||
{ |
|||
ptw32_throw (PTW32_EPS_CANCEL); |
|||
|
|||
/* Never reached */ |
|||
} |
|||
|
|||
/*
|
|||
* ptw32_RegisterCancelation() - |
|||
* Must have args of same type as QueueUserAPCEx because this function |
|||
* is a substitute for QueueUserAPCEx if it's not available. |
|||
*/ |
|||
DWORD |
|||
ptw32_RegisterCancelation (PAPCFUNC unused1, HANDLE threadH, DWORD unused2) |
|||
{ |
|||
CONTEXT context; |
|||
|
|||
context.ContextFlags = CONTEXT_CONTROL; |
|||
GetThreadContext (threadH, &context); |
|||
PTW32_PROGCTR (context) = (DWORD_PTR) ptw32_cancel_self; |
|||
SetThreadContext (threadH, &context); |
|||
return 0; |
|||
} |
|||
|
|||
int |
|||
pthread_cancel (pthread_t thread) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function requests cancellation of 'thread'. |
|||
* |
|||
* PARAMETERS |
|||
* thread |
|||
* reference to an instance of pthread_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function requests cancellation of 'thread'. |
|||
* NOTE: cancellation is asynchronous; use pthread_join to |
|||
* wait for termination of 'thread' if necessary. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully requested cancellation, |
|||
* ESRCH no thread found corresponding to 'thread', |
|||
* ENOMEM implicit self thread create failed. |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
int cancel_self; |
|||
pthread_t self; |
|||
ptw32_thread_t * tp; |
|||
ptw32_mcs_local_node_t stateLock; |
|||
|
|||
result = pthread_kill (thread, 0); |
|||
|
|||
if (0 != result) |
|||
{ |
|||
return result; |
|||
} |
|||
|
|||
if ((self = pthread_self ()).p == NULL) |
|||
{ |
|||
return ENOMEM; |
|||
}; |
|||
|
|||
/*
|
|||
* For self cancellation we need to ensure that a thread can't |
|||
* deadlock itself trying to cancel itself asynchronously |
|||
* (pthread_cancel is required to be an async-cancel |
|||
* safe function). |
|||
*/ |
|||
cancel_self = pthread_equal (thread, self); |
|||
|
|||
tp = (ptw32_thread_t *) thread.p; |
|||
|
|||
/*
|
|||
* Lock for async-cancel safety. |
|||
*/ |
|||
ptw32_mcs_lock_acquire (&tp->stateLock, &stateLock); |
|||
|
|||
if (tp->cancelType == PTHREAD_CANCEL_ASYNCHRONOUS |
|||
&& tp->cancelState == PTHREAD_CANCEL_ENABLE |
|||
&& tp->state < PThreadStateCanceling) |
|||
{ |
|||
if (cancel_self) |
|||
{ |
|||
tp->state = PThreadStateCanceling; |
|||
tp->cancelState = PTHREAD_CANCEL_DISABLE; |
|||
|
|||
ptw32_mcs_lock_release (&stateLock); |
|||
ptw32_throw (PTW32_EPS_CANCEL); |
|||
|
|||
/* Never reached */ |
|||
} |
|||
else |
|||
{ |
|||
HANDLE threadH = tp->threadH; |
|||
|
|||
SuspendThread (threadH); |
|||
|
|||
if (WaitForSingleObject (threadH, 0) == WAIT_TIMEOUT) |
|||
{ |
|||
tp->state = PThreadStateCanceling; |
|||
tp->cancelState = PTHREAD_CANCEL_DISABLE; |
|||
/*
|
|||
* If alertdrv and QueueUserAPCEx is available then the following |
|||
* will result in a call to QueueUserAPCEx with the args given, otherwise |
|||
* this will result in a call to ptw32_RegisterCancelation and only |
|||
* the threadH arg will be used. |
|||
*/ |
|||
ptw32_register_cancelation ((PAPCFUNC)ptw32_cancel_callback, threadH, 0); |
|||
ptw32_mcs_lock_release (&stateLock); |
|||
ResumeThread (threadH); |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Set for deferred cancellation. |
|||
*/ |
|||
if (tp->state < PThreadStateCancelPending) |
|||
{ |
|||
tp->state = PThreadStateCancelPending; |
|||
if (!SetEvent (tp->cancelEvent)) |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
} |
|||
else if (tp->state >= PThreadStateCanceling) |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
|
|||
ptw32_mcs_lock_release (&stateLock); |
|||
} |
|||
|
|||
return (result); |
|||
} |
@ -1,253 +0,0 @@ |
|||
/*
|
|||
* pthread_cond_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
int |
|||
pthread_cond_destroy (pthread_cond_t * cond) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function destroys a condition variable |
|||
* |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function destroys a condition variable. |
|||
* |
|||
* NOTES: |
|||
* 1) A condition variable can be destroyed |
|||
* immediately after all the threads that |
|||
* are blocked on it are awakened. e.g. |
|||
* |
|||
* struct list { |
|||
* pthread_mutex_t lm; |
|||
* ... |
|||
* } |
|||
* |
|||
* struct elt { |
|||
* key k; |
|||
* int busy; |
|||
* pthread_cond_t notbusy; |
|||
* ... |
|||
* } |
|||
* |
|||
* |
|||
* struct elt * |
|||
* list_find(struct list *lp, key k) |
|||
* { |
|||
* struct elt *ep; |
|||
* |
|||
* pthread_mutex_lock(&lp->lm); |
|||
* while ((ep = find_elt(l,k) != NULL) && ep->busy) |
|||
* pthread_cond_wait(&ep->notbusy, &lp->lm); |
|||
* if (ep != NULL) |
|||
* ep->busy = 1; |
|||
* pthread_mutex_unlock(&lp->lm); |
|||
* return(ep); |
|||
* } |
|||
* |
|||
* delete_elt(struct list *lp, struct elt *ep) |
|||
* { |
|||
* pthread_mutex_lock(&lp->lm); |
|||
* assert(ep->busy); |
|||
* ... remove ep from list ... |
|||
* ep->busy = 0; |
|||
* (A) pthread_cond_broadcast(&ep->notbusy); |
|||
* pthread_mutex_unlock(&lp->lm); |
|||
* (B) pthread_cond_destroy(&rp->notbusy); |
|||
* free(ep); |
|||
* } |
|||
* |
|||
* In this example, the condition variable |
|||
* and its list element may be freed (line B) |
|||
* immediately after all threads waiting for |
|||
* it are awakened (line A), since the mutex |
|||
* and the code ensure that no other thread |
|||
* can touch the element to be deleted. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully released condition variable, |
|||
* EINVAL 'cond' is invalid, |
|||
* EBUSY 'cond' is in use, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
pthread_cond_t cv; |
|||
int result = 0, result1 = 0, result2 = 0; |
|||
|
|||
/*
|
|||
* Assuming any race condition here is harmless. |
|||
*/ |
|||
if (cond == NULL || *cond == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (*cond != PTHREAD_COND_INITIALIZER) |
|||
{ |
|||
ptw32_mcs_local_node_t node; |
|||
ptw32_mcs_lock_acquire(&ptw32_cond_list_lock, &node); |
|||
|
|||
cv = *cond; |
|||
|
|||
/*
|
|||
* Close the gate; this will synchronize this thread with |
|||
* all already signaled waiters to let them retract their |
|||
* waiter status - SEE NOTE 1 ABOVE!!! |
|||
*/ |
|||
if (ptw32_semwait (&(cv->semBlockLock)) != 0) /* Non-cancelable */ |
|||
{ |
|||
result = errno; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* !TRY! lock mtxUnblockLock; try will detect busy condition |
|||
* and will not cause a deadlock with respect to concurrent |
|||
* signal/broadcast. |
|||
*/ |
|||
if ((result = pthread_mutex_trylock (&(cv->mtxUnblockLock))) != 0) |
|||
{ |
|||
(void) sem_post (&(cv->semBlockLock)); |
|||
} |
|||
} |
|||
|
|||
if (result != 0) |
|||
{ |
|||
ptw32_mcs_lock_release(&node); |
|||
return result; |
|||
} |
|||
|
|||
/*
|
|||
* Check whether cv is still busy (still has waiters) |
|||
*/ |
|||
if (cv->nWaitersBlocked > cv->nWaitersGone) |
|||
{ |
|||
if (sem_post (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
result = errno; |
|||
} |
|||
result1 = pthread_mutex_unlock (&(cv->mtxUnblockLock)); |
|||
result2 = EBUSY; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Now it is safe to destroy |
|||
*/ |
|||
*cond = NULL; |
|||
|
|||
if (sem_destroy (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
result = errno; |
|||
} |
|||
if (sem_destroy (&(cv->semBlockQueue)) != 0) |
|||
{ |
|||
result1 = errno; |
|||
} |
|||
if ((result2 = pthread_mutex_unlock (&(cv->mtxUnblockLock))) == 0) |
|||
{ |
|||
result2 = pthread_mutex_destroy (&(cv->mtxUnblockLock)); |
|||
} |
|||
|
|||
/* Unlink the CV from the list */ |
|||
|
|||
if (ptw32_cond_list_head == cv) |
|||
{ |
|||
ptw32_cond_list_head = cv->next; |
|||
} |
|||
else |
|||
{ |
|||
cv->prev->next = cv->next; |
|||
} |
|||
|
|||
if (ptw32_cond_list_tail == cv) |
|||
{ |
|||
ptw32_cond_list_tail = cv->prev; |
|||
} |
|||
else |
|||
{ |
|||
cv->next->prev = cv->prev; |
|||
} |
|||
|
|||
(void) free (cv); |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
} |
|||
else |
|||
{ |
|||
ptw32_mcs_local_node_t node; |
|||
/*
|
|||
* See notes in ptw32_cond_check_need_init() above also. |
|||
*/ |
|||
ptw32_mcs_lock_acquire(&ptw32_cond_test_init_lock, &node); |
|||
|
|||
/*
|
|||
* Check again. |
|||
*/ |
|||
if (*cond == PTHREAD_COND_INITIALIZER) |
|||
{ |
|||
/*
|
|||
* This is all we need to do to destroy a statically |
|||
* initialised cond that has not yet been used (initialised). |
|||
* If we get to here, another thread waiting to initialise |
|||
* this cond will get an EINVAL. That's OK. |
|||
*/ |
|||
*cond = NULL; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* The cv has been initialised while we were waiting |
|||
* so assume it's in use. |
|||
*/ |
|||
result = EBUSY; |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
} |
|||
|
|||
return ((result != 0) ? result : ((result1 != 0) ? result1 : result2)); |
|||
} |
@ -1,167 +0,0 @@ |
|||
/*
|
|||
* pthread_cond_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function initializes a condition variable. |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* attr |
|||
* specifies optional creation attributes. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function initializes a condition variable. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully created condition variable, |
|||
* EINVAL 'attr' is invalid, |
|||
* EAGAIN insufficient resources (other than |
|||
* memory, |
|||
* ENOMEM insufficient memory, |
|||
* EBUSY 'cond' is already initialized, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
pthread_cond_t cv = NULL; |
|||
|
|||
if (cond == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if ((attr != NULL && *attr != NULL) && |
|||
((*attr)->pshared == PTHREAD_PROCESS_SHARED)) |
|||
{ |
|||
/*
|
|||
* Creating condition variable that can be shared between |
|||
* processes. |
|||
*/ |
|||
result = ENOSYS; |
|||
goto DONE; |
|||
} |
|||
|
|||
cv = (pthread_cond_t) calloc (1, sizeof (*cv)); |
|||
|
|||
if (cv == NULL) |
|||
{ |
|||
result = ENOMEM; |
|||
goto DONE; |
|||
} |
|||
|
|||
cv->nWaitersBlocked = 0; |
|||
cv->nWaitersToUnblock = 0; |
|||
cv->nWaitersGone = 0; |
|||
|
|||
if (sem_init (&(cv->semBlockLock), 0, 1) != 0) |
|||
{ |
|||
result = errno; |
|||
goto FAIL0; |
|||
} |
|||
|
|||
if (sem_init (&(cv->semBlockQueue), 0, 0) != 0) |
|||
{ |
|||
result = errno; |
|||
goto FAIL1; |
|||
} |
|||
|
|||
if ((result = pthread_mutex_init (&(cv->mtxUnblockLock), 0)) != 0) |
|||
{ |
|||
goto FAIL2; |
|||
} |
|||
|
|||
result = 0; |
|||
|
|||
goto DONE; |
|||
|
|||
/*
|
|||
* ------------- |
|||
* Failed... |
|||
* ------------- |
|||
*/ |
|||
FAIL2: |
|||
(void) sem_destroy (&(cv->semBlockQueue)); |
|||
|
|||
FAIL1: |
|||
(void) sem_destroy (&(cv->semBlockLock)); |
|||
|
|||
FAIL0: |
|||
(void) free (cv); |
|||
cv = NULL; |
|||
|
|||
DONE: |
|||
if (0 == result) |
|||
{ |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
ptw32_mcs_lock_acquire(&ptw32_cond_list_lock, &node); |
|||
|
|||
cv->next = NULL; |
|||
cv->prev = ptw32_cond_list_tail; |
|||
|
|||
if (ptw32_cond_list_tail != NULL) |
|||
{ |
|||
ptw32_cond_list_tail->next = cv; |
|||
} |
|||
|
|||
ptw32_cond_list_tail = cv; |
|||
|
|||
if (ptw32_cond_list_head == NULL) |
|||
{ |
|||
ptw32_cond_list_head = cv; |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
} |
|||
|
|||
*cond = cv; |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_cond_init */ |
@ -1,231 +0,0 @@ |
|||
/*
|
|||
* pthread_cond_signal.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
* |
|||
* ------------------------------------------------------------- |
|||
* Algorithm: |
|||
* See the comments at the top of pthread_cond_wait.c. |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
static INLINE int |
|||
ptw32_cond_unblock (pthread_cond_t * cond, int unblockAll) |
|||
/*
|
|||
* Notes. |
|||
* |
|||
* Does not use the external mutex for synchronisation, |
|||
* therefore semBlockLock is needed. |
|||
* mtxUnblockLock is for LEVEL-2 synch. LEVEL-2 is the |
|||
* state where the external mutex is not necessarily locked by |
|||
* any thread, ie. between cond_wait unlocking and re-acquiring |
|||
* the lock after having been signaled or a timeout or |
|||
* cancellation. |
|||
* |
|||
* Uses the following CV elements: |
|||
* nWaitersBlocked |
|||
* nWaitersToUnblock |
|||
* nWaitersGone |
|||
* mtxUnblockLock |
|||
* semBlockLock |
|||
* semBlockQueue |
|||
*/ |
|||
{ |
|||
int result; |
|||
pthread_cond_t cv; |
|||
int nSignalsToIssue; |
|||
|
|||
if (cond == NULL || *cond == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
cv = *cond; |
|||
|
|||
/*
|
|||
* No-op if the CV is static and hasn't been initialised yet. |
|||
* Assuming that any race condition is harmless. |
|||
*/ |
|||
if (cv == PTHREAD_COND_INITIALIZER) |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
if ((result = pthread_mutex_lock (&(cv->mtxUnblockLock))) != 0) |
|||
{ |
|||
return result; |
|||
} |
|||
|
|||
if (0 != cv->nWaitersToUnblock) |
|||
{ |
|||
if (0 == cv->nWaitersBlocked) |
|||
{ |
|||
return pthread_mutex_unlock (&(cv->mtxUnblockLock)); |
|||
} |
|||
if (unblockAll) |
|||
{ |
|||
cv->nWaitersToUnblock += (nSignalsToIssue = cv->nWaitersBlocked); |
|||
cv->nWaitersBlocked = 0; |
|||
} |
|||
else |
|||
{ |
|||
nSignalsToIssue = 1; |
|||
cv->nWaitersToUnblock++; |
|||
cv->nWaitersBlocked--; |
|||
} |
|||
} |
|||
else if (cv->nWaitersBlocked > cv->nWaitersGone) |
|||
{ |
|||
/* Use the non-cancellable version of sem_wait() */ |
|||
if (ptw32_semwait (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
result = errno; |
|||
(void) pthread_mutex_unlock (&(cv->mtxUnblockLock)); |
|||
return result; |
|||
} |
|||
if (0 != cv->nWaitersGone) |
|||
{ |
|||
cv->nWaitersBlocked -= cv->nWaitersGone; |
|||
cv->nWaitersGone = 0; |
|||
} |
|||
if (unblockAll) |
|||
{ |
|||
nSignalsToIssue = cv->nWaitersToUnblock = cv->nWaitersBlocked; |
|||
cv->nWaitersBlocked = 0; |
|||
} |
|||
else |
|||
{ |
|||
nSignalsToIssue = cv->nWaitersToUnblock = 1; |
|||
cv->nWaitersBlocked--; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
return pthread_mutex_unlock (&(cv->mtxUnblockLock)); |
|||
} |
|||
|
|||
if ((result = pthread_mutex_unlock (&(cv->mtxUnblockLock))) == 0) |
|||
{ |
|||
if (sem_post_multiple (&(cv->semBlockQueue), nSignalsToIssue) != 0) |
|||
{ |
|||
result = errno; |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
|
|||
} /* ptw32_cond_unblock */ |
|||
|
|||
int |
|||
pthread_cond_signal (pthread_cond_t * cond) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function signals a condition variable, waking |
|||
* one waiting thread. |
|||
* If SCHED_FIFO or SCHED_RR policy threads are waiting |
|||
* the highest priority waiter is awakened; otherwise, |
|||
* an unspecified waiter is awakened. |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function signals a condition variable, waking |
|||
* one waiting thread. |
|||
* If SCHED_FIFO or SCHED_RR policy threads are waiting |
|||
* the highest priority waiter is awakened; otherwise, |
|||
* an unspecified waiter is awakened. |
|||
* |
|||
* NOTES: |
|||
* |
|||
* 1) Use when any waiter can respond and only one need |
|||
* respond (all waiters being equal). |
|||
* |
|||
* RESULTS |
|||
* 0 successfully signaled condition, |
|||
* EINVAL 'cond' is invalid, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
/*
|
|||
* The '0'(FALSE) unblockAll arg means unblock ONE waiter. |
|||
*/ |
|||
return (ptw32_cond_unblock (cond, 0)); |
|||
|
|||
} /* pthread_cond_signal */ |
|||
|
|||
int |
|||
pthread_cond_broadcast (pthread_cond_t * cond) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function broadcasts the condition variable, |
|||
* waking all current waiters. |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function signals a condition variable, waking |
|||
* all waiting threads. |
|||
* |
|||
* NOTES: |
|||
* |
|||
* 1) Use when more than one waiter may respond to |
|||
* predicate change or if any waiting thread may |
|||
* not be able to respond |
|||
* |
|||
* RESULTS |
|||
* 0 successfully signalled condition to all |
|||
* waiting threads, |
|||
* EINVAL 'cond' is invalid |
|||
* ENOSPC a required resource has been exhausted, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
/*
|
|||
* The TRUE unblockAll arg means unblock ALL waiters. |
|||
*/ |
|||
return (ptw32_cond_unblock (cond, PTW32_TRUE)); |
|||
|
|||
} /* pthread_cond_broadcast */ |
@ -1,567 +0,0 @@ |
|||
/*
|
|||
* pthread_cond_wait.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
* |
|||
* ------------------------------------------------------------- |
|||
* Algorithm: |
|||
* The algorithm used in this implementation is that developed by |
|||
* Alexander Terekhov in colaboration with Louis Thomas. The bulk |
|||
* of the discussion is recorded in the file README.CV, which contains |
|||
* several generations of both colaborators original algorithms. The final |
|||
* algorithm used here is the one referred to as |
|||
* |
|||
* Algorithm 8a / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL |
|||
* |
|||
* presented below in pseudo-code as it appeared: |
|||
* |
|||
* |
|||
* given: |
|||
* semBlockLock - bin.semaphore |
|||
* semBlockQueue - semaphore |
|||
* mtxExternal - mutex or CS |
|||
* mtxUnblockLock - mutex or CS |
|||
* nWaitersGone - int |
|||
* nWaitersBlocked - int |
|||
* nWaitersToUnblock - int |
|||
* |
|||
* wait( timeout ) { |
|||
* |
|||
* [auto: register int result ] // error checking omitted
|
|||
* [auto: register int nSignalsWasLeft ] |
|||
* [auto: register int nWaitersWasGone ] |
|||
* |
|||
* sem_wait( semBlockLock ); |
|||
* nWaitersBlocked++; |
|||
* sem_post( semBlockLock ); |
|||
* |
|||
* unlock( mtxExternal ); |
|||
* bTimedOut = sem_wait( semBlockQueue,timeout ); |
|||
* |
|||
* lock( mtxUnblockLock ); |
|||
* if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { |
|||
* if ( bTimeout ) { // timeout (or canceled)
|
|||
* if ( 0 != nWaitersBlocked ) { |
|||
* nWaitersBlocked--; |
|||
* } |
|||
* else { |
|||
* nWaitersGone++; // count spurious wakeups.
|
|||
* } |
|||
* } |
|||
* if ( 0 == --nWaitersToUnblock ) { |
|||
* if ( 0 != nWaitersBlocked ) { |
|||
* sem_post( semBlockLock ); // open the gate.
|
|||
* nSignalsWasLeft = 0; // do not open the gate
|
|||
* // below again.
|
|||
* } |
|||
* else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { |
|||
* nWaitersGone = 0; |
|||
* } |
|||
* } |
|||
* } |
|||
* else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or
|
|||
* // spurious semaphore :-)
|
|||
* sem_wait( semBlockLock ); |
|||
* nWaitersBlocked -= nWaitersGone; // something is going on here
|
|||
* // - test of timeouts? :-)
|
|||
* sem_post( semBlockLock ); |
|||
* nWaitersGone = 0; |
|||
* } |
|||
* unlock( mtxUnblockLock ); |
|||
* |
|||
* if ( 1 == nSignalsWasLeft ) { |
|||
* if ( 0 != nWaitersWasGone ) { |
|||
* // sem_adjust( semBlockQueue,-nWaitersWasGone );
|
|||
* while ( nWaitersWasGone-- ) { |
|||
* sem_wait( semBlockQueue ); // better now than spurious later
|
|||
* } |
|||
* } sem_post( semBlockLock ); // open the gate
|
|||
* } |
|||
* |
|||
* lock( mtxExternal ); |
|||
* |
|||
* return ( bTimedOut ) ? ETIMEOUT : 0; |
|||
* } |
|||
* |
|||
* signal(bAll) { |
|||
* |
|||
* [auto: register int result ] |
|||
* [auto: register int nSignalsToIssue] |
|||
* |
|||
* lock( mtxUnblockLock ); |
|||
* |
|||
* if ( 0 != nWaitersToUnblock ) { // the gate is closed!!!
|
|||
* if ( 0 == nWaitersBlocked ) { // NO-OP
|
|||
* return unlock( mtxUnblockLock ); |
|||
* } |
|||
* if (bAll) { |
|||
* nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; |
|||
* nWaitersBlocked = 0; |
|||
* } |
|||
* else { |
|||
* nSignalsToIssue = 1; |
|||
* nWaitersToUnblock++; |
|||
* nWaitersBlocked--; |
|||
* } |
|||
* } |
|||
* else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION!
|
|||
* sem_wait( semBlockLock ); // close the gate
|
|||
* if ( 0 != nWaitersGone ) { |
|||
* nWaitersBlocked -= nWaitersGone; |
|||
* nWaitersGone = 0; |
|||
* } |
|||
* if (bAll) { |
|||
* nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; |
|||
* nWaitersBlocked = 0; |
|||
* } |
|||
* else { |
|||
* nSignalsToIssue = nWaitersToUnblock = 1; |
|||
* nWaitersBlocked--; |
|||
* } |
|||
* } |
|||
* else { // NO-OP
|
|||
* return unlock( mtxUnblockLock ); |
|||
* } |
|||
* |
|||
* unlock( mtxUnblockLock ); |
|||
* sem_post( semBlockQueue,nSignalsToIssue ); |
|||
* return result; |
|||
* } |
|||
* ------------------------------------------------------------- |
|||
* |
|||
* Algorithm 9 / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL |
|||
* |
|||
* presented below in pseudo-code; basically 8a... |
|||
* ...BUT W/O "spurious wakes" prevention: |
|||
* |
|||
* |
|||
* given: |
|||
* semBlockLock - bin.semaphore |
|||
* semBlockQueue - semaphore |
|||
* mtxExternal - mutex or CS |
|||
* mtxUnblockLock - mutex or CS |
|||
* nWaitersGone - int |
|||
* nWaitersBlocked - int |
|||
* nWaitersToUnblock - int |
|||
* |
|||
* wait( timeout ) { |
|||
* |
|||
* [auto: register int result ] // error checking omitted
|
|||
* [auto: register int nSignalsWasLeft ] |
|||
* |
|||
* sem_wait( semBlockLock ); |
|||
* ++nWaitersBlocked; |
|||
* sem_post( semBlockLock ); |
|||
* |
|||
* unlock( mtxExternal ); |
|||
* bTimedOut = sem_wait( semBlockQueue,timeout ); |
|||
* |
|||
* lock( mtxUnblockLock ); |
|||
* if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { |
|||
* --nWaitersToUnblock; |
|||
* } |
|||
* else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or
|
|||
* // spurious semaphore :-)
|
|||
* sem_wait( semBlockLock ); |
|||
* nWaitersBlocked -= nWaitersGone; // something is going on here
|
|||
* // - test of timeouts? :-)
|
|||
* sem_post( semBlockLock ); |
|||
* nWaitersGone = 0; |
|||
* } |
|||
* unlock( mtxUnblockLock ); |
|||
* |
|||
* if ( 1 == nSignalsWasLeft ) { |
|||
* sem_post( semBlockLock ); // open the gate
|
|||
* } |
|||
* |
|||
* lock( mtxExternal ); |
|||
* |
|||
* return ( bTimedOut ) ? ETIMEOUT : 0; |
|||
* } |
|||
* |
|||
* signal(bAll) { |
|||
* |
|||
* [auto: register int result ] |
|||
* [auto: register int nSignalsToIssue] |
|||
* |
|||
* lock( mtxUnblockLock ); |
|||
* |
|||
* if ( 0 != nWaitersToUnblock ) { // the gate is closed!!!
|
|||
* if ( 0 == nWaitersBlocked ) { // NO-OP
|
|||
* return unlock( mtxUnblockLock ); |
|||
* } |
|||
* if (bAll) { |
|||
* nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; |
|||
* nWaitersBlocked = 0; |
|||
* } |
|||
* else { |
|||
* nSignalsToIssue = 1; |
|||
* ++nWaitersToUnblock; |
|||
* --nWaitersBlocked; |
|||
* } |
|||
* } |
|||
* else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION!
|
|||
* sem_wait( semBlockLock ); // close the gate
|
|||
* if ( 0 != nWaitersGone ) { |
|||
* nWaitersBlocked -= nWaitersGone; |
|||
* nWaitersGone = 0; |
|||
* } |
|||
* if (bAll) { |
|||
* nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; |
|||
* nWaitersBlocked = 0; |
|||
* } |
|||
* else { |
|||
* nSignalsToIssue = nWaitersToUnblock = 1; |
|||
* --nWaitersBlocked; |
|||
* } |
|||
* } |
|||
* else { // NO-OP
|
|||
* return unlock( mtxUnblockLock ); |
|||
* } |
|||
* |
|||
* unlock( mtxUnblockLock ); |
|||
* sem_post( semBlockQueue,nSignalsToIssue ); |
|||
* return result; |
|||
* } |
|||
* ------------------------------------------------------------- |
|||
* |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* Arguments for cond_wait_cleanup, since we can only pass a |
|||
* single void * to it. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
pthread_mutex_t *mutexPtr; |
|||
pthread_cond_t cv; |
|||
int *resultPtr; |
|||
} ptw32_cond_wait_cleanup_args_t; |
|||
|
|||
static void PTW32_CDECL |
|||
ptw32_cond_wait_cleanup (void *args) |
|||
{ |
|||
ptw32_cond_wait_cleanup_args_t *cleanup_args = |
|||
(ptw32_cond_wait_cleanup_args_t *) args; |
|||
pthread_cond_t cv = cleanup_args->cv; |
|||
int *resultPtr = cleanup_args->resultPtr; |
|||
int nSignalsWasLeft; |
|||
int result; |
|||
|
|||
/*
|
|||
* Whether we got here as a result of signal/broadcast or because of |
|||
* timeout on wait or thread cancellation we indicate that we are no |
|||
* longer waiting. The waiter is responsible for adjusting waiters |
|||
* (to)unblock(ed) counts (protected by unblock lock). |
|||
*/ |
|||
if ((result = pthread_mutex_lock (&(cv->mtxUnblockLock))) != 0) |
|||
{ |
|||
*resultPtr = result; |
|||
return; |
|||
} |
|||
|
|||
if (0 != (nSignalsWasLeft = cv->nWaitersToUnblock)) |
|||
{ |
|||
--(cv->nWaitersToUnblock); |
|||
} |
|||
else if (INT_MAX / 2 == ++(cv->nWaitersGone)) |
|||
{ |
|||
/* Use the non-cancellable version of sem_wait() */ |
|||
if (ptw32_semwait (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
*resultPtr = errno; |
|||
/*
|
|||
* This is a fatal error for this CV, |
|||
* so we deliberately don't unlock |
|||
* cv->mtxUnblockLock before returning. |
|||
*/ |
|||
return; |
|||
} |
|||
cv->nWaitersBlocked -= cv->nWaitersGone; |
|||
if (sem_post (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
*resultPtr = errno; |
|||
/*
|
|||
* This is a fatal error for this CV, |
|||
* so we deliberately don't unlock |
|||
* cv->mtxUnblockLock before returning. |
|||
*/ |
|||
return; |
|||
} |
|||
cv->nWaitersGone = 0; |
|||
} |
|||
|
|||
if ((result = pthread_mutex_unlock (&(cv->mtxUnblockLock))) != 0) |
|||
{ |
|||
*resultPtr = result; |
|||
return; |
|||
} |
|||
|
|||
if (1 == nSignalsWasLeft) |
|||
{ |
|||
if (sem_post (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
*resultPtr = errno; |
|||
return; |
|||
} |
|||
} |
|||
|
|||
/*
|
|||
* XSH: Upon successful return, the mutex has been locked and is owned |
|||
* by the calling thread. |
|||
*/ |
|||
if ((result = pthread_mutex_lock (cleanup_args->mutexPtr)) != 0) |
|||
{ |
|||
*resultPtr = result; |
|||
} |
|||
} /* ptw32_cond_wait_cleanup */ |
|||
|
|||
static INLINE int |
|||
ptw32_cond_timedwait (pthread_cond_t * cond, |
|||
pthread_mutex_t * mutex, const struct timespec *abstime) |
|||
{ |
|||
int result = 0; |
|||
pthread_cond_t cv; |
|||
ptw32_cond_wait_cleanup_args_t cleanup_args; |
|||
|
|||
if (cond == NULL || *cond == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/*
|
|||
* We do a quick check to see if we need to do more work |
|||
* to initialise a static condition variable. We check |
|||
* again inside the guarded section of ptw32_cond_check_need_init() |
|||
* to avoid race conditions. |
|||
*/ |
|||
if (*cond == PTHREAD_COND_INITIALIZER) |
|||
{ |
|||
result = ptw32_cond_check_need_init (cond); |
|||
} |
|||
|
|||
if (result != 0 && result != EBUSY) |
|||
{ |
|||
return result; |
|||
} |
|||
|
|||
cv = *cond; |
|||
|
|||
/* Thread can be cancelled in sem_wait() but this is OK */ |
|||
if (sem_wait (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
return errno; |
|||
} |
|||
|
|||
++(cv->nWaitersBlocked); |
|||
|
|||
if (sem_post (&(cv->semBlockLock)) != 0) |
|||
{ |
|||
return errno; |
|||
} |
|||
|
|||
/*
|
|||
* Setup this waiter cleanup handler |
|||
*/ |
|||
cleanup_args.mutexPtr = mutex; |
|||
cleanup_args.cv = cv; |
|||
cleanup_args.resultPtr = &result; |
|||
|
|||
#if defined(_MSC_VER) && _MSC_VER < 1400 |
|||
#pragma inline_depth(0) |
|||
#endif |
|||
pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) &cleanup_args); |
|||
|
|||
/*
|
|||
* Now we can release 'mutex' and... |
|||
*/ |
|||
if ((result = pthread_mutex_unlock (mutex)) == 0) |
|||
{ |
|||
|
|||
/*
|
|||
* ...wait to be awakened by |
|||
* pthread_cond_signal, or |
|||
* pthread_cond_broadcast, or |
|||
* timeout, or |
|||
* thread cancellation |
|||
* |
|||
* Note: |
|||
* |
|||
* sem_timedwait is a cancellation point, |
|||
* hence providing the mechanism for making |
|||
* pthread_cond_wait a cancellation point. |
|||
* We use the cleanup mechanism to ensure we |
|||
* re-lock the mutex and adjust (to)unblock(ed) waiters |
|||
* counts if we are cancelled, timed out or signalled. |
|||
*/ |
|||
if (sem_timedwait (&(cv->semBlockQueue), abstime) != 0) |
|||
{ |
|||
result = errno; |
|||
} |
|||
} |
|||
|
|||
/*
|
|||
* Always cleanup |
|||
*/ |
|||
pthread_cleanup_pop (1); |
|||
#if defined(_MSC_VER) && _MSC_VER < 1400 |
|||
#pragma inline_depth() |
|||
#endif |
|||
|
|||
/*
|
|||
* "result" can be modified by the cleanup handler. |
|||
*/ |
|||
return result; |
|||
|
|||
} /* ptw32_cond_timedwait */ |
|||
|
|||
|
|||
int |
|||
pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function waits on a condition variable until |
|||
* awakened by a signal or broadcast. |
|||
* |
|||
* Caller MUST be holding the mutex lock; the |
|||
* lock is released and the caller is blocked waiting |
|||
* on 'cond'. When 'cond' is signaled, the mutex |
|||
* is re-acquired before returning to the caller. |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* mutex |
|||
* pointer to an instance of pthread_mutex_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function waits on a condition variable until |
|||
* awakened by a signal or broadcast. |
|||
* |
|||
* NOTES: |
|||
* |
|||
* 1) The function must be called with 'mutex' LOCKED |
|||
* by the calling thread, or undefined behaviour |
|||
* will result. |
|||
* |
|||
* 2) This routine atomically releases 'mutex' and causes |
|||
* the calling thread to block on the condition variable. |
|||
* The blocked thread may be awakened by |
|||
* pthread_cond_signal or |
|||
* pthread_cond_broadcast. |
|||
* |
|||
* Upon successful completion, the 'mutex' has been locked and |
|||
* is owned by the calling thread. |
|||
* |
|||
* |
|||
* RESULTS |
|||
* 0 caught condition; mutex released, |
|||
* EINVAL 'cond' or 'mutex' is invalid, |
|||
* EINVAL different mutexes for concurrent waits, |
|||
* EINVAL mutex is not held by the calling thread, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
/*
|
|||
* The NULL abstime arg means INFINITE waiting. |
|||
*/ |
|||
return (ptw32_cond_timedwait (cond, mutex, NULL)); |
|||
|
|||
} /* pthread_cond_wait */ |
|||
|
|||
|
|||
int |
|||
pthread_cond_timedwait (pthread_cond_t * cond, |
|||
pthread_mutex_t * mutex, |
|||
const struct timespec *abstime) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function waits on a condition variable either until |
|||
* awakened by a signal or broadcast; or until the time |
|||
* specified by abstime passes. |
|||
* |
|||
* PARAMETERS |
|||
* cond |
|||
* pointer to an instance of pthread_cond_t |
|||
* |
|||
* mutex |
|||
* pointer to an instance of pthread_mutex_t |
|||
* |
|||
* abstime |
|||
* pointer to an instance of (const struct timespec) |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function waits on a condition variable either until |
|||
* awakened by a signal or broadcast; or until the time |
|||
* specified by abstime passes. |
|||
* |
|||
* NOTES: |
|||
* 1) The function must be called with 'mutex' LOCKED |
|||
* by the calling thread, or undefined behaviour |
|||
* will result. |
|||
* |
|||
* 2) This routine atomically releases 'mutex' and causes |
|||
* the calling thread to block on the condition variable. |
|||
* The blocked thread may be awakened by |
|||
* pthread_cond_signal or |
|||
* pthread_cond_broadcast. |
|||
* |
|||
* |
|||
* RESULTS |
|||
* 0 caught condition; mutex released, |
|||
* EINVAL 'cond', 'mutex', or abstime is invalid, |
|||
* EINVAL different mutexes for concurrent waits, |
|||
* EINVAL mutex is not held by the calling thread, |
|||
* ETIMEDOUT abstime ellapsed before cond was signaled. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
if (abstime == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
return (ptw32_cond_timedwait (cond, mutex, abstime)); |
|||
|
|||
} /* pthread_cond_timedwait */ |
@ -1,86 +0,0 @@ |
|||
/*
|
|||
* condvar_attr_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_condattr_destroy (pthread_condattr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Destroys a condition variable attributes object. |
|||
* The object can no longer be used. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_condattr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Destroys a condition variable attributes object. |
|||
* The object can no longer be used. |
|||
* |
|||
* NOTES: |
|||
* 1) Does not affect condition variables created |
|||
* using 'attr' |
|||
* |
|||
* RESULTS |
|||
* 0 successfully released attr, |
|||
* EINVAL 'attr' is invalid. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result = 0; |
|||
|
|||
if (attr == NULL || *attr == NULL) |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
else |
|||
{ |
|||
(void) free (*attr); |
|||
|
|||
*attr = NULL; |
|||
result = 0; |
|||
} |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_condattr_destroy */ |
@ -1,97 +0,0 @@ |
|||
/*
|
|||
* pthread_condattr_getpshared.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_condattr_getpshared (const pthread_condattr_t * attr, int *pshared) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Determine whether condition variables created with 'attr' |
|||
* can be shared between processes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_condattr_t |
|||
* |
|||
* pshared |
|||
* will be set to one of: |
|||
* |
|||
* PTHREAD_PROCESS_SHARED |
|||
* May be shared if in shared memory |
|||
* |
|||
* PTHREAD_PROCESS_PRIVATE |
|||
* Cannot be shared. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Condition Variables created with 'attr' can be shared |
|||
* between processes if pthread_cond_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* NOTES: |
|||
* 1) pshared condition variables MUST be allocated in |
|||
* shared memory. |
|||
* |
|||
* 2) The following macro is defined if shared mutexes |
|||
* are supported: |
|||
* _POSIX_THREAD_PROCESS_SHARED |
|||
* |
|||
* RESULTS |
|||
* 0 successfully retrieved attribute, |
|||
* EINVAL 'attr' or 'pshared' is invalid, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
|
|||
if ((attr != NULL && *attr != NULL) && (pshared != NULL)) |
|||
{ |
|||
*pshared = (*attr)->pshared; |
|||
result = 0; |
|||
} |
|||
else |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_condattr_getpshared */ |
@ -1,87 +0,0 @@ |
|||
/*
|
|||
* pthread_condattr_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_condattr_init (pthread_condattr_t * attr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Initializes a condition variable attributes object |
|||
* with default attributes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_condattr_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* Initializes a condition variable attributes object |
|||
* with default attributes. |
|||
* |
|||
* NOTES: |
|||
* 1) Use to define condition variable types |
|||
* 2) It is up to the application to ensure |
|||
* that it doesn't re-init an attribute |
|||
* without destroying it first. Otherwise |
|||
* a memory leak is created. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully initialized attr, |
|||
* ENOMEM insufficient memory for attr. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
pthread_condattr_t attr_result; |
|||
int result = 0; |
|||
|
|||
attr_result = (pthread_condattr_t) calloc (1, sizeof (*attr_result)); |
|||
|
|||
if (attr_result == NULL) |
|||
{ |
|||
result = ENOMEM; |
|||
} |
|||
|
|||
*attr = attr_result; |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_condattr_init */ |
@ -1,117 +0,0 @@ |
|||
/*
|
|||
* pthread_condattr_setpshared.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements condition variables and their primitives. |
|||
* |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* Mutexes created with 'attr' can be shared between |
|||
* processes if pthread_mutex_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* |
|||
* PARAMETERS |
|||
* attr |
|||
* pointer to an instance of pthread_mutexattr_t |
|||
* |
|||
* pshared |
|||
* must be one of: |
|||
* |
|||
* PTHREAD_PROCESS_SHARED |
|||
* May be shared if in shared memory |
|||
* |
|||
* PTHREAD_PROCESS_PRIVATE |
|||
* Cannot be shared. |
|||
* |
|||
* DESCRIPTION |
|||
* Mutexes creatd with 'attr' can be shared between |
|||
* processes if pthread_mutex_t variable is allocated |
|||
* in memory shared by these processes. |
|||
* |
|||
* NOTES: |
|||
* 1) pshared mutexes MUST be allocated in shared |
|||
* memory. |
|||
* |
|||
* 2) The following macro is defined if shared mutexes |
|||
* are supported: |
|||
* _POSIX_THREAD_PROCESS_SHARED |
|||
* |
|||
* RESULTS |
|||
* 0 successfully set attribute, |
|||
* EINVAL 'attr' or pshared is invalid, |
|||
* ENOSYS PTHREAD_PROCESS_SHARED not supported, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
|
|||
if ((attr != NULL && *attr != NULL) |
|||
&& ((pshared == PTHREAD_PROCESS_SHARED) |
|||
|| (pshared == PTHREAD_PROCESS_PRIVATE))) |
|||
{ |
|||
if (pshared == PTHREAD_PROCESS_SHARED) |
|||
{ |
|||
|
|||
#if !defined( _POSIX_THREAD_PROCESS_SHARED ) |
|||
result = ENOSYS; |
|||
pshared = PTHREAD_PROCESS_PRIVATE; |
|||
#else |
|||
result = 0; |
|||
|
|||
#endif /* _POSIX_THREAD_PROCESS_SHARED */ |
|||
|
|||
} |
|||
else |
|||
{ |
|||
result = 0; |
|||
} |
|||
|
|||
(*attr)->pshared = pshared; |
|||
} |
|||
else |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_condattr_setpshared */ |
@ -1,172 +0,0 @@ |
|||
/*
|
|||
* pthreads_delay_np.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements non-portable thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* pthread_delay_np |
|||
* |
|||
* DESCRIPTION |
|||
* |
|||
* 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. |
|||
* |
|||
* 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. |
|||
* |
|||
* Example |
|||
* |
|||
* The following code segment would wait for 5 and 1/2 seconds |
|||
* |
|||
* struct timespec tsWait; |
|||
* int intRC; |
|||
* |
|||
* tsWait.tv_sec = 5; |
|||
* tsWait.tv_nsec = 500000000L; |
|||
* intRC = pthread_delay_np(&tsWait); |
|||
*/ |
|||
int |
|||
pthread_delay_np (struct timespec *interval) |
|||
{ |
|||
DWORD wait_time; |
|||
DWORD secs_in_millisecs; |
|||
DWORD millisecs; |
|||
DWORD status; |
|||
pthread_t self; |
|||
ptw32_thread_t * sp; |
|||
|
|||
if (interval == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (interval->tv_sec == 0L && interval->tv_nsec == 0L) |
|||
{ |
|||
pthread_testcancel (); |
|||
Sleep (0); |
|||
pthread_testcancel (); |
|||
return (0); |
|||
} |
|||
|
|||
/* convert secs to millisecs */ |
|||
secs_in_millisecs = (DWORD)interval->tv_sec * 1000L; |
|||
|
|||
/* convert nanosecs to millisecs (rounding up) */ |
|||
millisecs = (interval->tv_nsec + 999999L) / 1000000L; |
|||
|
|||
#if defined(__WATCOMC__) |
|||
#pragma disable_message (124) |
|||
#endif |
|||
|
|||
/*
|
|||
* Most compilers will issue a warning 'comparison always 0' |
|||
* because the variable type is unsigned, but we need to keep this |
|||
* for some reason I can't recall now. |
|||
*/ |
|||
if (0 > (wait_time = secs_in_millisecs + millisecs)) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
#if defined(__WATCOMC__) |
|||
#pragma enable_message (124) |
|||
#endif |
|||
|
|||
if (NULL == (self = pthread_self ()).p) |
|||
{ |
|||
return ENOMEM; |
|||
} |
|||
|
|||
sp = (ptw32_thread_t *) self.p; |
|||
|
|||
if (sp->cancelState == PTHREAD_CANCEL_ENABLE) |
|||
{ |
|||
/*
|
|||
* Async cancelation won't catch us until wait_time is up. |
|||
* Deferred cancelation will cancel us immediately. |
|||
*/ |
|||
if (WAIT_OBJECT_0 == |
|||
(status = WaitForSingleObject (sp->cancelEvent, wait_time))) |
|||
{ |
|||
ptw32_mcs_local_node_t stateLock; |
|||
/*
|
|||
* Canceling! |
|||
*/ |
|||
ptw32_mcs_lock_acquire (&sp->stateLock, &stateLock); |
|||
if (sp->state < PThreadStateCanceling) |
|||
{ |
|||
sp->state = PThreadStateCanceling; |
|||
sp->cancelState = PTHREAD_CANCEL_DISABLE; |
|||
ptw32_mcs_lock_release (&stateLock); |
|||
|
|||
ptw32_throw (PTW32_EPS_CANCEL); |
|||
} |
|||
|
|||
ptw32_mcs_lock_release (&stateLock); |
|||
return ESRCH; |
|||
} |
|||
else if (status != WAIT_TIMEOUT) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
Sleep (wait_time); |
|||
} |
|||
|
|||
return (0); |
|||
} |
@ -1,136 +0,0 @@ |
|||
/*
|
|||
* pthread_detach.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements functions related to thread |
|||
* synchronisation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* Not needed yet, but defining it should indicate clashes with build target |
|||
* environment that should be fixed. |
|||
*/ |
|||
#if !defined(WINCE) |
|||
# include <signal.h> |
|||
#endif |
|||
|
|||
|
|||
int |
|||
pthread_detach (pthread_t thread) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function detaches the given thread. |
|||
* |
|||
* PARAMETERS |
|||
* thread |
|||
* an instance of a pthread_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function detaches the given thread. You may use it to |
|||
* detach the main thread or to detach a joinable thread. |
|||
* NOTE: detached threads cannot be joined; |
|||
* storage is freed immediately on termination. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully detached the thread, |
|||
* EINVAL thread is not a joinable thread, |
|||
* ENOSPC a required resource has been exhausted, |
|||
* ESRCH no thread could be found for 'thread', |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
BOOL destroyIt = PTW32_FALSE; |
|||
ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock, &node); |
|||
|
|||
if (NULL == tp |
|||
|| thread.x != tp->ptHandle.x) |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
else if (PTHREAD_CREATE_DETACHED == tp->detachState) |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
else |
|||
{ |
|||
ptw32_mcs_local_node_t stateLock; |
|||
/*
|
|||
* Joinable ptw32_thread_t structs are not scavenged until |
|||
* a join or detach is done. The thread may have exited already, |
|||
* but all of the state and locks etc are still there. |
|||
*/ |
|||
result = 0; |
|||
|
|||
ptw32_mcs_lock_acquire (&tp->stateLock, &stateLock); |
|||
if (tp->state != PThreadStateLast) |
|||
{ |
|||
tp->detachState = PTHREAD_CREATE_DETACHED; |
|||
} |
|||
else if (tp->detachState != PTHREAD_CREATE_DETACHED) |
|||
{ |
|||
/*
|
|||
* Thread is joinable and has exited or is exiting. |
|||
*/ |
|||
destroyIt = PTW32_TRUE; |
|||
} |
|||
ptw32_mcs_lock_release (&stateLock); |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
|
|||
if (result == 0) |
|||
{ |
|||
/* Thread is joinable */ |
|||
|
|||
if (destroyIt) |
|||
{ |
|||
/* The thread has exited or is exiting but has not been joined or
|
|||
* detached. Need to wait in case it's still exiting. |
|||
*/ |
|||
(void) WaitForSingleObject(tp->threadH, INFINITE); |
|||
ptw32_threadDestroy (thread); |
|||
} |
|||
} |
|||
|
|||
return (result); |
|||
|
|||
} /* pthread_detach */ |
@ -1,76 +0,0 @@ |
|||
/*
|
|||
* pthread_equal.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements miscellaneous thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_equal (pthread_t t1, pthread_t t2) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function returns nonzero if t1 and t2 are equal, else |
|||
* returns zero |
|||
* |
|||
* PARAMETERS |
|||
* t1, |
|||
* t2 |
|||
* thread IDs |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function returns nonzero if t1 and t2 are equal, else |
|||
* returns zero. |
|||
* |
|||
* RESULTS |
|||
* non-zero if t1 and t2 refer to the same thread, |
|||
* 0 t1 and t2 do not refer to the same thread |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
|
|||
/*
|
|||
* We also accept NULL == NULL - treating NULL as a thread |
|||
* for this special case, because there is no error that we can return. |
|||
*/ |
|||
result = ( t1.p == t2.p && t1.x == t2.x ); |
|||
|
|||
return (result); |
|||
|
|||
} /* pthread_equal */ |
@ -1,106 +0,0 @@ |
|||
/*
|
|||
* pthread_exit.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements routines associated with exiting from |
|||
* a thread. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#if !defined(_UWIN) |
|||
/*# include <process.h> */ |
|||
#endif |
|||
|
|||
void |
|||
pthread_exit (void *value_ptr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function terminates the calling thread, returning |
|||
* the value 'value_ptr' to any joining thread. |
|||
* |
|||
* PARAMETERS |
|||
* value_ptr |
|||
* a generic data value (i.e. not the address of a value) |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function terminates the calling thread, returning |
|||
* the value 'value_ptr' to any joining thread. |
|||
* NOTE: thread should be joinable. |
|||
* |
|||
* RESULTS |
|||
* N/A |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
ptw32_thread_t * sp; |
|||
|
|||
/*
|
|||
* Don't use pthread_self() to avoid creating an implicit POSIX thread handle |
|||
* unnecessarily. |
|||
*/ |
|||
sp = (ptw32_thread_t *) pthread_getspecific (ptw32_selfThreadKey); |
|||
|
|||
#if defined(_UWIN) |
|||
if (--pthread_count <= 0) |
|||
exit ((int) value_ptr); |
|||
#endif |
|||
|
|||
if (NULL == sp) |
|||
{ |
|||
/*
|
|||
* A POSIX thread handle was never created. I.e. this is a |
|||
* Win32 thread that has never called a pthreads-win32 routine that |
|||
* required a POSIX handle. |
|||
* |
|||
* Implicit POSIX handles are cleaned up in ptw32_throw() now. |
|||
*/ |
|||
|
|||
#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) || defined (__DMC__) |
|||
_endthreadex ((unsigned) (size_t) value_ptr); |
|||
#else |
|||
_endthread (); |
|||
#endif |
|||
|
|||
/* Never reached */ |
|||
} |
|||
|
|||
sp->exitStatus = value_ptr; |
|||
|
|||
ptw32_throw (PTW32_EPS_EXIT); |
|||
|
|||
/* Never reached. */ |
|||
|
|||
} |
@ -1,45 +0,0 @@ |
|||
/*
|
|||
* pthread_getconcurrency.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements miscellaneous thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_getconcurrency (void) |
|||
{ |
|||
return ptw32_concurrency; |
|||
} |
@ -1,75 +0,0 @@ |
|||
/*
|
|||
* sched_getschedparam.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions that deal with thread scheduling. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
#include "sched.h" |
|||
|
|||
int |
|||
pthread_getschedparam (pthread_t thread, int *policy, |
|||
struct sched_param *param) |
|||
{ |
|||
int result; |
|||
|
|||
/* Validate the thread id. */ |
|||
result = pthread_kill (thread, 0); |
|||
if (0 != result) |
|||
{ |
|||
return result; |
|||
} |
|||
|
|||
/*
|
|||
* Validate the policy and param args. |
|||
* Check that a policy constant wasn't passed rather than &policy. |
|||
*/ |
|||
if (policy <= (int *) SCHED_MAX || param == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/* Fill out the policy. */ |
|||
*policy = SCHED_OTHER; |
|||
|
|||
/*
|
|||
* This function must return the priority value set by |
|||
* the most recent pthread_setschedparam() or pthread_create() |
|||
* for the target thread. It must not return the actual thread |
|||
* priority as altered by any system priority adjustments etc. |
|||
*/ |
|||
param->sched_priority = ((ptw32_thread_t *)thread.p)->sched_priority; |
|||
|
|||
return 0; |
|||
} |
@ -1,87 +0,0 @@ |
|||
/*
|
|||
* pthread_getspecific.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions which implement thread-specific data (TSD). |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
void * |
|||
pthread_getspecific (pthread_key_t key) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function returns the current value of key in the |
|||
* calling thread. If no value has been set for 'key' in |
|||
* the thread, NULL is returned. |
|||
* |
|||
* PARAMETERS |
|||
* key |
|||
* an instance of pthread_key_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function returns the current value of key in the |
|||
* calling thread. If no value has been set for 'key' in |
|||
* the thread, NULL is returned. |
|||
* |
|||
* RESULTS |
|||
* key value or NULL on failure |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
void * ptr; |
|||
|
|||
if (key == NULL) |
|||
{ |
|||
ptr = NULL; |
|||
} |
|||
else |
|||
{ |
|||
int lasterror = GetLastError (); |
|||
#if defined(RETAIN_WSALASTERROR) |
|||
int lastWSAerror = WSAGetLastError (); |
|||
#endif |
|||
ptr = TlsGetValue (key->key); |
|||
|
|||
SetLastError (lasterror); |
|||
#if defined(RETAIN_WSALASTERROR) |
|||
WSASetLastError (lastWSAerror); |
|||
#endif |
|||
} |
|||
|
|||
return ptr; |
|||
} |
@ -1,47 +0,0 @@ |
|||
/*
|
|||
* pthread_getunique_np.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements non-portable thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* |
|||
*/ |
|||
unsigned __int64 |
|||
pthread_getunique_np (pthread_t thread) |
|||
{ |
|||
return ((ptw32_thread_t*)thread.p)->seqNumber; |
|||
} |
@ -1,65 +0,0 @@ |
|||
/*
|
|||
* pthread_getw32threadhandle_np.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements non-portable thread functions. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* pthread_getw32threadhandle_np() |
|||
* |
|||
* 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. |
|||
*/ |
|||
HANDLE |
|||
pthread_getw32threadhandle_np (pthread_t thread) |
|||
{ |
|||
return ((ptw32_thread_t *)thread.p)->threadH; |
|||
} |
|||
|
|||
/*
|
|||
* pthread_getw32threadid_np() |
|||
* |
|||
* Returns the win32 thread id that the POSIX |
|||
* thread "thread" is running as. |
|||
*/ |
|||
DWORD |
|||
pthread_getw32threadid_np (pthread_t thread) |
|||
{ |
|||
return ((ptw32_thread_t *)thread.p)->thread; |
|||
} |
@ -1,157 +0,0 @@ |
|||
/*
|
|||
* pthread_join.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements functions related to thread |
|||
* synchronisation. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* Not needed yet, but defining it should indicate clashes with build target |
|||
* environment that should be fixed. |
|||
*/ |
|||
#if !defined(WINCE) |
|||
# include <signal.h> |
|||
#endif |
|||
|
|||
|
|||
int |
|||
pthread_join (pthread_t thread, void **value_ptr) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function waits for 'thread' to terminate and |
|||
* returns the thread's exit value if 'value_ptr' is not |
|||
* NULL. This also detaches the thread on successful |
|||
* completion. |
|||
* |
|||
* PARAMETERS |
|||
* thread |
|||
* an instance of pthread_t |
|||
* |
|||
* value_ptr |
|||
* pointer to an instance of pointer to void |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function waits for 'thread' to terminate and |
|||
* returns the thread's exit value if 'value_ptr' is not |
|||
* NULL. This also detaches the thread on successful |
|||
* completion. |
|||
* NOTE: detached threads cannot be joined or canceled |
|||
* |
|||
* RESULTS |
|||
* 0 'thread' has completed |
|||
* EINVAL thread is not a joinable thread, |
|||
* ESRCH no thread could be found with ID 'thread', |
|||
* ENOENT thread couldn't find it's own valid handle, |
|||
* EDEADLK attempt to join thread with self |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result; |
|||
pthread_t self; |
|||
ptw32_thread_t * tp = (ptw32_thread_t *) thread.p; |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock, &node); |
|||
|
|||
if (NULL == tp |
|||
|| thread.x != tp->ptHandle.x) |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
else if (PTHREAD_CREATE_DETACHED == tp->detachState) |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
else |
|||
{ |
|||
result = 0; |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
|
|||
if (result == 0) |
|||
{ |
|||
/*
|
|||
* The target thread is joinable and can't be reused before we join it. |
|||
*/ |
|||
self = pthread_self(); |
|||
|
|||
if (NULL == self.p) |
|||
{ |
|||
result = ENOENT; |
|||
} |
|||
else if (pthread_equal (self, thread)) |
|||
{ |
|||
result = EDEADLK; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Pthread_join is a cancelation point. |
|||
* If we are canceled then our target thread must not be |
|||
* detached (destroyed). This is guarranteed because |
|||
* pthreadCancelableWait will not return if we |
|||
* are canceled. |
|||
*/ |
|||
result = pthreadCancelableWait (tp->threadH); |
|||
|
|||
if (0 == result) |
|||
{ |
|||
if (value_ptr != NULL) |
|||
{ |
|||
*value_ptr = tp->exitStatus; |
|||
} |
|||
|
|||
/*
|
|||
* The result of making multiple simultaneous calls to |
|||
* pthread_join() or pthread_detach() specifying the same |
|||
* target is undefined. |
|||
*/ |
|||
result = pthread_detach (thread); |
|||
} |
|||
else |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return (result); |
|||
|
|||
} /* pthread_join */ |
@ -1,108 +0,0 @@ |
|||
/*
|
|||
* pthread_key_create.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions which implement thread-specific data (TSD). |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
/* TLS_OUT_OF_INDEXES not defined on WinCE */ |
|||
#if !defined(TLS_OUT_OF_INDEXES) |
|||
#define TLS_OUT_OF_INDEXES 0xffffffff |
|||
#endif |
|||
|
|||
int |
|||
pthread_key_create (pthread_key_t * key, void (*destructor) (void *)) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function creates a thread-specific data key visible |
|||
* to all threads. All existing and new threads have a value |
|||
* NULL for key until set using pthread_setspecific. When any |
|||
* thread with a non-NULL value for key terminates, 'destructor' |
|||
* is called with key's current value for that thread. |
|||
* |
|||
* PARAMETERS |
|||
* key |
|||
* pointer to an instance of pthread_key_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function creates a thread-specific data key visible |
|||
* to all threads. All existing and new threads have a value |
|||
* NULL for key until set using pthread_setspecific. When any |
|||
* thread with a non-NULL value for key terminates, 'destructor' |
|||
* is called with key's current value for that thread. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully created semaphore, |
|||
* EAGAIN insufficient resources or PTHREAD_KEYS_MAX |
|||
* exceeded, |
|||
* ENOMEM insufficient memory to create the key, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result = 0; |
|||
pthread_key_t newkey; |
|||
|
|||
if ((newkey = (pthread_key_t) calloc (1, sizeof (*newkey))) == NULL) |
|||
{ |
|||
result = ENOMEM; |
|||
} |
|||
else if ((newkey->key = TlsAlloc ()) == TLS_OUT_OF_INDEXES) |
|||
{ |
|||
result = EAGAIN; |
|||
|
|||
free (newkey); |
|||
newkey = NULL; |
|||
} |
|||
else if (destructor != NULL) |
|||
{ |
|||
/*
|
|||
* Have to manage associations between thread and key; |
|||
* Therefore, need a lock that allows competing threads |
|||
* to gain exclusive access to the key->threads list. |
|||
* |
|||
* The mutex will only be created when it is first locked. |
|||
*/ |
|||
newkey->keyLock = 0; |
|||
newkey->destructor = destructor; |
|||
} |
|||
|
|||
*key = newkey; |
|||
|
|||
return (result); |
|||
} |
@ -1,125 +0,0 @@ |
|||
/*
|
|||
* pthread_key_delete.c |
|||
* |
|||
* Description: |
|||
* POSIX thread functions which implement thread-specific data (TSD). |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_key_delete (pthread_key_t key) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function deletes a thread-specific data key. This |
|||
* does not change the value of the thread specific data key |
|||
* for any thread and does not run the key's destructor |
|||
* in any thread so it should be used with caution. |
|||
* |
|||
* PARAMETERS |
|||
* key |
|||
* pointer to an instance of pthread_key_t |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function deletes a thread-specific data key. This |
|||
* does not change the value of the thread specific data key |
|||
* for any thread and does not run the key's destructor |
|||
* in any thread so it should be used with caution. |
|||
* |
|||
* RESULTS |
|||
* 0 successfully deleted the key, |
|||
* EINVAL key is invalid, |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
ptw32_mcs_local_node_t keyLock; |
|||
int result = 0; |
|||
|
|||
if (key != NULL) |
|||
{ |
|||
if (key->threads != NULL && key->destructor != NULL) |
|||
{ |
|||
ThreadKeyAssoc *assoc; |
|||
ptw32_mcs_lock_acquire (&(key->keyLock), &keyLock); |
|||
/*
|
|||
* Run through all Thread<-->Key associations |
|||
* for this key. |
|||
* |
|||
* While we hold at least one of the locks guarding |
|||
* the assoc, we know that the assoc pointed to by |
|||
* key->threads is valid. |
|||
*/ |
|||
while ((assoc = (ThreadKeyAssoc *) key->threads) != NULL) |
|||
{ |
|||
ptw32_mcs_local_node_t threadLock; |
|||
ptw32_thread_t * thread = assoc->thread; |
|||
|
|||
if (assoc == NULL) |
|||
{ |
|||
/* Finished */ |
|||
break; |
|||
} |
|||
|
|||
ptw32_mcs_lock_acquire (&(thread->threadLock), &threadLock); |
|||
/*
|
|||
* Since we are starting at the head of the key's threads |
|||
* chain, this will also point key->threads at the next assoc. |
|||
* While we hold key->keyLock, no other thread can insert |
|||
* a new assoc via pthread_setspecific. |
|||
*/ |
|||
ptw32_tkAssocDestroy (assoc); |
|||
ptw32_mcs_lock_release (&threadLock); |
|||
ptw32_mcs_lock_release (&keyLock); |
|||
} |
|||
} |
|||
|
|||
TlsFree (key->key); |
|||
if (key->destructor != NULL) |
|||
{ |
|||
/* A thread could be holding the keyLock */ |
|||
ptw32_mcs_lock_acquire (&(key->keyLock), &keyLock); |
|||
ptw32_mcs_lock_release (&keyLock); |
|||
} |
|||
|
|||
#if defined( _DEBUG ) |
|||
memset ((char *) key, 0, sizeof (*key)); |
|||
#endif |
|||
free (key); |
|||
} |
|||
|
|||
return (result); |
|||
} |
@ -1,105 +0,0 @@ |
|||
/*
|
|||
* pthread_kill.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements the pthread_kill routine. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
/*
|
|||
* Not needed yet, but defining it should indicate clashes with build target |
|||
* environment that should be fixed. |
|||
*/ |
|||
#if !defined(WINCE) |
|||
# include <signal.h> |
|||
#endif |
|||
|
|||
int |
|||
pthread_kill (pthread_t thread, int sig) |
|||
/*
|
|||
* ------------------------------------------------------ |
|||
* DOCPUBLIC |
|||
* This function requests that a signal be delivered to the |
|||
* specified thread. If sig is zero, error checking is |
|||
* performed but no signal is actually sent such that this |
|||
* function can be used to check for a valid thread ID. |
|||
* |
|||
* PARAMETERS |
|||
* thread reference to an instances of pthread_t |
|||
* sig signal. Currently only a value of 0 is supported. |
|||
* |
|||
* |
|||
* DESCRIPTION |
|||
* This function requests that a signal be delivered to the |
|||
* specified thread. If sig is zero, error checking is |
|||
* performed but no signal is actually sent such that this |
|||
* function can be used to check for a valid thread ID. |
|||
* |
|||
* RESULTS |
|||
* ESRCH the thread is not a valid thread ID, |
|||
* EINVAL the value of the signal is invalid |
|||
* or unsupported. |
|||
* 0 the signal was successfully sent. |
|||
* |
|||
* ------------------------------------------------------ |
|||
*/ |
|||
{ |
|||
int result = 0; |
|||
ptw32_thread_t * tp; |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
ptw32_mcs_lock_acquire(&ptw32_thread_reuse_lock, &node); |
|||
|
|||
tp = (ptw32_thread_t *) thread.p; |
|||
|
|||
if (NULL == tp |
|||
|| thread.x != tp->ptHandle.x |
|||
|| NULL == tp->threadH) |
|||
{ |
|||
result = ESRCH; |
|||
} |
|||
|
|||
ptw32_mcs_lock_release(&node); |
|||
|
|||
if (0 == result && 0 != sig) |
|||
{ |
|||
/*
|
|||
* Currently does not support any signals. |
|||
*/ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return result; |
|||
|
|||
} /* pthread_kill */ |
@ -1,187 +0,0 @@ |
|||
/*
|
|||
* pthread_mutex_consistent.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements mutual exclusion (mutex) primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
/*
|
|||
* From the Sun Multi-threaded Programming Guide |
|||
* |
|||
* robustness defines the behavior when the owner of the mutex terminates without unlocking the |
|||
* mutex, usually because its process terminated abnormally. The value of robustness that is |
|||
* defined in pthread.h is PTHREAD_MUTEX_ROBUST or PTHREAD_MUTEX_STALLED. The |
|||
* default value is PTHREAD_MUTEX_STALLED . |
|||
* ■ PTHREAD_MUTEX_STALLED |
|||
* When the owner of the mutex terminates without unlocking the mutex, all subsequent calls |
|||
* to pthread_mutex_lock() are blocked from progress in an unspecified manner. |
|||
* ■ PTHREAD_MUTEX_ROBUST |
|||
* When the owner of the mutex terminates without unlocking the mutex, the mutex is |
|||
* unlocked. The next owner of this mutex acquires the mutex with an error return of |
|||
* EOWNERDEAD. |
|||
* Note – Your application must always check the return code from pthread_mutex_lock() for |
|||
* a mutex initialized with the PTHREAD_MUTEX_ROBUST attribute. |
|||
* ■ The new owner of this mutex should make the state protected by the mutex consistent. |
|||
* This state might have been left inconsistent when the previous owner terminated. |
|||
* ■ If the new owner is able to make the state consistent, call |
|||
* pthread_mutex_consistent() for the mutex before unlocking the mutex. This |
|||
* marks the mutex as consistent and subsequent calls to pthread_mutex_lock() and |
|||
* pthread_mutex_unlock() will behave in the normal manner. |
|||
* ■ If the new owner is not able to make the state consistent, do not call |
|||
* pthread_mutex_consistent() for the mutex, but unlock the mutex. |
|||
* All waiters are woken up and all subsequent calls to pthread_mutex_lock() fail to |
|||
* acquire the mutex. The return code is ENOTRECOVERABLE. The mutex can be made |
|||
* consistent by calling pthread_mutex_destroy() to uninitialize the mutex, and calling |
|||
* pthread_mutex_int() to reinitialize the mutex.However, the state that was protected |
|||
* by the mutex remains inconsistent and some form of application recovery is required. |
|||
* ■ If the thread that acquires the lock with EOWNERDEAD terminates without unlocking the |
|||
* mutex, the next owner acquires the lock with an EOWNERDEAD return code. |
|||
*/ |
|||
#if !defined(_UWIN) |
|||
/*# include <process.h> */ |
|||
#endif |
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
int |
|||
ptw32_robust_mutex_inherit(pthread_mutex_t * mutex) |
|||
{ |
|||
int result; |
|||
pthread_mutex_t mx = *mutex; |
|||
ptw32_robust_node_t* robust = mx->robustNode; |
|||
|
|||
switch ((LONG)PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR)&robust->stateInconsistent, |
|||
(PTW32_INTERLOCKED_LONG)PTW32_ROBUST_INCONSISTENT, |
|||
(PTW32_INTERLOCKED_LONG)-1 /* The terminating thread sets this */)) |
|||
{ |
|||
case -1L: |
|||
result = EOWNERDEAD; |
|||
break; |
|||
case (LONG)PTW32_ROBUST_NOTRECOVERABLE: |
|||
result = ENOTRECOVERABLE; |
|||
break; |
|||
default: |
|||
result = 0; |
|||
break; |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
/*
|
|||
* The next two internal support functions depend on only being |
|||
* called by the thread that owns the robust mutex. This enables |
|||
* us to avoid additional locks. |
|||
* Any mutex currently in the thread's robust mutex list is held |
|||
* by the thread, again eliminating the need for locks. |
|||
* The forward/backward links allow the thread to unlock mutexes |
|||
* in any order, not necessarily the reverse locking order. |
|||
* This is all possible because it is an error if a thread that |
|||
* does not own the [robust] mutex attempts to unlock it. |
|||
*/ |
|||
|
|||
void |
|||
ptw32_robust_mutex_add(pthread_mutex_t* mutex, pthread_t self) |
|||
{ |
|||
ptw32_robust_node_t** list; |
|||
pthread_mutex_t mx = *mutex; |
|||
ptw32_thread_t* tp = (ptw32_thread_t*)self.p; |
|||
ptw32_robust_node_t* robust = mx->robustNode; |
|||
|
|||
list = &tp->robustMxList; |
|||
mx->ownerThread = self; |
|||
if (NULL == *list) |
|||
{ |
|||
robust->prev = NULL; |
|||
robust->next = NULL; |
|||
*list = robust; |
|||
} |
|||
else |
|||
{ |
|||
robust->prev = NULL; |
|||
robust->next = *list; |
|||
(*list)->prev = robust; |
|||
*list = robust; |
|||
} |
|||
} |
|||
|
|||
void |
|||
ptw32_robust_mutex_remove(pthread_mutex_t* mutex, ptw32_thread_t* otp) |
|||
{ |
|||
ptw32_robust_node_t** list; |
|||
pthread_mutex_t mx = *mutex; |
|||
ptw32_robust_node_t* robust = mx->robustNode; |
|||
|
|||
list = &(((ptw32_thread_t*)mx->ownerThread.p)->robustMxList); |
|||
mx->ownerThread.p = otp; |
|||
if (robust->next != NULL) |
|||
{ |
|||
robust->next->prev = robust->prev; |
|||
} |
|||
if (robust->prev != NULL) |
|||
{ |
|||
robust->prev->next = robust->next; |
|||
} |
|||
if (*list == robust) |
|||
{ |
|||
*list = robust->next; |
|||
} |
|||
} |
|||
|
|||
|
|||
int |
|||
pthread_mutex_consistent (pthread_mutex_t* mutex) |
|||
{ |
|||
pthread_mutex_t mx = *mutex; |
|||
int result = 0; |
|||
|
|||
/*
|
|||
* Let the system deal with invalid pointers. |
|||
*/ |
|||
if (mx == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (mx->kind >= 0 |
|||
|| (PTW32_INTERLOCKED_LONG)PTW32_ROBUST_INCONSISTENT != PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR)&mx->robustNode->stateInconsistent, |
|||
(PTW32_INTERLOCKED_LONG)PTW32_ROBUST_CONSISTENT, |
|||
(PTW32_INTERLOCKED_LONG)PTW32_ROBUST_INCONSISTENT)) |
|||
{ |
|||
result = EINVAL; |
|||
} |
|||
|
|||
return (result); |
|||
} |
|||
|
@ -1,148 +0,0 @@ |
|||
/*
|
|||
* pthread_mutex_destroy.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements mutual exclusion (mutex) primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_mutex_destroy (pthread_mutex_t * mutex) |
|||
{ |
|||
int result = 0; |
|||
pthread_mutex_t mx; |
|||
|
|||
/*
|
|||
* Let the system deal with invalid pointers. |
|||
*/ |
|||
|
|||
/*
|
|||
* Check to see if we have something to delete. |
|||
*/ |
|||
if (*mutex < PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) |
|||
{ |
|||
mx = *mutex; |
|||
|
|||
result = pthread_mutex_trylock (&mx); |
|||
|
|||
/*
|
|||
* If trylock succeeded and the mutex is not recursively locked it |
|||
* can be destroyed. |
|||
*/ |
|||
if (0 == result || ENOTRECOVERABLE == result) |
|||
{ |
|||
if (mx->kind != PTHREAD_MUTEX_RECURSIVE || 1 == mx->recursive_count) |
|||
{ |
|||
/*
|
|||
* FIXME!!! |
|||
* The mutex isn't held by another thread but we could still |
|||
* be too late invalidating the mutex below since another thread |
|||
* may already have entered mutex_lock and the check for a valid |
|||
* *mutex != NULL. |
|||
*/ |
|||
*mutex = NULL; |
|||
|
|||
result = (0 == result)?pthread_mutex_unlock(&mx):0; |
|||
|
|||
if (0 == result) |
|||
{ |
|||
if (mx->robustNode != NULL) |
|||
{ |
|||
free(mx->robustNode); |
|||
} |
|||
if (!CloseHandle (mx->event)) |
|||
{ |
|||
*mutex = mx; |
|||
result = EINVAL; |
|||
} |
|||
else |
|||
{ |
|||
free (mx); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Restore the mutex before we return the error. |
|||
*/ |
|||
*mutex = mx; |
|||
} |
|||
} |
|||
else /* mx->recursive_count > 1 */ |
|||
{ |
|||
/*
|
|||
* The mutex must be recursive and already locked by us (this thread). |
|||
*/ |
|||
mx->recursive_count--; /* Undo effect of pthread_mutex_trylock() above */ |
|||
result = EBUSY; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
ptw32_mcs_local_node_t node; |
|||
|
|||
/*
|
|||
* See notes in ptw32_mutex_check_need_init() above also. |
|||
*/ |
|||
|
|||
ptw32_mcs_lock_acquire(&ptw32_mutex_test_init_lock, &node); |
|||
|
|||
/*
|
|||
* Check again. |
|||
*/ |
|||
if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) |
|||
{ |
|||
/*
|
|||
* This is all we need to do to destroy a statically |
|||
* initialised mutex that has not yet been used (initialised). |
|||
* If we get to here, another thread |
|||
* waiting to initialise this mutex will get an EINVAL. |
|||
*/ |
|||
*mutex = NULL; |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* The mutex has been initialised while we were waiting |
|||
* so assume it's in use. |
|||
*/ |
|||
result = EBUSY; |
|||
} |
|||
ptw32_mcs_lock_release(&node); |
|||
} |
|||
|
|||
return (result); |
|||
} |
@ -1,130 +0,0 @@ |
|||
/*
|
|||
* pthread_mutex_init.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements mutual exclusion (mutex) primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
|
|||
int |
|||
pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr) |
|||
{ |
|||
int result = 0; |
|||
pthread_mutex_t mx; |
|||
|
|||
if (mutex == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
if (attr != NULL && *attr != NULL) |
|||
{ |
|||
if ((*attr)->pshared == PTHREAD_PROCESS_SHARED) |
|||
{ |
|||
/*
|
|||
* Creating mutex that can be shared between |
|||
* processes. |
|||
*/ |
|||
#if _POSIX_THREAD_PROCESS_SHARED >= 0 |
|||
|
|||
/*
|
|||
* Not implemented yet. |
|||
*/ |
|||
|
|||
#error ERROR [__FILE__, line __LINE__]: Process shared mutexes are not supported yet. |
|||
|
|||
#else |
|||
|
|||
return ENOSYS; |
|||
|
|||
#endif /* _POSIX_THREAD_PROCESS_SHARED */ |
|||
} |
|||
} |
|||
|
|||
mx = (pthread_mutex_t) calloc (1, sizeof (*mx)); |
|||
|
|||
if (mx == NULL) |
|||
{ |
|||
result = ENOMEM; |
|||
} |
|||
else |
|||
{ |
|||
mx->lock_idx = 0; |
|||
mx->recursive_count = 0; |
|||
mx->robustNode = NULL; |
|||
if (attr == NULL || *attr == NULL) |
|||
{ |
|||
mx->kind = PTHREAD_MUTEX_DEFAULT; |
|||
} |
|||
else |
|||
{ |
|||
mx->kind = (*attr)->kind; |
|||
if ((*attr)->robustness == PTHREAD_MUTEX_ROBUST) |
|||
{ |
|||
/*
|
|||
* Use the negative range to represent robust types. |
|||
* Replaces a memory fetch with a register negate and incr |
|||
* in pthread_mutex_lock etc. |
|||
* |
|||
* Map 0,1,..,n to -1,-2,..,(-n)-1 |
|||
*/ |
|||
mx->kind = -mx->kind - 1; |
|||
|
|||
mx->robustNode = (ptw32_robust_node_t*) malloc(sizeof(ptw32_robust_node_t)); |
|||
mx->robustNode->stateInconsistent = PTW32_ROBUST_CONSISTENT; |
|||
mx->robustNode->mx = mx; |
|||
mx->robustNode->next = NULL; |
|||
mx->robustNode->prev = NULL; |
|||
} |
|||
} |
|||
|
|||
mx->ownerThread.p = NULL; |
|||
|
|||
mx->event = CreateEvent (NULL, PTW32_FALSE, /* manual reset = No */ |
|||
PTW32_FALSE, /* initial state = not signaled */ |
|||
NULL); /* event name */ |
|||
|
|||
if (0 == mx->event) |
|||
{ |
|||
result = ENOSPC; |
|||
free (mx); |
|||
mx = NULL; |
|||
} |
|||
} |
|||
|
|||
*mutex = mx; |
|||
|
|||
return (result); |
|||
} |
@ -1,269 +0,0 @@ |
|||
/*
|
|||
* pthread_mutex_lock.c |
|||
* |
|||
* Description: |
|||
* This translation unit implements mutual exclusion (mutex) primitives. |
|||
* |
|||
* -------------------------------------------------------------------------- |
|||
* |
|||
* Pthreads-win32 - POSIX Threads Library for Win32 |
|||
* Copyright(C) 1998 John E. Bossom |
|||
* Copyright(C) 1999,2005 Pthreads-win32 contributors |
|||
* |
|||
* Contact Email: rpj@callisto.canberra.edu.au |
|||
* |
|||
* The current list of contributors is contained |
|||
* in the file CONTRIBUTORS included with the source |
|||
* code distribution. The list can also be seen at the |
|||
* following World Wide Web location: |
|||
* http://sources.redhat.com/pthreads-win32/contributors.html
|
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library in the file COPYING.LIB; |
|||
* if not, write to the Free Software Foundation, Inc., |
|||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|||
*/ |
|||
|
|||
#if !defined(_UWIN) |
|||
/*# include <process.h> */ |
|||
#endif |
|||
#include "pthread.h" |
|||
#include "implement.h" |
|||
|
|||
int |
|||
pthread_mutex_lock (pthread_mutex_t * mutex) |
|||
{ |
|||
int kind; |
|||
pthread_mutex_t mx; |
|||
int result = 0; |
|||
|
|||
/*
|
|||
* Let the system deal with invalid pointers. |
|||
*/ |
|||
if (*mutex == NULL) |
|||
{ |
|||
return EINVAL; |
|||
} |
|||
|
|||
/*
|
|||
* We do a quick check to see if we need to do more work |
|||
* to initialise a static mutex. We check |
|||
* again inside the guarded section of ptw32_mutex_check_need_init() |
|||
* to avoid race conditions. |
|||
*/ |
|||
if (*mutex >= PTHREAD_ERRORCHECK_MUTEX_INITIALIZER) |
|||
{ |
|||
if ((result = ptw32_mutex_check_need_init (mutex)) != 0) |
|||
{ |
|||
return (result); |
|||
} |
|||
} |
|||
|
|||
mx = *mutex; |
|||
kind = mx->kind; |
|||
|
|||
if (kind >= 0) |
|||
{ |
|||
/* Non-robust */ |
|||
if (PTHREAD_MUTEX_NORMAL == kind) |
|||
{ |
|||
if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) 1) != 0) |
|||
{ |
|||
while ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) -1) != 0) |
|||
{ |
|||
if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) |
|||
{ |
|||
result = EINVAL; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
pthread_t self = pthread_self(); |
|||
|
|||
if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) 1, |
|||
(PTW32_INTERLOCKED_LONG) 0) == 0) |
|||
{ |
|||
mx->recursive_count = 1; |
|||
mx->ownerThread = self; |
|||
} |
|||
else |
|||
{ |
|||
if (pthread_equal (mx->ownerThread, self)) |
|||
{ |
|||
if (kind == PTHREAD_MUTEX_RECURSIVE) |
|||
{ |
|||
mx->recursive_count++; |
|||
} |
|||
else |
|||
{ |
|||
result = EDEADLK; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
while ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) -1) != 0) |
|||
{ |
|||
if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) |
|||
{ |
|||
result = EINVAL; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (0 == result) |
|||
{ |
|||
mx->recursive_count = 1; |
|||
mx->ownerThread = self; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
/*
|
|||
* Robust types |
|||
* All types record the current owner thread. |
|||
* The mutex is added to a per thread list when ownership is acquired. |
|||
*/ |
|||
ptw32_robust_state_t* statePtr = &mx->robustNode->stateInconsistent; |
|||
|
|||
if ((PTW32_INTERLOCKED_LONG)PTW32_ROBUST_NOTRECOVERABLE == PTW32_INTERLOCKED_EXCHANGE_ADD_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR)statePtr, |
|||
(PTW32_INTERLOCKED_LONG)0)) |
|||
{ |
|||
result = ENOTRECOVERABLE; |
|||
} |
|||
else |
|||
{ |
|||
pthread_t self = pthread_self(); |
|||
|
|||
kind = -kind - 1; /* Convert to non-robust range */ |
|||
|
|||
if (PTHREAD_MUTEX_NORMAL == kind) |
|||
{ |
|||
if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) 1) != 0) |
|||
{ |
|||
while (0 == (result = ptw32_robust_mutex_inherit(mutex)) |
|||
&& (PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) -1) != 0) |
|||
{ |
|||
if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) |
|||
{ |
|||
result = EINVAL; |
|||
break; |
|||
} |
|||
if ((PTW32_INTERLOCKED_LONG)PTW32_ROBUST_NOTRECOVERABLE == |
|||
PTW32_INTERLOCKED_EXCHANGE_ADD_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR)statePtr, |
|||
(PTW32_INTERLOCKED_LONG)0)) |
|||
{ |
|||
/* Unblock the next thread */ |
|||
SetEvent(mx->event); |
|||
result = ENOTRECOVERABLE; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
if (0 == result || EOWNERDEAD == result) |
|||
{ |
|||
/*
|
|||
* Add mutex to the per-thread robust mutex currently-held list. |
|||
* If the thread terminates, all mutexes in this list will be unlocked. |
|||
*/ |
|||
ptw32_robust_mutex_add(mutex, self); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if ((PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) 1, |
|||
(PTW32_INTERLOCKED_LONG) 0) == 0) |
|||
{ |
|||
mx->recursive_count = 1; |
|||
/*
|
|||
* Add mutex to the per-thread robust mutex currently-held list. |
|||
* If the thread terminates, all mutexes in this list will be unlocked. |
|||
*/ |
|||
ptw32_robust_mutex_add(mutex, self); |
|||
} |
|||
else |
|||
{ |
|||
if (pthread_equal (mx->ownerThread, self)) |
|||
{ |
|||
if (PTHREAD_MUTEX_RECURSIVE == kind) |
|||
{ |
|||
mx->recursive_count++; |
|||
} |
|||
else |
|||
{ |
|||
result = EDEADLK; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
while (0 == (result = ptw32_robust_mutex_inherit(mutex)) |
|||
&& (PTW32_INTERLOCKED_LONG) PTW32_INTERLOCKED_EXCHANGE_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR) &mx->lock_idx, |
|||
(PTW32_INTERLOCKED_LONG) -1) != 0) |
|||
{ |
|||
if (WAIT_OBJECT_0 != WaitForSingleObject (mx->event, INFINITE)) |
|||
{ |
|||
result = EINVAL; |
|||
break; |
|||
} |
|||
if ((PTW32_INTERLOCKED_LONG)PTW32_ROBUST_NOTRECOVERABLE == |
|||
PTW32_INTERLOCKED_EXCHANGE_ADD_LONG( |
|||
(PTW32_INTERLOCKED_LONGPTR)statePtr, |
|||
(PTW32_INTERLOCKED_LONG)0)) |
|||
{ |
|||
/* Unblock the next thread */ |
|||
SetEvent(mx->event); |
|||
result = ENOTRECOVERABLE; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (0 == result || EOWNERDEAD == result) |
|||
{ |
|||
mx->recursive_count = 1; |
|||
/*
|
|||
* Add mutex to the per-thread robust mutex currently-held list. |
|||
* If the thread terminates, all mutexes in this list will be unlocked. |
|||
*/ |
|||
ptw32_robust_mutex_add(mutex, self); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
return (result); |
|||
} |
|||
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue