| Age | Commit message (Collapse) | Author | 
|---|
|  | cancelation point. Deferred cancels will interrupt the
        wait. | 
|  |  | 
|  | to disable cancelation at the start of a thread's cancelation
	run to prevent double cancelation. The main problem
	arises if a thread is canceling and then receives a subsequent
	async cancel request.
	* private.c: Likewise.
	* condvar.c: Place pragmas around cleanup_push/pop to turn
	off inline optimisation (/Obn where n>0 - MSVC only). Various
	optimisation switches in MSVC turn this on, which interferes with
	the way that cleanup handlers are run in C++ EH and SEH
	code. Application code compiled with inline optimisation must
	also wrap cleanup_push/pop blocks with the pragmas, e.g.
	  #pragma inline_depth(0)
	  pthread_cleanup_push(...)
	    ...
	  pthread_cleanup_pop(...)
	  #pragma inline_depth(8)
	* rwlock.c: Likewise.
	* mutex.c: Remove attempts to inline some functions.
	* signal.c: Modify misleading comment.
tests/
	* mutex8: New test.
	* mutex8n: New test.
	* mutex8e: New test.
	* mutex8r: New test.
	* cancel6a: New test.
	* cancel6d: New test.
	* cleanup0.c: Add pragmas for inline optimisation control.
	* cleanup1.c: Add pragmas for inline optimisation control.
	* cleanup2.c: Add pragmas for inline optimisation control.
	* cleanup3.c: Add pragmas for inline optimisation control.
	* condvar7.c: Add pragmas for inline optimisation control.
	* condvar8.c: Add pragmas for inline optimisation control.
	* condvar9.c: Add pragmas for inline optimisation control. | 
|  | for systems that define NEED_SEM (e.g. early WinCE).
        * mutex.c (pthread_mutex_timedlock): Return ENOTSUP
        for systems that define NEED_SEM since they don't
        have sem_trywait(). | 
|  | for the case where abstime has passed already.
Make routines INLINEable since some are called by other
routines in this module. | 
|  |  | 
|  |  | 
|  | * mutex.c (pthread_mutex_timedlock): New function suggested by
        Alexander Terekhov. The logic required to implement this
        properly came from Alexander, with some collaboration
        with Thomas Pfaff.
        (pthread_mutex_unlock): Wrap the waiters check and sema
        post in a critical section to prevent a race with
        pthread_mutex_timedlock.
        (ptw32_timed_semwait): New function;
        returns a special result if the absolute timeout parameter
        represents a time already passed when called; used by
        pthread_mutex_timedwait(). Have deliberately not reused
        the name "ptw32_sem_timedwait" because they are not the same
        routine.
        * condvar.c (ptw32_cond_timedwait): Use the new sem_timedwait()
        instead of ptw32_sem_timedwait(), which now has a different
        function. See previous.
        * implement.h: Remove prototype for ptw32_sem_timedwait.
        See next.
        (pthread_mutex_t_): Add critical section element for access
        to lock_idx during mutex post-timeout processing.
        * semaphore.h (sem_timedwait): See next.
        * semaphore.c (sem_timedwait): See next.
        * private.c (ptw32_sem_timedwait): Move to semaphore.c
        and rename as sem_timedwait().
2002-01-18  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * sync.c (pthread_join): Was getting the exit code from the
        calling thread rather than the joined thread if
        defined(__MINGW32__) && !defined(__MSVCRT__).
2002-01-15  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * pthread.h: Unless the build explicitly defines __CLEANUP_SEH,
        __CLEANUP_CXX, or __CLEANUP_C, then the build defaults to
        __CLEANUP_C style cleanup. This style uses setjmp/longjmp
        in the cancelation and thread exit implementations and therefore
        won't do stack unwinding if linked to applications that have it
        (e.g. C++ apps). This is currently consistent with most/all
        commercial Unix POSIX threads implementations.
        * spin.c (pthread_spin_init): Edit renamed function call.
        * nonportable.c (pthread_num_processors_np): New.
        (pthread_getprocessors_np): Renamed to ptw32_getprocessors
        and moved to private.c.
        * private.c (pthread_getprocessors): Moved here from
        nonportable.c.
        * pthread.def (pthread_getprocessors_np): Removed
        from export list.
        * rwlock.c (pthread_rwlockattr_init): New.
        (pthread_rwlockattr_destroy): New.
        (pthread_rwlockattr_getpshared): New.
        (pthread_rwlockattr_setpshared): New. | 
|  | indirection error introduced 2002-01-04.
	(pthread_attr_getscope): Likewise.
        * pthread.dsp (SOURCE): Add missing source files.
./tests/:
        * exception3.c (main): Shorten wait time.
        * mutex7.c: New test.
        * mutex7n.c: New test.
        * mutex7e.c: New test.
        * mutex7r.c: New test.
        * mutex6.c: Modified to avoid leaving the locked mutex
        around on exit. | 
|  |  | 
|  | ptw32_interlocked_compare_exchange function pointer
        rather than ptw32_InterlockedCompareExchange() directly
        to retain portability to non-iX86 processors,
        e.g. WinCE etc. The pointer will point to the native
        OS version of InterlockedCompareExchange() if the
        OS supports it (see ChangeLog entry of 2001-10-17). | 
|  | section calls.
	(pthread_mutex_destroy): Likewise.
	(pthread_mutex_unlock): Likewise.
	(pthread_mutex_trylock): Likewise; recursive mutexes
	now increment the lock count rather than return EBUSY;
	errorcheck mutexes return EDEADLCK rather than
	EBUSY. This behaviour is consistent with the Solaris
	pthreads implementation.
	* implement.h (pthread_mutex_t_): Remove critical
	section element - no longer needed. | 
|  | checking and actually store the scope value even
        though it's not really necessary.
        (pthread_attr_getscope): Return stored value.
        * implement.h (pthread_attr_t_): Add new scope element.
        * ANNOUNCE: Fix out of date comment next to
        pthread_attr_setscope in conformance section. | 
|  | not thread-safe.
	(pthread_mutex_trylock): Likewise. | 
|  |  | 
|  | Remove unused autoconf files;
Add the file COPYING, which describes the pthread-win32 license
relative to the FSF LGPL. | 
|  | the calloc NULL check was left in the conditionally included section.
(sem_destroy): Likewise, the calloced sem_t wasn't being freed. | 
|  | in conditionally compiled code. Only older versions of
        WinCE require this code, hence it doesn't normally get
        tested. | 
|  | WSAGetLastError() and WSASetLastError().
        * Makefile (wsock32.lib): Likewise.
        * create.c: Minor mostly inert changes.
        * implement.h (PTW32_MAX): Move into here and renamed
        from sched.h.
        (PTW32_MIN): Likewise.
        * GNUmakefile (TEST_ICE): Define if testing internal
        implementation of InterlockedCompareExchange.
        * Makefile (TEST_ICE): Likewise.
        * private.c (TEST_ICE): Likewise. | 
|  | implement.h; rename to PTW32_INTERLOCKED_LONG and
	PTW32_INTERLOCKED_LPLONG respectively.
	* spin.c: Likewise; ptw32_interlocked_compare_exchange used
	in place of InterlockedCompareExchange directly.
	* global.c (ptw32_interlocked_compare_exchange): Add
	prototype for this new routine pointer to be used when
	InterlockedCompareExchange isn't supported by Windows.
	* nonportable.c (pthread_win32_process_attach_np): Check for
	support of InterlockedCompareExchange in kernel32 and assign its
	address to ptw32_interlocked_compare_exchange if it exists, or
	our own ix86 specific implementation ptw32_InterlockedCompareExchange.
	*private.c (ptw32_InterlockedCompareExchange): An
	implementation of InterlockedCompareExchange() which is
	specific to ix86; written directly in assembler for either
	MSVC or GNU C; needed because Windows 95 doesn't support
	InterlockedCompareExchange().
	* sched.c (sched_get_priority_min): Extend to return
	THREAD_PRIORITY_IDLE.
	(sched_get_priority_max): Extend to return
	THREAD_PRIORITY_CRITICAL. | 
|  | from LCC by conditionally compiling the stacksize
        validity check. LCC correctly warns that the condition
        (stacksize < PTHREAD_STACK_MIN) is suspicious
        because STACK_MIN is 0 and stacksize is of type
        size_t (or unsigned int). | 
|  | was causing a program fault.
        (pthread_spin_init): Could have alloced memory
        without freeing under some error conditions.
        * mutex.c (pthread_mutex_init): Move memory
        allocation of mutex struct after checking for
        PROCESS_SHARED. | 
|  | EPERM if the spinlock was not locked, for multi CPU
        machines. | 
|  |  | 
|  | that is no longer used.
        * implement.h: Likewise. | 
|  |  | 
|  | * condvar.c (pthread_cond_destroy): fix bug with
        respect to deadlock in the case of concurrent
        _destroy/_unblock; a condition variable can be destroyed
        immediately after all the threads that are blocked on
        it are awakened. | 
|  | winsock error [from WSAGetLastError()]. | 
|  |  | 
|  | a cancelation point; re-enable deferred cancelability
        around the CV call. | 
