Age | Commit message (Collapse) | Author |
|
|
|
* misc.c (CancelableWait): Ensure cancelEvent handle is the lowest
indexed element in the handles array. Enhance test for abandoned
objects.
* pthread.h (PTHREAD_MUTEX_INITIALIZER): Trailing elements not
initialised are set to zero by the compiler. This avoids the
problem of initialising the opaque critical section element in it.
(PTHREAD_COND_INITIALIZER): Ditto.
* semaphore.c (_pthread_sem_timedwait): Check sem == NULL earlier.
Sun Mar 7 12:31:14 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* condvar.c (pthread_cond_init): set semaphore initial value
to 0, not 1. cond_timedwait was returning signaled immediately.
* misc.c (CancelableWait): Place the cancel event handle first
in the handle table for WaitForMultipleObjects. This ensures that
the cancel event is recognised and acted apon if both objects
happen to be signaled together.
* private.c (_pthread_cond_test_init_lock): Initialise and destroy.
* implement.h (_pthread_cond_test_init_lock): Add extern.
* global.c (_pthread_cond_test_init_lock): Add declaration.
* condvar.c (pthread_cond_destroy): check for valid initialised CV;
flag destroyed CVs as invalid.
(pthread_cond_init): pthread_cond_t is no longer just a pointer.
This is because PTHREAD_COND_INITIALIZER needs state info to reside
in pthread_cond_t so that it can initialise on first use. Will work on
making pthread_cond_t (and other objects like it) opaque again, if
possible, later.
(cond_timedwait): add check for statically initialisation of
CV; initialise on first use.
(pthread_cond_signal): check for valid CV.
(pthread_cond_broadcast): check for valid CV.
(_cond_check_need_init): Add.
* pthread.h (PTHREAD_COND_INITIALIZER): Fix.
(pthread_cond_t): no longer a pointer to pthread_cond_t_.
(pthread_cond_t_): add 'staticinit' and 'valid' elements.
tests/ChangeLog
Sun Mar 7 10:41:52 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* Makefile (condvar3, condvar4): Add tests.
* condvar4.c (General): Reduce to simple test case; prerequisite
is condvar3.c; add description.
* condvar3.c (General): Reduce to simple test case; prerequisite
is condvar2.c; add description.
* condvar2.c (General): Reduce to simple test case; prerequisite
is condvar1.c; add description.
* condvar1.c (General): Reduce to simple test case; add
description.
* Template.c (Comments): Add generic test detail.
|
|
* Makefile (condvar3, condvar4): Add tests.
|
|
* condvar4.c (General): Reduce to simple test case; prerequisite
is condvar3.c; add description.
* condvar3.c (General): Reduce to simple test case; prerequisite
is condvar2.c; add description.
* condvar2.c (General): Reduce to simple test case; prerequisite
is condvar1.c; add description.
* condvar1.c (General): Reduce to simple test case; add
description.
* Template.c (Comments): Add generic test detail.
|
|
|
|
* Template.c: Revamp.
* condvar1.c: Add.
* condvar2.c: Add.
* Makefile: Add condvar1 condvar2 tests.
* exit1.c, exit2.c, exit3.c: Cosmetic changes.
|
|
* Makefile: Some refinement.
* *.c: More exhaustive checking through assertions; clean up;
add some more tests.
|
|
* Makefile: Now actually runs the tests.
* tests.h: Define our own assert macro. The Mingw32
version pops up a dialog but we want to run non-interactively.
* equal1.c: use assert a little more directly so that it
prints the actual call statement.
* exit1.c: Modify to return 0 on success, 1 on failure.
|
|
* pthread.h (PTHREAD_MUTEX_INITIALIZER): missing braces around
cs element initialiser.
Bring some tests up-to-date.
|
|
* README: Update.
* Makefile: New file. Run all tests automatically. Primitive tests
are run first; more complex tests are run last.
* count1.c: New test. Validate the thread count.
* exit2.c: Perform a simpler test.
* exit3.c: New test. Replaces exit2.c, since exit2.c needs to
perform simpler checking first.
* create1.c: Update to use the new testsuite exiting convention.
* equal1.c: Likewise.
* mutex1.c: Likewise.
* mutex2.c: Likewise.
* once1.c: Likewise.
* self2.c: Likewise.
* self3.c: Likewise.
* tsd1.c: Likewise.
|
|
* tests/mutex2.c: Test static mutex initialisation.
* tests/test.h: New. Declares a table mapping error numbers to
error names.
|
|
* misc.c (pthread_equal): Fix inverted result.
|
|
|
|
|
|
* pthread.h (pthread_mutexattr_t): Changed to a pointer.
* mutex.c (pthread_mutex_init): Conditionally create Win32 mutex
- from John Bossom's implementation.
(pthread_mutex_destroy): Conditionally close Win32 mutex
- from John Bossom's implementation.
(pthread_mutexattr_init): Replaced by John Bossom's version.
(pthread_mutexattr_destroy): Ditto.
(pthread_mutexattr_getpshared): New function from John Bossom's
implementation.
(pthread_mutexattr_setpshared): New function from John Bossom's
implementation.
Tue Jan 19 18:27:42 1999 Ross Johnson <rpj@swan.canberra.edu.au>
* pthread.h (pthreadCancelableTimedWait): New prototype.
(pthreadCancelableWait): Remove second argument.
* misc.c (CancelableWait): New static function is
pthreadCancelableWait() renamed.
(pthreadCancelableWait): Now just calls CancelableWait() with
INFINITE timeout.
(pthreadCancelableTimedWait): Just calls CancelableWait()
with passed in timeout.
* private.c (_pthread_sem_timedwait): 'abstime' arg really is
absolute time. Calculate relative time to wait from current
time before passing timeout to new routine
pthreadCancelableTimedWait().
- Scott Lightner <scott@curriculum.com>
Tue Jan 19 10:27:39 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* pthread.h (pthread_mutexattr_setforcecs_np): New prototype.
* mutex.c (pthread_mutexattr_init): Init 'pshared' and 'forcecs'
attributes to 0.
(pthread_mutexattr_setforcecs_np): New function (not portable).
* pthread.h (pthread_mutex_t):
Add 'mutex' element. Set to NULL in PTHREAD_MUTEX_INITIALIZER.
The pthread_mutex_*() routines will try to optimise performance
by choosing either mutexes or critical sections as the basis
for pthread mutexes for each indevidual mutex.
(pthread_mutexattr_t_): Add 'forcecs' element.
Some applications may choose to force use of critical sections
if they know that:-
the mutex is PROCESS_PRIVATE and,
either the OS supports TryEnterCriticalSection() or
pthread_mutex_trylock() will never be called on the mutex.
This attribute will be setable via a non-portable routine.
Note: We don't yet support PROCESS_SHARED mutexes, so the
implementation as it stands will default to Win32 mutexes only if
the OS doesn't support TryEnterCriticalSection. On Win9x, and early
versions of NT 'forcecs' will need to be set in order to get
critical section based mutexes.
Sun Jan 17 12:01:26 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* pthread.h (PTHREAD_MUTEX_INITIALIZER): Init new 'staticinit'
value to '1' and existing 'valid' value to '1'.
* global.c (_pthread_mutex_test_init_lock): Add.
* implement.h (_pthread_mutex_test_init_lock.): Add extern.
* private.c (_pthread_processInitialize): Init critical section for
global lock used by _mutex_check_need_init().
(_pthread_processTerminate): Ditto (:s/Init/Destroy/).
* dll.c (dllMain): Move call to FreeLibrary() so that it is only
called once when the process detaches.
* mutex.c (_mutex_check_need_init): New static function to test
and init PTHREAD_MUTEX_INITIALIZER mutexes. Provides serialised
access to the internal state of the uninitialised static mutex.
Called from pthread_mutex_trylock() and pthread_mutex_lock() which
do a quick unguarded test to check if _mutex_check_need_init()
needs to be called. This is safe as the test is conservative
and is repeated inside the guarded section of
_mutex_check_need_init(). Thus in all calls except the first
calls to lock static mutexes, the additional overhead to lock any
mutex is a single memory fetch and test for zero.
* pthread.h (pthread_mutex_t_): Add 'staticinit' member. Mutexes
initialised by PTHREAD_MUTEX_INITIALIZER aren't really initialised
until the first attempt to lock it. Using the 'valid'
flag (which flags the mutex as destroyed or not) to record this
information would be messy. It is possible for a statically
initialised mutex such as this to be destroyed before ever being
used.
* mutex.c (pthread_mutex_trylock): Call _mutex_check_need_init()
to test/init PTHREAD_MUTEX_INITIALIZER mutexes.
(pthread_mutex_lock): Ditto.
(pthread_mutex_unlock): Add check to ensure we don't try to unlock
an unitialised static mutex.
(pthread_mutex_destroy): Add check to ensure we don't try to delete
a critical section that we never created. Allows us to destroy
a static mutex that has never been locked (and hence initialised).
(pthread_mutex_init): Set 'staticinit' flag to 0 for the new mutex.
|
|
* private.c (_pthread_sem_timedwait): Move from semaphore.c.
* semaphore.c : Remove redundant #includes.
(_pthread_sem_timedwait): Move to private.c.
(sem_wait): Add missing abstime arg to pthreadCancelableWait() call.
1999-01-17 Ross Johnson <rpj@ise.canberra.edu.au>
* runtest: New script to build and run a test in the tests directory.
|
|
This will be tagged as snapshot-1999-01-04-1305
|
|
* cleanup.c (_pthread_handler_push): Fixed bug appending new
handler to list reported by Peter Slacik
<Peter.Slacik@leibinger.freinet.de>.
(new_thread): Rename poorly named local variable to
"new_handler".
|
|
* tsd1.c (mythread): Fix some casts and add some diagnostics.
Fix inverted conditional.
|
|
* tsd1.c: New. Test TSD using 1 key and 2 threads.
|
|
* pthread.def: Update. Some functions aren't available yet, others
are macros in <pthread.h>.
* tests/join.c: Remove; useless.
|
|
* tests/self.c: Remove; rename to self1.c.
* tests/self1.c: This is the old self.c.
* tests/self2.c: New file. Test pthread_self() with a single
thread. Passes.
* tests/self3.c: New file. Test pthread_self() with a couple of
threads to ensure their thread IDs differ. Passes.
|
|
* misc.c (pthread_once): Use the POSIX mutex primitives, not Win32.
Remove irrelevant FIXME comment.
* pthread.h (PTHREAD_ONCE_INIT): Define.
* tests/once1.c: New file; test for pthread_once(). Passes.
|
|
* misc.c (pthread_equal): Correct inverted logic bug.
* tests/create1.c: New file; test pthread_create(). Passes.
* tests/equal.c: Poor test; remove.
* tests/equal1.c New file; test pthread_equal(). Passes.
|
|
* global.c (PTHREAD_MUTEX_INITIALIZER): Move to pthread.h.
* pthread.h (PTHREAD_MUTEX_INITIALIZER): Define.
(pthread_mutex_t): Reimplement as a struct containing a valid
flag. If the flag is ever down upon entry to a mutex operation,
we call pthread_mutex_create() to initialise the object. This
fixes the problem of how to handle statically initialised objects
that can't call InitializeCriticalSection() due to their context.
* mutex.c (pthread_mutex_init): Set valid flag.
(pthread_mutex_destroy): Clear valid flag.
(pthread_mutex_lock): Check and handle the valid flag.
(pthread_mutex_unlock): Likewise.
(pthread_mutex_trylock): Likewise.
* tests/mutex3.c: New file; test for the static initialisation
macro. Passes.
|
|
* tests/mutex2.c: Test pthread_mutex_trylock(). Passes.
* tests/mutex1.c (main): Eliminate warning.
|
|
* tests/mutex1.c: New basic test for mutex functions (it passes).
|
|
* eyal1.c: New file; contributed by Eyal Lebedinsky
<eyal@eyal.emu.id.au>.
|
|
* exit2.c (func): Return a value.
(main): Call the right thread entry function.
|
|
|
|
|
|
* exit2.c (main): Fix size of pthread_t array.
|
|
|
|
* exit2.c: New file; test pthread_exit() harder.
|
|
* exit1.c: New file; test pthread_exit().
|
|
|