[RFA/GC] redefine thread suspension interface for all platforms
Keith Seitz
keiths@redhat.com
Tue Jul 18 19:11:00 GMT 2006
[pardon the top post]
Ping.
If anyone has a system other than x86 linux, powerpc darwin, or x86
cygwin an can test this patch (it doesn't take much time to rebuild
boehm-gc and libjava), I would be very, very grateful...
Keith
Keith Seitz wrote:
> Hi,
>
> After last week's build debacle, I've decided to "do it right", or at
> least what I think is right. I should know better than to resort to
> conditionally including code.
>
> Therefore, I would like to redefine the current suspension interface
> from this mess:
>
> #if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) \
> && !defined(GC_WIN32_THREADS) && !defined(GC_DARWIN_THREADS)
> GC_API void GC_suspend_thread GC_PROTO((pthread_t));
> GC_API void GC_resume_thread GC_PROTO((pthread_t));
> #endif
>
> to the more readable/maintainable:
>
> GC_API void GC_suspend_thread GC_PROTO((GC_thread_t));
> GC_API void GC_resume_thread GC_PROTO((GC_thread_t));
>
> Where GC_thread_t is defined appropriately for every platform. On
> platforms where the functions are unimplemented (anything but posix
> threads right now), the functions will call ABORT with an appropriate
> message.
>
> There are lots of different ways to do this, but I find this the least
> offensive of the solutions I've pondered. There seems little sense in
> submitting this to the GC list since no decision has been officially
> made on the existence of GC_suspend/resume_thread yet.
>
> I have tested this on x86 linux, powerpc-darwin, and x86 cygwin.
> Nonetheless, the giant ifdef in gc.h will, I'm sure, not be complete (or
> necessarily correct). I would appreciate it if those-in-the-know would
> pay special attention to this.
>
> Keith
>
> ChangeLog
> 2006-07-06 Keith Seitz <keiths@redhat.com>
>
> * include/gc.h (GC_thread_t): Define.
> (GC_suspend_thread): Define for all platforms.
> (GC_resume_thread): Likewise.
> * darwin_stop_world.c (GC_suspend_thread): New function.
> (GC_resume_thread): New function.
> * pthread_stop_world.c (GC_suspend_thread): New function.
> (GC_resume_thread): New function.
> * solaris_threads.c (GC_suspend_thread): New function.
> (GC_resume_thread): New function.
> * win32_threads.c (GC_suspend_thread): New function.
> (GC_resume_thread): New function.
>
>
>
> ------------------------------------------------------------------------
>
> Index: include/gc.h
> ===================================================================
> --- include/gc.h (revision 115072)
> +++ include/gc.h (working copy)
> @@ -1036,18 +1036,35 @@
> # include "gc_local_alloc.h"
> #endif
>
> + /* External thread suspension support. These functions do not
> + * implement suspension counts or any other higher-level abstraction.
> + * Threads which have been suspended numerous times will resume with
> + * the very first call to GC_resume_thread.
> + */
> +#if defined(GC_DARWIN_THREADS)
> + typedef thread_act_t GC_thread_t;
> +#elif defined(GC_SOLARIS_PTHREADS)
> + typedef pthread_t GC_thread_t;
> +#elif defined(GC_SOLARIS_THREADS)
> + typedef thread_t GC_thread_t;
> +#elif defined(GC_WIN32_THREADS)
> +# ifdef __CYGWIN32__
> + typedef pthread_t GC_thread_t;
> +# else
> + typedef DWORD GC_thread_t;
> +# endif
> +#else
> +# ifdef __CYGWIN32__
> +# include <pthread.h>
> +# endif
> + typedef pthread_t GC_thread_t;
> +#endif
> +
> + GC_API void GC_suspend_thread GC_PROTO((GC_thread_t));
> + GC_API void GC_resume_thread GC_PROTO((GC_thread_t));
> +
> #ifdef __cplusplus
> } /* end of extern "C" */
> #endif
>
> -/* External thread suspension support. These functions do not implement
> - * suspension counts or any other higher-level abstraction. Threads which
> - * have been suspended numerous times will resume with the very first call
> - * to GC_resume_thread.
> - */
> -#if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) \
> - && !defined(GC_WIN32_THREADS) && !defined(GC_DARWIN_THREADS)
> -GC_API void GC_suspend_thread GC_PROTO((pthread_t));
> -GC_API void GC_resume_thread GC_PROTO((pthread_t));
> -#endif
> #endif /* _GC_H */
> Index: darwin_stop_world.c
> ===================================================================
> --- darwin_stop_world.c (revision 115072)
> +++ darwin_stop_world.c (working copy)
> @@ -503,4 +503,11 @@
> GC_use_mach_handler_thread = 1;
> }
>
> +void GC_suspend_thread(GC_thread_t thread) {
> + ABORT("GC_suspend_thread not implemented");
> +}
> +
> +void GC_resume_thread(GC_thread_t thread) {
> + ABORT("GC_resume_thread not implemented");
> +}
> #endif
> Index: pthread_stop_world.c
> ===================================================================
> --- pthread_stop_world.c (revision 115072)
> +++ pthread_stop_world.c (working copy)
> @@ -454,7 +454,8 @@
> GC_end_blocking();
> }
>
> -void GC_suspend_thread(pthread_t thread) {
> +void GC_suspend_thread(GC_thread_t thr) {
> + pthread_t thread = (pthread_t) thr;
> if (thread == pthread_self())
> suspend_self();
> else {
> @@ -475,8 +476,8 @@
> }
> }
>
> -void GC_resume_thread(pthread_t thread) {
> - GC_thread t = GC_lookup_thread(thread);
> +void GC_resume_thread(GC_thread_t thread) {
> + GC_thread t = GC_lookup_thread((pthread_t) thread);
> if (t == NULL)
> ABORT("attempting to resume unknown thread");
>
> Index: solaris_threads.c
> ===================================================================
> --- solaris_threads.c (revision 115072)
> +++ solaris_threads.c (working copy)
> @@ -951,6 +951,14 @@
> return(result);
> }
>
> +void GC_suspend_thread(GC_thread_t thread) {
> + ABORT("GC_suspend_thread not implemented");
> +}
> +
> +void GC_resume_thread(GC_thread_t thread) {
> + ABORT("GC_resume_thread not implemented");
> +}
> +
> # else /* !GC_SOLARIS_THREADS */
>
> #ifndef LINT
> Index: win32_threads.c
> ===================================================================
> --- win32_threads.c (revision 115072)
> +++ win32_threads.c (working copy)
> @@ -522,6 +522,14 @@
>
> #endif /* !CYGWIN32 */
>
> +void GC_suspend_thread(GC_thread_t thread) {
> + ABORT("GC_suspend_thread not implemented");
> +}
> +
> +void GC_resume_thread(GC_thread_t thread) {
> + ABORT("GC_resume_thread not implemented");
> +}
> +
> #ifdef MSWINCE
>
> typedef struct {
More information about the Java-patches
mailing list