|  | Contributed by - "Scott McCaskill" <scott@magruder.org>
        * mutex.c (pthread_mutexattr_init): Return ENOMEM
        immediately and don't dereference the NULL pointer
        if calloc fails.
        (pthread_mutexattr_getpshared): Don't dereference
        a pointer that is possibly NULL.
        * barrier.c (pthread_barrierattr_init): Likewise
        (pthread_barrierattr_getpshared): Don't dereference
        a pointer that is possibly NULL.
        * condvar.c (pthread_condattr_getpshared): Don't dereference
        a pointer that is possibly NULL. | 
|  | immediately and don't dereference the NULL pointer
        if calloc fails.
        - "Scott McCaskill" <scott@magruder.org> | 
|  |  | 
|  |  | 
|  |  | 
|  | * barrier.c: Still more revamping. The exclusive access
        mutex isn't really needed so it has been removed and replaced
        by an InterlockedDecrement(). nSerial has been removed.
        iStep is now dual-purpose. The process shared attribute
        is now stored in the barrier struct.
        * implement.h (pthread_barrier_t_): Lost some/gained one
        elements.
        * private.c (ptw32_threadStart): Removed some comments. | 
|  | semaphores are used instead of the PulseEvent. Also improved
	overall throughput by returning PTHREAD_BARRIER_SERIAL_THREAD
	to the first waking thread.
	* implement.h (pthread_barrier_t_): Revamped. | 
|  | * barrier.c: Fix several bugs in all routines. Now passes
	tests/barrier5.c which is fairly rigorous. There is still
	a non-optimal work-around for a race condition between
	the barrier breeched event signal and event wait. Basically
	the last (signalling) thread to hit the barrier yields
	to allow any other threads, which may have lost the race,
	to complete.
tests/ChangeLog:
	* barrier3.c: Fixed.
	* barrier4.c: Fixed.
	* barrier5.c: New; proves that all threads in the group
	reaching the barrier wait and then resume together. Repeats
	the test using groups of 1 to 16 threads. Each group of
	threads must negotiate a large number of barriers (10000).
	* spin4.c: Fixed.
	* test.h (error_string): Modified the success (0) value. | 
|  |  | 
|  | * spin.c: Revamped and working; included static initialiser.
	* barrier.c: Likewise.
	* condvar.c: Macro constant change; inline auto init routine.
	* mutex.c: Likewise.
	* rwlock.c: Likewise.
	* private.c: Add support for spinlock initialiser.
	* global.c: Likewise.
	* implement.h: Likewise.
	* pthread.h (PTHREAD_SPINLOCK_INITIALIZER): Fix typo.
tests/ChangeLog:
	* spin3.c: Changed test and fixed.
	* spin4.c: Fixed.
	* barrier3.c: Fixed.
	* barrier4.c: Fixed. | 
|  |  | 
|  | for this object.
	* pthread.h (PTHREAD_BARRIER_INITIALIZER): Removed.
	* rwlock.c (pthread_rwlock_wrlock): This routine is
	not a cancelation point - disable deferred
	cancelation around call to pthread_cond_wait().
tests/ChangeLog:
	* spin1.c: New; testing spinlocks.
	* spin2.c: New; testing spinlocks.
	* spin3.c: New; testing spinlocks.
	* spin4.c: New; testing spinlocks.
	* barrier1.c: New; testing barriers.
	* barrier2.c: New; testing barriers.
	* barrier3.c: New; testing barriers.
	* barrier4.c: New; testing barriers.
	* GNUmakefile: Add new tests.
	* Makefile: Add new tests. | 
|  | * spin.c: New module implementing spin locks.
        * barrier.c: New module implementing barriers.
        * pthread.h (_POSIX_SPIN_LOCKS): defined.
        (_POSIX_BARRIERS): Defined.
        (pthread_spin_*): Defined.
        (pthread_barrier*): Defined.
        (PTHREAD_BARRIER_SERIAL_THREAD): Defined.
        * implement.h (pthread_spinlock_t_): Defined.
        (pthread_barrier_t_): Defined.
        (pthread_barrierattr_t_): Defined.
        * mutex.c (pthread_mutex_lock): Return with the error
        if an auto-initialiser initialisation fails.
        * nonportable.c (pthread_getprocessors_np): New; gets the
        number of available processors for the current process. | 
|  | Update ANNOUNCE to get ready for new snapshot. | 
|  | in instead. | 
|  |  | 
|  | Contributed by  - Alexander Terekhov.
        * condvar.c: Fixed lost signal bug reported by Timur Aydin
        (taydin@snet.net).
        [RPJ (me) didn't translate the original algorithm
        correctly.]
        * semaphore.c: Added sem_post_multiple; this is a useful
        routine, but it doesn't appear to be standard. For now it's
        not an exported function. | 
