Commit f22a97d2 by Mumit Khan Committed by Mumit Khan

gthr-win32.h (__gthread_active_p): Support Mingw MT runtime.

2000-01-04  Mumit Khan  <khan@xraylith.wisc.edu>

	* gthr-win32.h (__gthread_active_p): Support Mingw MT runtime.
	(__gthread_key_create): Likewise.
 	(__gthread_key_dtor):  Likewise.
	(__gthread_once): Fix logic.
	(__gthread_key_delete): Cast away constness.

	* i386/cygwin.h (SUBTARGET_SWITCHES): Add -mthreads option.
	* invoke.texi: Document.
	* i386/mingw32.h (CPP_SPEC): Use.
	(LIBGCC_SPEC): Likewise.
	* i386/crtdll.h (LIBGCC_SPEC): Likewise.

From-SVN: r31215
parent aeecce42
2000-01-04 Mumit Khan <khan@xraylith.wisc.edu>
* gthr-win32.h (__gthread_active_p): Support Mingw MT runtime.
(__gthread_key_create): Likewise.
(__gthread_key_dtor): Likewise.
(__gthread_once): Fix logic.
(__gthread_key_delete): Cast away constness.
* i386/cygwin.h (SUBTARGET_SWITCHES): Add -mthreads option.
* invoke.texi: Document.
* i386/mingw32.h (CPP_SPEC): Use.
(LIBGCC_SPEC): Likewise.
* i386/crtdll.h (LIBGCC_SPEC): Likewise.
2000-01-04 David Edelsohn <edelsohn@gnu.org> 2000-01-04 David Edelsohn <edelsohn@gnu.org>
* rs6000/sysv4.h (ASM_OUTPUT_DEF): Undefine. * rs6000/sysv4.h (ASM_OUTPUT_DEF): Undefine.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
as distinct from winnt.h, which is used to build GCC for use with a as distinct from winnt.h, which is used to build GCC for use with a
windows style library and tool set and uses the Microsoft tools. windows style library and tool set and uses the Microsoft tools.
This variant uses CRTDLL.DLL insted of MSVCRTDLL.DLL. This variant uses CRTDLL.DLL insted of MSVCRTDLL.DLL.
Copyright (C) 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -32,7 +32,8 @@ Boston, MA 02111-1307, USA. */ ...@@ -32,7 +32,8 @@ Boston, MA 02111-1307, USA. */
-Asystem(winnt) -Acpu(i386) -Amachine(i386)" -Asystem(winnt) -Acpu(i386) -Amachine(i386)"
#undef LIBGCC_SPEC #undef LIBGCC_SPEC
#define LIBGCC_SPEC "-lmingw32 -lgcc -lmoldname -lcrtdll" #define LIBGCC_SPEC \
"%{mthreads:-lmingwthrd} -lmingw32 -lgcc -lmoldname -lcrtdll"
/* Specify a different entry point when linking a DLL */ /* Specify a different entry point when linking a DLL */
#undef STARTFILE_SPEC #undef STARTFILE_SPEC
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
hosting on Windows NT 3.x, using a Unix style C library and tools, hosting on Windows NT 3.x, using a Unix style C library and tools,
as distinct from winnt.h, which is used to build GCC for use with a as distinct from winnt.h, which is used to build GCC for use with a
windows style library and tool set and uses the Microsoft tools. windows style library and tool set and uses the Microsoft tools.
Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1995-2000 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -51,7 +51,8 @@ Boston, MA 02111-1307, USA. */ ...@@ -51,7 +51,8 @@ Boston, MA 02111-1307, USA. */
{ "console", -MASK_WINDOWS, "Create console application" }, \ { "console", -MASK_WINDOWS, "Create console application" }, \
{ "dll", MASK_DLL, "Generate code for a DLL" }, \ { "dll", MASK_DLL, "Generate code for a DLL" }, \
{ "nop-fun-dllimport", MASK_NOP_FUN_DLLIMPORT, "Ignore dllimport for functions" }, \ { "nop-fun-dllimport", MASK_NOP_FUN_DLLIMPORT, "Ignore dllimport for functions" }, \
{ "no-nop-fun-dllimport", -MASK_NOP_FUN_DLLIMPORT, "" }, { "no-nop-fun-dllimport", -MASK_NOP_FUN_DLLIMPORT, "" }, \
{ "threads", 0, "Use Mingw-specific thread support" },
/* Support the __declspec keyword by turning them into attributes. /* Support the __declspec keyword by turning them into attributes.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
hosting on Windows32, using GNU tools and the Windows32 API Library, hosting on Windows32, using GNU tools and the Windows32 API Library,
as distinct from winnt.h, which is used to build GCC for use with a as distinct from winnt.h, which is used to build GCC for use with a
windows style library and tool set and uses the Microsoft tools. windows style library and tool set and uses the Microsoft tools.
Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1997-2000 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -45,7 +45,8 @@ Boston, MA 02111-1307, USA. */ ...@@ -45,7 +45,8 @@ Boston, MA 02111-1307, USA. */
#define STANDARD_INCLUDE_COMPONENT "MINGW32" #define STANDARD_INCLUDE_COMPONENT "MINGW32"
#undef CPP_SPEC #undef CPP_SPEC
#define CPP_SPEC "-remap %(cpp_cpu) %{posix:-D_POSIX_SOURCE}" #define CPP_SPEC \
"-remap %(cpp_cpu) %{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}"
/* For Windows applications, include more libraries, but always include /* For Windows applications, include more libraries, but always include
kernel32. */ kernel32. */
...@@ -55,7 +56,8 @@ Boston, MA 02111-1307, USA. */ ...@@ -55,7 +56,8 @@ Boston, MA 02111-1307, USA. */
/* Include in the mingw32 libraries with libgcc */ /* Include in the mingw32 libraries with libgcc */
#undef LIBGCC_SPEC #undef LIBGCC_SPEC
#define LIBGCC_SPEC "-lmingw32 -lgcc -lmoldname -lmsvcrt" #define LIBGCC_SPEC \
"%{mthreads:-lmingwthrd} -lmingw32 -lgcc -lmoldname -lmsvcrt"
#undef STARTFILE_SPEC #undef STARTFILE_SPEC
#define STARTFILE_SPEC "%{mdll:dllcrt2%O%s} %{!mdll:crt2%O%s} %{pg:gcrt2%O%s}" #define STARTFILE_SPEC "%{mdll:dllcrt2%O%s} %{!mdll:crt2%O%s} %{pg:gcrt2%O%s}"
......
/* Threads compatibily routines for libgcc2. */ /* Threads compatibily routines for libgcc2. */
/* Compile this one with gcc. */ /* Compile this one with gcc. */
/* Copyright (C) 1999 Free Software Foundation, Inc. /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Contributed by Mumit Khan <khan@xraylith.wisc.edu>. Contributed by Mumit Khan <khan@xraylith.wisc.edu>.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -34,23 +34,41 @@ Boston, MA 02111-1307, USA. */ ...@@ -34,23 +34,41 @@ Boston, MA 02111-1307, USA. */
does not map well into pthread-inspired gcc's threading model, and so does not map well into pthread-inspired gcc's threading model, and so
there are caveats one needs to be aware of. there are caveats one needs to be aware of.
1. The destructor supplied to __gthread_key_create is ignored. This 1. The destructor supplied to __gthread_key_create is ignored for
will certainly cause memory leaks due to unreclaimed eh contexts generic x86-win32 ports. This will certainly cause memory leaks
(sizeof (eh_context) is at least 24 bytes for x86 currently). due to unreclaimed eh contexts (sizeof (eh_context) is at least
24 bytes for x86 currently).
This memory leak may be significant for long-running applications This memory leak may be significant for long-running applications
that make heavy use of C++ EH. that make heavy use of C++ EH.
However, Mingw runtime (version 0.3 or newer) provides a mechanism
to emulate pthreads key dtors; the runtime provides a special DLL,
linked in if -mthreads option is specified, that runs the dtors in
the reverse order of registration when each thread exits. If
-mthreads option is not given, a stub is linked in instead of the
DLL, which results in memory leak. Other x86-win32 ports can use
the same technique of course to avoid the leak.
2. The error codes returned are non-POSIX like, and cast into ints. 2. The error codes returned are non-POSIX like, and cast into ints.
This may cause incorrect error return due to truncation values on This may cause incorrect error return due to truncation values on
hw where sizeof (DWORD) > sizeof (int). hw where sizeof (DWORD) > sizeof (int).
3. We might consider using Critical Sections instead of Windows32
mutexes for better performance, but emulating __gthread_mutex_trylock
interface becomes more complicated (Win9x does not support
TryEnterCriticalSectioni, while NT does).
The basic framework should work well enough. */ The basic framework should work well enough. In the long term, GCC
needs to use Structured Exception Handling on Windows32. */
#define __GTHREADS 1 #define __GTHREADS 1
#include <windows.h> #include <windows.h>
#include <errno.h> #include <errno.h>
#ifdef __MINGW32__
#include <_mingw.h>
#endif
typedef DWORD __gthread_key_t; typedef DWORD __gthread_key_t;
...@@ -64,10 +82,24 @@ typedef HANDLE __gthread_mutex_t; ...@@ -64,10 +82,24 @@ typedef HANDLE __gthread_mutex_t;
#define __GTHREAD_ONCE_INIT {FALSE, -1} #define __GTHREAD_ONCE_INIT {FALSE, -1}
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
#if __MINGW32_MAJOR_VERSION >= 1 || \
(__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2)
#define MINGW32_SUPPORTS_MT_EH 1
extern int __mingwthr_key_dtor PROTO((DWORD, void (*) (void *)));
/* Mingw runtime >= v0.3 provides a magic variable that is set to non-zero
if -mthreads option was specified, or 0 otherwise. This is to get around
the lack of weak symbols in PE-COFF. */
extern int _CRT_MT;
#endif
static inline int static inline int
__gthread_active_p () __gthread_active_p ()
{ {
#ifdef MINGW32_SUPPORTS_MT_EH
return _CRT_MT;
#else
return 1; return 1;
#endif
} }
static inline int static inline int
...@@ -85,48 +117,52 @@ __gthread_once (__gthread_once_t *once, void (*func) ()) ...@@ -85,48 +117,52 @@ __gthread_once (__gthread_once_t *once, void (*func) ())
(*func) (); (*func) ();
once->done = TRUE; once->done = TRUE;
} }
} else
else {
{ /* Another thread is currently executing the code, so wait for it
/* Another thread is currently executing the code, so wait for it to to finish; yield the CPU in the meantime. If performance
finish; yield the CPU in the meantime. */ does become an issue, the solution is to use an Event that
while (! once->done) we wait on here (and set above), but that implies a place to
Sleep (0); create the event before this routine is called. */
while (! once->done)
Sleep (0);
}
} }
return 0; return 0;
} }
/* Windows32 thread local keys don't support destructors; to avoid leaks, /* Windows32 thread local keys don't support destructors; this leads to
we will have to figure something out in the future. */ leaks, especially in threaded applications making extensive use of
C++ EH. Mingw uses a thread-support DLL to work-around this problem. */
static inline int static inline int
__gthread_key_create (__gthread_key_t *key, __gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
void (*dtor) (void *) __attribute__((__unused__)))
{ {
int status = 0; int status = 0;
DWORD tls_index = TlsAlloc (); DWORD tls_index = TlsAlloc ();
if (tls_index != 0xFFFFFFFF) if (tls_index != 0xFFFFFFFF)
*key = tls_index; {
*key = tls_index;
#ifdef MINGW32_SUPPORTS_MT_EH
/* Mingw runtime will run the dtors in reverse order for each thread
when the thread exits. */
status = __mingwthr_key_dtor (*key, dtor);
#endif
}
else else
status = (int) GetLastError (); status = (int) GetLastError ();
return status; return status;
} }
/* Currently, this routine is never called since win32 keys don't support /* Currently, this routine is called only for Mingw runtime, and if
destructors. Hopefully we'll find a way in the future. */ -mthreads option is chosen to link in the thread support DLL. */
static inline int static inline int
__gthread_key_dtor (__gthread_key_t key, void *ptr) __gthread_key_dtor (__gthread_key_t key, void *ptr)
{ {
int status = 0; /* Nothing needed. */
return 0;
/* Just reset the key value to zero. */
if (ptr)
status = (TlsSetValue (key, 0) != 0) ? 0 : (int) GetLastError ();
return status;
} }
/* Currently, this routine is never called since win32 keys don't support
destructors. Hopefully we'll find a way in the future. */
static inline int static inline int
__gthread_key_delete (__gthread_key_t key) __gthread_key_delete (__gthread_key_t key)
{ {
...@@ -142,7 +178,7 @@ __gthread_getspecific (__gthread_key_t key) ...@@ -142,7 +178,7 @@ __gthread_getspecific (__gthread_key_t key)
static inline int static inline int
__gthread_setspecific (__gthread_key_t key, const void *ptr) __gthread_setspecific (__gthread_key_t key, const void *ptr)
{ {
return (TlsSetValue (key, ptr) != 0) ? 0 : (int) GetLastError (); return (TlsSetValue (key, (void*) ptr) != 0) ? 0 : (int) GetLastError ();
} }
static inline void static inline void
......
@c Copyright (C) 1988, 89, 92-98, 1999 Free Software Foundation, Inc. @c Copyright (C) 1988, 89, 92-99, 2000 Free Software Foundation, Inc.
@c This is part of the GCC manual. @c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi. @c For copying conditions, see the file gcc.texi.
...@@ -360,6 +360,7 @@ in the following sections. ...@@ -360,6 +360,7 @@ in the following sections.
-mreg-alloc=@var{list} -mregparm=@var{num} -mreg-alloc=@var{list} -mregparm=@var{num}
-malign-jumps=@var{num} -malign-loops=@var{num} -malign-jumps=@var{num} -malign-loops=@var{num}
-malign-functions=@var{num} -mpreferred-stack-boundary=@var{num} -malign-functions=@var{num} -mpreferred-stack-boundary=@var{num}
-mthreads
@emph{HPPA Options} @emph{HPPA Options}
-march=@var{architecture type} -march=@var{architecture type}
...@@ -5945,6 +5946,14 @@ This extra alignment does consume extra stack space. Code that is sensitive ...@@ -5945,6 +5946,14 @@ This extra alignment does consume extra stack space. Code that is sensitive
to stack space usage, such as embedded systems and operating system kernels, to stack space usage, such as embedded systems and operating system kernels,
may want to reduce the preferred alignment to may want to reduce the preferred alignment to
@samp{-mpreferred-stack-boundary=2}. @samp{-mpreferred-stack-boundary=2}.
@item -mthreads
@kindex -mthreads
Support thread-safe exception handling on @samp{Mingw32}. Code that relies
on thread-safe exception handling must compile and link all code with the
@samp{-mthreads} option. When compiling, @samp{-mthreads} defines
@samp{-D_MT}; when linking, it links in a special thread helper library
@samp{-lmingwthrd} which cleans up per thread exception handling data.
@end table @end table
@node HPPA Options @node HPPA Options
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment