Age | Commit message (Collapse) | Author |
|
with a recursive mutex that was locked by the current thread, the
function was failing with a success return code.
|
|
exit.
|
|
|
|
|
|
|
|
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.
|