|  | Contributed by  - Alexander Terekhov.
	* condvar.c: Fixed lost signal bug reported by Timur Aydin
	(taydin@snet.net).
	[RPJ (me) didn't translate the original algorithm
	correctly.]
	* semaphore.c: Added sem_post_multiple; this is a useful
	routine, but it doesn't appear to be standard. For now it's
	not an exported function.
tests/ChangeLog:
2001-07-01  Ross Johnson  <rpj@special.ise.canberra.edu.au>
	* benchtest3.c: New; timing mutexes.
	* benchtest4.c: New; time mutexes.
	* condvar3_1.c: Fixed bug - Alexander Terekhov
	* condvar3_3.c: New test.
2001-06-25  Ross Johnson  <rpj@special.ise.canberra.edu.au>
	* priority1.c: New test.
	* priority2.c: New test.
	* inherit1.c: New test.
	* benchtest1.c: New; timing mutexes.
	* benchtest2.c: New; timing mutexes.
	* mutex4.c: Modified to test all mutex types. | 
|  | * create.c (pthread_create): Add priority inheritance
        attributes.
        * mutex.c (pthread_mutex_lock): Remove some overhead for
        PTHREAD_MUTEX_NORMAL mutex types. Specifically, avoid
        calling pthread_self() and pthread_equal() to check/set
        the mutex owner. Introduce a new pseudo owner for this
        type. Test results suggest increases in speed of up to
        90% for non-blocking locks.
        This is the default type of mutex used internally by other
        synchronising objects, ie. condition variables and
        read-write locks. The test rwlock7.c shows about a
        30-35% speed increase over snapshot 2001-06-06. The
        price of this is that the application developer
        must ensure correct behaviour, or explicitly set the
        mutex to a safer type such as PTHREAD_MUTEX_ERRORCHECK.
        For example, PTHREAD_MUTEX_NORMAL (or PTHREAD_MUTEX_DEFAULT)
        type mutexes will not return an error if a thread which is not
        the owner calls pthread_mutex_unlock. The call will succeed
        in unlocking the mutex if it is currently locked, but a
        subsequent unlock by the true owner will then fail with EPERM.
        This is however consistent with some other implementations.
        (pthread_mutex_unlock): Likewise.
        (pthread_mutex_trylock): Likewise.
        (pthread_mutex_destroy): Likewise.
        * attr.c (pthread_attr_init): PTHREAD_EXPLICIT_SCHED is the
        default inheritance attribute; THREAD_PRIORITY_NORMAL is
        the default priority for new threads.
        * sched.c (pthread_attr_setschedpolicy): Added routine.
        (pthread_attr_getschedpolicy): Added routine.
        (pthread_attr_setinheritsched): Added routine.
        (pthread_attr_getinheritsched): Added routine.
        * pthread.h (sched_rr_set_interval): Added as a macro;
        returns -1 with errno set to ENOSYS.
2001-06-23  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
        *sched.c (pthread_attr_setschedparam): Add priority range
        check.
        (sched_setscheduler): New function; checks for a valid
        pid and policy; checks for permission to set information
        in the target process; expects pid to be a Win32 process ID,
        not a process handle; the only scheduler policy allowed is
        SCHED_OTHER.
        (sched_getscheduler): Likewise, but checks for permission
        to query.
        * pthread.h (SCHED_*): Moved to sched.h as defined in the
        POSIX standard.
        * sched.h (SCHED_*): Moved from pthread.h.
        (pid_t): Defined if necessary.
        (sched_setscheduler): Defined.
        (sched_getscheduler): Defined.
        * pthread.def (sched_setscheduler): Exported.
        (sched_getscheduler): Likewise.
2001-06-23  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
        Contributed by -  Ralf Brese <Ralf.Brese@pdb4.siemens.de>
        * create.c (pthread_create): Set thread priority from
        thread attributes. | 
|  | * dll.c (dllMain): Moved UWIN process attach code
        to pthread_win32_process_attach_np(); moved
        instance of pthread_count to global.c.
        * global.c (pthread_count): Moved from dll.c.
        * nonportable.c (pthread_win32_process_attach_np):
        Moved _UWIN code to here from dll.c.
        * implement.h (pthread_count): Define extern int.
        * create.c (pthread_count): Remove extern int.
        * private.c (pthread_count): Likewise.
        * exit.c (pthread_count): Likewise.
        Contributed by -  David Korn <dgk@research.att.com>
        * dll.c: Added changes necessary to work with UWIN.
        * create.c: Likewise.
        * pthread.h: Likewise.
        * misc.c: Likewise.
        * exit.c: Likewise.
        * private.c: Likewise.
        * implement.h: Likewise.
        There is some room at the start of struct pthread_t_
        to implement the signal semantics in UWIN's posix.dll
        although this is not yet complete.
        * Nmakefile: Compatible with UWIN's Nmake utility.
        * Nmakefile.tests: Likewise - for running the tests. |