From 0539e08bb47d310c01bbb35354954436157110d0 Mon Sep 17 00:00:00 2001 From: Jie Liu Date: Fri, 9 Sep 2011 18:21:49 +0400 Subject: [PATCH] Support multi-threading for RTEMS target. (Apply commit e773036) * configure.ac: Add GC_RTEMS_PTHREADS AH_TEMPLATE and configure for rtems. * os_dep.c: Add GC_get_stack_base if GC_RTEMS_PTHREADS for rtems. * pthread_stop_world.c (GC_stop_init): Add ifdef SA_RESTART. * pthread_stop_world.c (GC_stop_init): Use sigprocmask for rtems when defined GC_RTEMS_PTHREADS. * pthread_support.c: Exclude sys/mman.h for rtems. * pthread_support.c (GC_thr_init): Set default GC_nprocs (1) for rtems. * include/gc_config_macros.h: Define GC_RTEMS_PTHREADS for rtems pthread and define GC_NO_DLOPEN for rtems. * include/private/gc_locks.h: Define USE_PTHREAD_LOCKS for rtems. * include/private/gcconfig.h: Use rtems_get_stack_bottom() for InitStackBottom; and use SIGUSR1 for SIG_SUSPEND, SIGUSR2 for SIG_THR_RESTART on rtems. * include/private/thread_local_alloc.h: Use USE_PTHREAD_SPECIFIC for rtems. * tests/test.c (Init): Use exit(0) for rtems instead of return. * configure: Regenerate. * include/private/config.h.in: Ditto. --- ChangeLog | 23 +++++++++++++++++++++++ configure | 8 ++++++++ configure.ac | 6 ++++++ include/gc_config_macros.h | 14 +++++++++++--- include/private/config.h.in | 3 +++ include/private/gc_locks.h | 4 ++++ include/private/gcconfig.h | 5 ++++- include/private/thread_local_alloc.h | 2 +- os_dep.c | 9 +++++++++ pthread_stop_world.c | 13 +++++++++++-- pthread_support.c | 6 +++++- tests/test.c | 6 +++++- 12 files changed, 90 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index a96ab000..9021db94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2011-08-09 Ivan Maidanski (really Jie Liu) + + * configure.ac: Add GC_RTEMS_PTHREADS AH_TEMPLATE and configure + for rtems. + * os_dep.c: Add GC_get_stack_base if GC_RTEMS_PTHREADS for rtems. + * pthread_stop_world.c (GC_stop_init): Add ifdef SA_RESTART. + * pthread_stop_world.c (GC_stop_init): Use sigprocmask for rtems + when defined GC_RTEMS_PTHREADS. + * pthread_support.c: Exclude sys/mman.h for rtems. + * pthread_support.c (GC_thr_init): Set default GC_nprocs (1) for + rtems. + * include/gc_config_macros.h: Define GC_RTEMS_PTHREADS for rtems + pthread and define GC_NO_DLOPEN for rtems. + * include/private/gc_locks.h: Define USE_PTHREAD_LOCKS for rtems. + * include/private/gcconfig.h: Use rtems_get_stack_bottom() + for InitStackBottom; and use SIGUSR1 for SIG_SUSPEND, SIGUSR2 + for SIG_THR_RESTART on rtems. + * include/private/thread_local_alloc.h: Use USE_PTHREAD_SPECIFIC + for rtems. + * tests/test.c (Init): Use exit(0) for rtems instead of return. + * configure: Regenerate. + * include/private/config.h.in: Ditto. + 2011-07-26 Ivan Maidanski * tests/realloc_test.c: New file. diff --git a/configure b/configure index 7f975b40..dab24e1f 100755 --- a/configure +++ b/configure @@ -4968,6 +4968,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 @@ -5292,6 +5293,13 @@ $as_echo "#define DGUX_THREADS 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h + ;; + rtems) + THREADS=posix + $as_echo "#define GC_RTEMS_PTHREADS 1" >>confdefs.h + + $as_echo "#define THREAD_LOCAL_ALLOC 1" >>confdefs.h + ;; decosf1 | irix | mach | os2 | solaris | dce | vxworks) as_fn_error $? "thread package $THREADS not yet supported" "$LINENO" 5 diff --git a/configure.ac b/configure.ac index f25d0216..d0d6e3fc 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,7 @@ AH_TEMPLATE([GC_OSF1_THREADS], [Define to support Tru64 pthreads.]) AH_TEMPLATE([GC_SOLARIS_THREADS], [Define to support Solaris pthreads.]) AH_TEMPLATE([GC_WIN32_THREADS], [Define to support Win32 threads.]) AH_TEMPLATE([GC_WIN32_PTHREADS], [Define to support win32-pthreads.]) +AH_TEMPLATE([GC_RTEMS_PTHREADS], [Define to support rtems-pthreads.]) dnl System header feature requests. AH_TEMPLATE([_POSIX_C_SOURCE], [The POSIX feature macro.]) @@ -280,6 +281,11 @@ case "$THREADS" in AC_DEFINE(GC_AIX_THREADS) AC_DEFINE(_REENTRANT) ;; + rtems) + THREADS=posix + AC_DEFINE(GC_RTEMS_PTHREADS) + AC_DEFINE(THREAD_LOCAL_ALLOC) + ;; decosf1 | irix | mach | os2 | solaris | dce | vxworks) AC_MSG_ERROR(thread package $THREADS not yet supported) ;; diff --git a/include/gc_config_macros.h b/include/gc_config_macros.h index a27f8dd7..73db584f 100644 --- a/include/gc_config_macros.h +++ b/include/gc_config_macros.h @@ -50,6 +50,9 @@ #if defined(WIN32_THREADS) # define GC_WIN32_THREADS #endif +#if defined(RTEMS_THREADS) +# define GC_RTEMS_PTHREADS +#endif #if defined(USE_LD_WRAP) # define GC_USE_LD_WRAP #endif @@ -65,7 +68,7 @@ || defined(GC_IRIX_THREADS) || defined(GC_LINUX_THREADS) \ || defined(GC_NETBSD_THREADS) || defined(GC_OPENBSD_THREADS) \ || defined(GC_OSF1_THREADS) || defined(GC_SOLARIS_THREADS) \ - || defined(GC_WIN32_THREADS) + || defined(GC_WIN32_THREADS) || defined(GC_RTEMS_PTHREADS) # ifndef GC_THREADS # define GC_THREADS # endif @@ -115,11 +118,15 @@ /* Either posix or native Win32 threads. */ # define GC_WIN32_THREADS # endif +# if defined(__rtems__) && (defined(i386) || defined(__i386__)) +# define GC_RTEMS_PTHREADS +# endif #endif /* GC_THREADS */ #undef GC_PTHREADS #if (!defined(GC_WIN32_THREADS) || defined(GC_WIN32_PTHREADS) \ - || defined(__CYGWIN32__) || defined(__CYGWIN__)) && defined(GC_THREADS) + || defined(GC_RTEMS_PTHREADS) || defined(__CYGWIN32__) \ + || defined(__CYGWIN__)) && defined(GC_THREADS) /* Posix threads. */ # define GC_PTHREADS #endif @@ -289,7 +296,8 @@ #ifdef GC_PTHREADS # if (defined(GC_DARWIN_THREADS) || defined(GC_WIN32_PTHREADS) \ - || defined(__native_client__)) && !defined(GC_NO_DLOPEN) + || defined(__native_client__) || defined(GC_RTEMS_PTHREADS)) \ + && !defined(GC_NO_DLOPEN) /* Either there is no dlopen() or we do not need to intercept it. */ # define GC_NO_DLOPEN # endif diff --git a/include/private/config.h.in b/include/private/config.h.in index a14c0f34..50b2004c 100644 --- a/include/private/config.h.in +++ b/include/private/config.h.in @@ -66,6 +66,9 @@ /* Define to support Tru64 pthreads. */ #undef GC_OSF1_THREADS +/* Define to support rtems-pthreads. */ +#undef GC_RTEMS_PTHREADS + /* Define to support Solaris pthreads. */ #undef GC_SOLARIS_THREADS diff --git a/include/private/gc_locks.h b/include/private/gc_locks.h index 113b4aea..a5d9c35f 100644 --- a/include/private/gc_locks.h +++ b/include/private/gc_locks.h @@ -51,6 +51,10 @@ # define USE_PTHREAD_LOCKS # endif +# if defined(GC_RTEMS_PTHREADS) +# define USE_PTHREAD_LOCKS +# endif + # if defined(GC_WIN32_THREADS) && !defined(USE_PTHREAD_LOCKS) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h index a3600f11..553f4087 100644 --- a/include/private/gcconfig.h +++ b/include/private/gcconfig.h @@ -1380,10 +1380,13 @@ # include extern int etext[]; extern int end[]; - extern void *InitStackBottom; + void *rtems_get_stack_bottom(void); +# define InitStackBottom rtems_get_stack_bottom() # define DATASTART ((ptr_t)etext) # define DATAEND ((ptr_t)end) # define STACKBOTTOM ((ptr_t)InitStackBottom) +# define SIG_SUSPEND SIGUSR1 +# define SIG_THR_RESTART SIGUSR2 # endif # ifdef DOS4GW # define OS_TYPE "DOS4GW" diff --git a/include/private/thread_local_alloc.h b/include/private/thread_local_alloc.h index 55d8fd6e..68d6d88b 100644 --- a/include/private/thread_local_alloc.h +++ b/include/private/thread_local_alloc.h @@ -47,7 +47,7 @@ # define USE_COMPILER_TLS # elif defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) \ || defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS) \ - || defined(GC_NETBSD_THREADS) + || defined(GC_NETBSD_THREADS) || defined(GC_RTEMS_PTHREADS) # define USE_PTHREAD_SPECIFIC # elif defined(GC_HPUX_THREADS) # ifdef __GNUC__ diff --git a/os_dep.c b/os_dep.c index 2d73340a..3cc6fff4 100644 --- a/os_dep.c +++ b/os_dep.c @@ -1351,6 +1351,15 @@ GC_INNER word GC_page_size = 0; # define HAVE_GET_STACK_BASE #endif /* GC_SOLARIS_THREADS */ +#ifdef GC_RTEMS_PTHREADS + GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb) + { + sb->mem_base = rtems_get_stack_bottom(); + return GC_SUCCESS; + } +# define HAVE_GET_STACK_BASE +#endif /* GC_RTEMS_PTHREADS */ + #ifndef HAVE_GET_STACK_BASE /* Retrieve stack base. */ /* Using the GC_find_limit version is risky. */ diff --git a/pthread_stop_world.c b/pthread_stop_world.c index 9302f93f..fa4e4d5f 100644 --- a/pthread_stop_world.c +++ b/pthread_stop_world.c @@ -816,14 +816,23 @@ GC_INNER void GC_stop_init(void) ABORT("sem_init failed"); # endif - act.sa_flags = SA_RESTART +# ifdef SA_RESTART + act.sa_flags = SA_RESTART +# else + act.sa_flags = 0 +# endif # ifdef SA_SIGINFO - | SA_SIGINFO + | SA_SIGINFO # endif ; if (sigfillset(&act.sa_mask) != 0) { ABORT("sigfillset() failed"); } +# ifdef GC_RTEMS_PTHREADS + if(sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL) != 0) { + ABORT("rtems sigprocmask() failed"); + } +# endif GC_remove_allowed_signals(&act.sa_mask); /* SIG_THR_RESTART is set in the resulting mask. */ /* It is unmasked by the handler when necessary. */ diff --git a/pthread_support.c b/pthread_support.c index bcdfebd1..87317755 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -52,7 +52,9 @@ # include # include # include -# include +# if !defined(GC_RTEMS_PTHREADS) +# include +# endif # include # include # include @@ -953,6 +955,8 @@ GC_INNER void GC_thr_init(void) GC_nprocs = get_ncpu(); # elif defined(GC_LINUX_THREADS) || defined(GC_DGUX386_THREADS) GC_nprocs = GC_get_nprocs(); +# elif defined(GC_RTEMS_PTHREADS) + GC_nprocs = 1; /* not implemented */ # endif } if (GC_nprocs <= 0) { diff --git a/tests/test.c b/tests/test.c index fa2eda17..2800308b 100644 --- a/tests/test.c +++ b/tests/test.c @@ -1462,7 +1462,11 @@ void GC_CALLBACK warn_proc(char *msg, GC_word p) # ifdef MSWIN32 GC_win32_free_heap(); # endif - return(0); +# ifdef RTEMS + exit(0); +# else + return(0); +# endif } # endif -- 2.40.0