| Age | Commit message (Collapse) | Author | 
|---|
|  |  | 
|  |  | 
|  | a non-cancelable sem_wait() function. This is consistent with the
        way that pthread_mutex_timedlock.c does it.
        (pthread_mutex_lock): Use ptw32_semwait() instead of sem_wait(). | 
|  | * pthread_mutex_trylock.c: Should return EBUSY rather than EDEADLK.
        * pthread_mutex_destroy.c: Remove redundant ownership test (the
        trylock call does this for us); do not destroy a recursively locked
        mutex. | 
|  | * pthread_cond_destroy.c (pthread_cond_destroy):
        When two different threads exist, and one is attempting to
        destroy a condition variable while the other is attempting to
        initialize a condition variable that was created with
        PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink
        the ptw32_cond_list_lock critical section to fix it. | 
|  |  | 
|  | Remove code designed to avoid/prevent spurious wakeup
  problems. It is believed that the sem_timedwait() call
  is consuming a CV signal that it shouldn't and this is
  breaking the avoidance logic. | 
|  | unreasonable abstime values - that would result in
  unexpected timeout values.
* w32_CancelableWait.c (ptw32_cancelable_wait):
  Tighten up return value checking and add comments. | 
|  |  | 
|  |  | 
|  | * pthread.h: Conditionally added some #defines from config.h
        needed when not building the library. e.g. NEED_ERRNO, NEED_SEM.
        (PTW32_DLLPORT): Now only defined if _DLL defined.
        (_errno): Compiler directive was incorrectly including prototype.
        * sched.h: Conditionally added some #defines from config.h
        needed when not building the library.
        * semaphore.h: Replace an instance of NEED_SEM that should
        have been NEED_ERRNO. This change currently has nil effect.
        * GNUmakefile: Correct some recent changes.
        * Makefile: Add rule to generate pre-processor output. | 
|  | exit() rather than pthread_exit(). Add comments to explain
        why.
        * rwlock2_t.c: New test.
        * rwlock3_t.c: New test.
        * rwlock4_t.c: New test.
        * rwlock5_t.c: New test.
        * rwlock6_t.c: New test.
        * rwlock6_t2.c: New test.
        * rwlock6.c (main): Swap thread and result variables
        to correspond to actual thread functions.
        * rwlock1.c: Change test description comment to correspond
        to the actual test. | 
|  |  | 
|  | critical section to solve deadlock problem.
        * pthread.c: Add all remaining C modules.
        * pthread.h: Use dllexport/dllimport attributes on functions
        to avoid using pthread.def.
        * sched.h: Likewise.
        * semaphore.h: Likewise.
        * GNUmakefile: Add new targets for single translation
        unit build to maximise inlining potential; generate
        pthread.def automatically.
        * Makefile: Likewise, but no longer uses pthread.def. | 
|  |  | 
|  |  | 
|  |  | 
|  | conditional compilation; refinements; bug fixes. See the ChangeLog. | 
|  | 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(). | 
|  | * 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. | 
|  | 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. | 
|  | 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. | 
|  | * 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. |