Wed Jul 22 00:16:22 1998 Ross Johnson * attr.c, implement.h, pthread.h, ChangeLog: Resolve CVS merge conflicts. * private.c (_pthread_find_thread_entry): Changes to return type to support leaner _pthread_threads_table[] which now only stores _pthread_thread_thread_t *. (_pthread_new_thread_entry): Internal changes. (_pthread_delete_thread_entry): Internal changes to avoid contention. Calling routines changed accordingly. * pthread.h: Modified cleanup macros to use new generic push and pop. Added destructor and atfork stacks to _pthread_threads_thread_t. * cleanup.c (_pthread_handler_push, _pthread_handler_pop, _pthread_handler_pop_all): Renamed cleanup push and pop routines and made generic to handle destructors and atfork handlers as well. * create.c (_pthread_start_call): New function is a wrapper for all new threads. It allows us to do some cleanup when the thread returns, ie. that is otherwise only done if the thread is cancelled. * exit.c (_pthread_vacuum): New function contains code from pthread_exit() that we need in the new _pthread_start_call() as well. * implement.h: Various additions and minor changes. * pthread.h: Various additions and minor changes. Change cleanup handler macros to use generic handler push and pop functions. * attr.c: Minor mods to all functions. (is_attr): Implemented missing function. * create.c (pthread_create): More clean up. * private.c (_pthread_find_thread_entry): Implement. (_pthread_delete_thread_entry): Implement. (_pthread_new_thread_entry): Implement. These functions manipulate the implementations internal thread table and are part of general code cleanup and modularisation. They replace _pthread_getthreadindex() which was removed. * exit.c (pthread_exit): Changed to use the new code above. * pthread.h: Add cancelability constants. Update comments. 1998-07-22 Ben Elliston * attr.c (pthread_setstacksize): Update test of attr argument. (pthread_getstacksize): Likewise. (pthread_setstackaddr): Likewise. (pthread_getstackaddr): Likewise. (pthread_attr_init): No need to allocate any storage. (pthread_attr_destroy): No need to free any storage. * mutex.c (is_attr): Not likely to be needed; remove. (remove_attr): Likewise. (insert_attr): Likewise. * implement.h (_pthread_mutexattr_t): Moved to a public definition in pthread.h. There was little gain in hiding these details. (_pthread_condattr_t): Likewise. (_pthread_attr_t): Likewise. * pthread.h (pthread_atfork): Add function prototype. (pthread_attr_t): Moved here from implement.h. * fork.c (pthread_atfork): Preliminary implementation. (_pthread_fork): Likewise. Wed Jul 22 00:16:22 1998 Ross Johnson * cleanup.c (_pthread_cleanup_push): Implement. (_pthread_cleanup_pop): Implement. (_pthread_do_cancellation): Implement. These are private to the implementation. The real cleanup functions are macros. See below. * pthread.h (pthread_cleanup_push): Implement as a macro. (pthread_cleanup_pop): Implement as a macro. Because these are macros which start and end a block, the POSIX scoping requirement is observed. See the comment in the file. * exit.c (pthread_exit): Refine the code. * create.c (pthread_create): Code cleanup. * implement.h (RND_SIZEOF): Add RND_SIZEOF(T) to round sizeof(T) up to multiple of DWORD. Add function prototypes. * private.c (_pthread_getthreadindex): "*thread" should have been "thread". Detect empty slot fail condition. 1998-07-20 Ben Elliston * misc.c (pthread_once): Implement. Don't use a per-application flag and mutex--make `pthread_once_t' contain these elements in their structure. The earlier version had incorrect semantics. * pthread.h (_pthread_once_flag): Add new variable. Remove. (_pthread_once_lock): Add new mutex lock to ensure integrity of access to _pthread_once_flag. Remove. (pthread_once): Add function prototype. (pthread_once_t): Define this type. Mon Jul 20 02:31:05 1998 Ross Johnson * private.c (_pthread_getthreadindex): Implement. * pthread.h: Add application static data dependent on _PTHREADS_BUILD_DLL define. This is needed to avoid allocating non-sharable static data within the pthread DLL. * implement.h: Add _pthread_cleanup_stack_t, _pthread_cleanup_node_t and _PTHREAD_HASH_INDEX. * exit.c (pthread_exit): Begin work on cleanup and de-allocate thread-private storage. * create.c (pthread_create): Add thread to thread table. Keep a thread-private copy of the attributes with default values filled in when necessary. Same for the cleanup stack. Make pthread_create C run-time library friendly by using _beginthreadex() instead of CreateThread(). Fix error returns. Sun Jul 19 16:26:23 1998 Ross Johnson * implement.h: Rename pthreads_thread_count to _pthread_threads_count. Create _pthread_threads_thread_t struct to keep thread specific data. * create.c: Rename pthreads_thread_count to _pthread_threads_count. (pthread_create): Handle errors from CreateThread(). 1998-07-19 Ben Elliston * condvar.c (pthread_cond_wait): Generalise. Moved from here .. (cond_wait): To here. (pthread_cond_timedwait): Implement; use generalised cond_wait(). * pthread.h (pthread_key_t): Define this type. (pthread_key_create): Add function prototype. (pthread_setspecific): Likewise. (pthread_getspecific): Likwise. (pthread_key_delete): Likewise. * tsd.c (pthread_key_create): Implement. (pthread_setspecific): Likewise. (pthread_getspecific): Likewise. (pthread_key_delete): Likewise. * mutex.c (pthread_mutex_trylock): Return ENOSYS if this function is called on a Win32 platform which is not Windows NT. 1998-07-18 Ben Elliston * condvar.c (pthread_condattr_init): Do not attempt to malloc any storage; none is needed now that condattr_t is an empty struct. (pthread_condattr_destory): Likewise; do not free storage. (pthread_condattr_setpshared): No longer supported; return ENOSYS. (pthread_condattr_getpshared): Likewise. (pthread_cond_init): Implement with help from Douglas Schmidt. Remember to initialise the cv's internal mutex. (pthread_cond_wait): Likewise. (pthread_cond_signal): Likewise. (pthread_cond_broadcast): Likewise. (pthread_cond_timedwait): Preliminary implementation, but I need to see some API documentation for `WaitForMultipleObject'. (pthread_destory): Implement. * pthread.h (pthread_cond_init): Add function protoype. (pthread_cond_broadcast): Likewise. (pthread_cond_signal): Likewise. (pthread_cond_timedwait): Likewise. (pthread_cond_wait): Likewise. (pthread_cond_destroy): Likewise. (pthread_cond_t): Define this type. Fix for u_int. Do not assume that the mutex contained withing the pthread_cond_t structure will be a critical section. Use our new POSIX type! * implement.h (_pthread_condattr_t): Remove shared attribute. 1998-07-17 Ben Elliston * pthread.h (PTHREADS_PROCESS_PRIVATE): Remove. (PTHREAD_PROCESS_SHARED): Likewise. No support for mutexes shared across processes for now. (pthread_mutex_t): Use a Win32 CRITICAL_SECTION type for better performance. * implement.h (_pthread_mutexattr_t): Remove shared attribute. * mutex.c (pthread_mutexattr_setpshared): This optional function is no longer supported, since we want to implement POSIX mutex variables using the much more efficient Win32 critical section primitives. Critical section objects in Win32 cannot be shared between processes. (pthread_mutexattr_getpshared): Likewise. (pthread_mutexattr_init): No need to malloc any storage; the attributes structure is now empty. (pthread_mutexattr_destroy): This is now a nop. (pthread_mutex_init): Use InitializeCriticalSection(). (pthread_mutex_destroy): Use DeleteCriticalSection(). (pthread_mutex_lock): Use EnterCriticalSection(). (pthread_mutex_trylock): Use TryEnterCriticalSection(). This is not supported by Windows 9x, but trylock is a hack anyway, IMHO. (pthread_mutex_unlock): Use LeaveCriticalSection(). 1998-07-14 Ben Elliston * attr.c (pthread_attr_setstacksize): Implement. (pthread_attr_getstacksize): Likewise. (pthread_attr_setstackaddr): Likewise. (pthread_attr_getstackaddr): Likewise. (pthread_attr_init): Likewise. (pthread_attr_destroy): Likewise. * condvar.c (pthread_condattr_init): Add `_cond' to function name. * mutex.c (pthread_mutex_lock): Add `_mutex' to function name. (pthread_mutex_trylock): Likewise. (pthread_mutex_unlock): Likewise. * pthread.h (pthread_condattr_setpshared): Fix typo. (pthread_attr_init): Add function prototype. (pthread_attr_destroy): Likewise. (pthread_attr_setstacksize): Likewise. (pthread_attr_getstacksize): Likewise. (pthread_attr_setstackaddr): Likewise. (pthread_attr_getstackaddr): Likewise. Mon Jul 13 01:09:55 1998 Ross Johnson * implement.h: Wrap in #ifndef _IMPLEMENT_H * create.c (pthread_create): Map stacksize attr to Win32. * mutex.c: Include implement.h 1998-07-13 Ben Elliston * condvar.c (pthread_condattr_init): Implement. (pthread_condattr_destroy): Likewise. (pthread_condattr_setpshared): Likewise. (pthread_condattr_getpshared): Likewise. * implement.h (PTHREAD_THREADS_MAX): Remove trailing semicolon. (PTHREAD_STACK_MIN): Specify; needs confirming. (_pthread_attr_t): Define this type. (_pthread_condattr_t): Likewise. * pthread.h (pthread_mutex_t): Define this type. (pthread_condattr_t): Likewise. (pthread_mutex_destroy): Add function prototype. (pthread_lock): Likewise. (pthread_trylock): Likewise. (pthread_unlock): Likewise. (pthread_condattr_init): Likewise. (pthread_condattr_destroy): Likewise. (pthread_condattr_setpshared): Likewise. (pthread_condattr_getpshared): Likewise. * mutex.c (pthread_mutex_init): Implement. (pthread_mutex_destroy): Likewise. (pthread_lock): Likewise. (pthread_trylock): Likewise. (pthread_unlock): Likewise. 1998-07-12 Ben Elliston * implement.h (_pthread_mutexattr_t): Define this implementation internal type. Application programmers only see a mutex attribute object as a void pointer. * pthread.h (pthread_mutexattr_t): Define this type. (pthread_mutexattr_init): Add function prototype. (pthread_mutexattr_destroy): Likewise. (pthread_mutexattr_setpshared): Likewise. (pthread_mutexattr_getpshared): Likewise. (pthread_mutexattr_setprotocol): Likewise. (pthread_mutexattr_getprotocol): Likewise. (pthread_mutexattr_setprioceiling): Likewise. (pthread_mutexattr_getprioceiling): Likewise. (PTHREAD_PROCESS_PRIVATE): Define. (PTHREAD_PROCESS_SHARED): Define. * mutex.c (pthread_mutexattr_init): Implement. (pthread_mutexattr_destroy): Implement. (pthread_mutexattr_setprotocol): Implement. (pthread_mutexattr_getprotocol): Likewise. (pthread_mutexattr_setprioceiling): Likewise. (pthread_mutexattr_getprioceiling): Likewise. (pthread_mutexattr_setpshared): Likewise. (pthread_mutexattr_getpshared): Likewise. (insert_attr): New function; very preliminary implementation! (is_attr): Likewise. (remove_attr): Likewise. Sat Jul 11 14:48:54 1998 Ross Johnson * implement.h: Preliminary implementation specific defines. * create.c (pthread_create): Preliminary implementation. 1998-07-11 Ben Elliston * sync.c (pthread_join): Implement. * misc.c (pthread_equal): Likewise. * pthread.h (pthread_join): Add function prototype. (pthread_equal): Likewise. 1998-07-10 Ben Elliston * misc.c (pthread_self): Implement. * exit.c (pthread_exit): Implement. * pthread.h (pthread_exit): Add function prototype. (pthread_self): Likewise. (pthread_t): Define this type. 1998-07-09 Ben Elliston * create.c (pthread_create): A dummy stub right now. * pthread.h (pthread_create): Add function prototype.