summaryrefslogtreecommitdiff
path: root/nonportable.c
diff options
context:
space:
mode:
authorrpj <rpj>2001-05-31 02:01:47 +0000
committerrpj <rpj>2001-05-31 02:01:47 +0000
commite121b938c9f012958196a3141f04a3fd4f58bdb9 (patch)
treed1cb950413e3a350606f2a4d9bea687b6680570d /nonportable.c
parent6bf07e836550f9ffe11e0f38ff1323be731eb250 (diff)
2001-05-30 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
* pthread.h (rand_r): Fake using _seed argument to quell compiler warning (compiler should optimise this away later). * GNUmakefile (OPT): Leave symbolic information out of the library and increase optimisation level - for smaller faster prebuilt dlls. 2001-05-29 Ross Johnson <rpj@setup1.ise.canberra.edu.au> Contributed by - Milan Gardian <Milan.Gardian@LEIBINGER.com> * Makefile: fix typo. * pthreads.h: Fix problems with stdcall/cdecl conventions, in particular remove the need for PT_STDCALL everywhere; remove warning supression. * (errno): Fix the longstanding "inconsistent dll linkage" problem with errno; now also works with /MD debugging libs - warnings emerged when compiling pthreads library with /MD (or /MDd) compiler switch, instead of /MT (or /MTd) (i.e. when compiling pthreads using Multithreaded DLL CRT instead of Multithreaded statically linked CRT). * create.c (pthread_create): Likewise; fix typo. * private.c (ptw32_threadStart): Eliminate use of terminate() which doesn't throw exceptions. * Remove unnecessary #includes from a number of modules - [I had to #include malloc.h in implement.h for gcc - rpj]. 2001-05-29 Ross Johnson <rpj@setup1.ise.canberra.edu.au> Contributed by - Thomas Pfaff <tpfaff@gmx.net> * pthread.h (PTHREAD_MUTEX_DEFAULT): New; equivalent to PTHREAD_MUTEX_DEFAULT_NP. * (PTHREAD_MUTEX_NORMAL): Similarly. * (PTHREAD_MUTEX_ERRORCHECK): Similarly. * (PTHREAD_MUTEX_RECURSIVE): Similarly. * (pthread_mutex_setdefaultkind_np): New; Linux compatibility stub for pthread_mutexattr_settype. * (pthread_mutexattr_getkind_np): New; Linux compatibility stub for pthread_mutexattr_gettype. * mutex.c (pthread_mutexattr_settype): New; allow the following types of mutex: PTHREAD_MUTEX_DEFAULT_NP PTHREAD_MUTEX_NORMAL_NP PTHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_RECURSIVE_NP * Note that PTHREAD_MUTEX_DEFAULT is equivalent to PTHREAD_MUTEX_NORMAL - ie. mutexes should no longer be recursive by default, and a thread will deadlock if it tries to relock a mutex it already owns. This is inline with other pthreads implementations. * (pthread_mutex_lock): Process the lock request according to the mutex type. * (pthread_mutex_init): Eliminate use of Win32 mutexes as the basis of POSIX mutexes - instead, a combination of one critical section and one semaphore are used in conjunction with Win32 Interlocked* routines. * (pthread_mutex_destroy): Likewise. * (pthread_mutex_lock): Likewise. * (pthread_mutex_trylock): Likewise. * (pthread_mutex_unlock): Likewise. * Use longjmp/setjmp to implement cancelation when building the library using a C compiler which doesn't support exceptions, e.g. gcc -x c (note that gcc -x c++ uses exceptions). * Also fixed some of the same typos and eliminated PT_STDCALL as Milan Gardian's patches above. 2001-02-07 Ross Johnson <rpj@special.ise.canberra.edu.au> Contributed by - Alexander Terekhov <TEREKHOV@de.ibm.com> * rwlock.c: Revamped. * implement.h (pthread_rwlock_t_): Redefined. This implementation does not have reader/writer starvation problem. Rwlock attempts to behave more like a normal mutex with races and scheduling policy determining who is more important; It also supports recursive locking, has less synchronization overhead (no broadcasts at all, readers are not blocked on any condition variable) and seem to be faster than the current implementation [W98 appears to be approximately 15 percent faster at least - on top of speed increase from Thomas Pfaff's changes to mutex.c - rpj].
Diffstat (limited to 'nonportable.c')
-rw-r--r--nonportable.c149
1 files changed, 70 insertions, 79 deletions
diff --git a/nonportable.c b/nonportable.c
index 49548dd..e6b6995 100644
--- a/nonportable.c
+++ b/nonportable.c
@@ -27,27 +27,85 @@
#include "implement.h"
/*
- * pthread_mutexattr_setforcecs_np()
+ * pthread_mutexattr_setkind_np()
+ */
+int pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, int kind)
+{
+ return pthread_mutexattr_settype( attr, kind );
+}
+
+/*
+ * pthread_mutexattr_getkind_np()
+ */
+int pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, int *kind)
+{
+ return pthread_mutexattr_gettype( attr, kind );
+}
+
+
+/*
+ * pthread_mutex_setdefaultkind_np --
+ *
+ * Sets the default type to be given to all
+ * POSIX mutexes initialised after the function
+ * is called. Any of the following type values
+ * can be made the default type:
+ *
+ * PTHREAD_MUTEX_NORMAL
+ * PTHREAD_MUTEX_ERRORCHECK
+ * PTHREAD_MUTEX_RECURSIVE
+ * PTHREAD_MUTEX_DEFAULT
+ *
+ * Any mutex initialised with kind PTHREAD_MUTEX_DEFAULT
+ * will be set to the mapped type instead. Previously
+ * initialised mutexes are not changed.
*
- * Allows an application to force the library to use
- * critical sections rather than win32 mutexes as
- * the basis for any mutexes that use "attr".
+ * When set to PTHREAD_MUTEX_DEFAULT (the initial
+ * value), mutexes will behave as for the
+ * PTHREAD_MUTEX_RECURSIVE kind.
*
- * Values for "forcecs" are defined in pthread.h
*/
int
-pthread_mutexattr_setforcecs_np(pthread_mutexattr_t *attr,
- int forcecs)
+pthread_mutex_setdefaultkind_np (int kind )
{
- if (attr == NULL || *attr == NULL)
+ int result = 0;
+
+ switch (kind)
{
- /* This is disallowed. */
- return EINVAL;
+ case PTHREAD_MUTEX_FAST_NP:
+ case PTHREAD_MUTEX_RECURSIVE_NP:
+ case PTHREAD_MUTEX_ERRORCHECK_NP:
+ ptw32_mutex_default_kind = kind;
+ break;
+ default:
+ result = EINVAL;
}
- (*attr)->forcecs = forcecs;
+ return result;
+}
+
+/*
+ * pthread_mutex_getdefaultkind_np --
+ *
+ * Return the default kind for all mutexes
+ *
+ */
+int
+pthread_mutex_getdefaultkind_np (int *kind)
+{
+ int result = 0;
+
+ if (kind != NULL)
+ {
+ *kind = ptw32_mutex_default_kind;
+ }
- return 0;
+ else
+ {
+ result = EINVAL;
+ }
+
+ return result;
}
/*
@@ -141,75 +199,13 @@ pthread_delay_np (struct timespec * interval)
}
-/*
- * Handle to kernel32.dll
- */
-static HINSTANCE ptw32_h_kernel32;
-
-
BOOL
pthread_win32_process_attach_np ()
{
BOOL result = TRUE;
- /*
- * We use this to double-check that TryEnterCriticalSection works.
- */
- CRITICAL_SECTION cs;
-
result = ptw32_processInitialize ();
- /*
- * Load KERNEL32 and try to get address of TryEnterCriticalSection
- */
- ptw32_h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL"));
- ptw32_try_enter_critical_section = (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION))
-
-#if defined(NEED_UNICODE_CONSTS)
- GetProcAddress(ptw32_h_kernel32,
- (const TCHAR *)TEXT("TryEnterCriticalSection"));
-#else
- GetProcAddress(ptw32_h_kernel32,
- (LPCSTR) "TryEnterCriticalSection");
-#endif
-
- if (ptw32_try_enter_critical_section != NULL)
- {
- InitializeCriticalSection(&cs);
- if ((*ptw32_try_enter_critical_section)(&cs))
- {
- LeaveCriticalSection(&cs);
- }
- else
- {
- /*
- * Not really supported (Win98?).
- */
- ptw32_try_enter_critical_section = NULL;
- }
- DeleteCriticalSection(&cs);
- }
-
- if (ptw32_try_enter_critical_section == NULL)
- {
- /*
- * If TryEnterCriticalSection is not being used, then free
- * the kernel32.dll handle now, rather than leaving it until
- * DLL_PROCESS_DETACH.
- *
- * Note: this is not a pedantic exercise in freeing unused
- * resources! It is a work-around for a bug in Windows 95
- * (see microsoft knowledge base article, Q187684) which
- * does Bad Things when FreeLibrary is called within
- * the DLL_PROCESS_DETACH code, in certain situations.
- * Since w95 just happens to be a platform which does not
- * provide TryEnterCriticalSection, the bug will be
- * effortlessly avoided.
- */
- (void) FreeLibrary(ptw32_h_kernel32);
- ptw32_h_kernel32 = 0;
- }
-
return result;
}
@@ -235,11 +231,6 @@ pthread_win32_process_detach_np ()
* The DLL is being unmapped into the process's address space
*/
ptw32_processTerminate ();
-
- if (ptw32_h_kernel32)
- {
- (void) FreeLibrary(ptw32_h_kernel32);
- }
}
return TRUE;