Index: ChangeLog
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/ChangeLog,v
retrieving revision 1.540
diff -u -r1.540 ChangeLog
--- ChangeLog	14 Jul 2011 13:43:13 -0000	1.540
+++ ChangeLog	9 Aug 2011 15:26:09 -0000
@@ -1,3 +1,25 @@
+2011-08-09  Jie Liu <lj8175@gmail.com>
+
+	* 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: Exclued sys/mman.h for rtems.
+	* pthread_support.c (GC_thr_init): Set default GC_nprocs 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(void)
+	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 while return(0) for
+	others.
+
 2011-07-14  Ivan Maidanski <ivmai@mail.ru>
 
 	* new_hblk.c (GC_build_fl): Adjust "h" local variable cast type
Index: configure.ac
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/configure.ac,v
retrieving revision 1.69
diff -u -r1.69 configure.ac
--- configure.ac	4 Jul 2011 13:29:55 -0000	1.69
+++ configure.ac	9 Aug 2011 15:27:06 -0000
@@ -93,6 +93,7 @@
 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 @@
     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)
     ;;
Index: os_dep.c
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/os_dep.c,v
retrieving revision 1.125
diff -u -r1.125 os_dep.c
--- os_dep.c	5 Jul 2011 17:53:24 -0000	1.125
+++ os_dep.c	9 Aug 2011 15:27:37 -0000
@@ -1351,6 +1351,15 @@
 # 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.                          */
Index: pthread_stop_world.c
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/pthread_stop_world.c,v
retrieving revision 1.40
diff -u -r1.40 pthread_stop_world.c
--- pthread_stop_world.c	16 May 2011 13:12:14 -0000	1.40
+++ pthread_stop_world.c	9 Aug 2011 15:27:38 -0000
@@ -816,7 +816,11 @@
         ABORT("sem_init failed");
 #   endif
 
+#   ifdef SA_RESTART
     act.sa_flags = SA_RESTART
+#   else
+    act.sa_flags = 0
+#   endif
 #   ifdef SA_SIGINFO
         | SA_SIGINFO
 #   endif
@@ -824,6 +828,11 @@
     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\n");
+    }
+#   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.            */
Index: pthread_support.c
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/pthread_support.c,v
retrieving revision 1.101
diff -u -r1.101 pthread_support.c
--- pthread_support.c	5 Jul 2011 17:53:24 -0000	1.101
+++ pthread_support.c	9 Aug 2011 15:27:40 -0000
@@ -52,7 +52,9 @@
 # include <time.h>
 # include <errno.h>
 # include <unistd.h>
+#if !defined(GC_RTEMS_PTHREADS)
 # include <sys/mman.h>
+#endif
 # include <sys/time.h>
 # include <sys/types.h>
 # include <sys/stat.h>
@@ -953,6 +955,8 @@
       GC_nprocs = get_ncpu();
 #   elif defined(GC_LINUX_THREADS) || defined(GC_DGUX386_THREADS)
       GC_nprocs = GC_get_nprocs();
+#   elif defined(GC_RTEMS_PTHREADS)
+      if (GC_nprocs <= 0) GC_nprocs = 1;
 #   endif
   }
   if (GC_nprocs <= 0) {
Index: include/gc_config_macros.h
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/include/gc_config_macros.h,v
retrieving revision 1.25
diff -u -r1.25 gc_config_macros.h
--- include/gc_config_macros.h	24 Apr 2011 13:09:21 -0000	1.25
+++ include/gc_config_macros.h	9 Aug 2011 15:28:13 -0000
@@ -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
Index: include/private/config.h.in
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/include/private/config.h.in,v
retrieving revision 1.9
diff -u -r1.9 config.h.in
--- include/private/config.h.in	4 Jul 2011 13:29:55 -0000	1.9
+++ include/private/config.h.in	9 Aug 2011 15:28:18 -0000
@@ -87,6 +87,9 @@
 /* Define to support Win32 threads. */
 #undef GC_WIN32_THREADS
 
+/* Define to support RTEMS pthreads. */
+#undef GC_RTEMS_PTHREADS
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
Index: include/private/gc_locks.h
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/include/private/gc_locks.h,v
retrieving revision 1.26
diff -u -r1.26 gc_locks.h
--- include/private/gc_locks.h	4 Jul 2011 13:29:55 -0000	1.26
+++ include/private/gc_locks.h	9 Aug 2011 15:28:19 -0000
@@ -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
Index: include/private/gcconfig.h
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/include/private/gcconfig.h,v
retrieving revision 1.95
diff -u -r1.95 gcconfig.h
--- include/private/gcconfig.h	4 Jul 2011 14:56:16 -0000	1.95
+++ include/private/gcconfig.h	9 Aug 2011 15:28:35 -0000
@@ -1380,10 +1380,13 @@
 #       include <sys/unistd.h>
         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"
Index: include/private/thread_local_alloc.h
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/include/private/thread_local_alloc.h,v
retrieving revision 1.22
diff -u -r1.22 thread_local_alloc.h
--- include/private/thread_local_alloc.h	13 May 2011 14:40:31 -0000	1.22
+++ include/private/thread_local_alloc.h	9 Aug 2011 15:28:35 -0000
@@ -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__
Index: tests/test.c
===================================================================
RCS file: /cvsroot/bdwgc/bdwgc/tests/test.c,v
retrieving revision 1.63
diff -u -r1.63 test.c
--- tests/test.c	14 Jul 2011 13:43:13 -0000	1.63
+++ tests/test.c	9 Aug 2011 15:34:44 -0000
@@ -1462,7 +1462,11 @@
 #   ifdef MSWIN32
       GC_win32_free_heap();
 #   endif
-    return(0);
+#   ifdef RTEMS
+      exit(0);
+#   else
+      return(0);
+#   endif
 }
 # endif
 
