Re: [Gc] bdwgc for RTEMS pthread support
Ivan Maidanski
ivmai at mail.ru
Tue Aug 9 02:49:49 PDT 2011
Hi Jie,
1. Send patches as attachments
2. Please add ChangeLog entres.
3. Exclude auto-generated files (like configure)
4. Fix issues given below:
08 08 2011, 19:08 Jie Liu <lj8175 at gmail.com>:
> Hi,
>
> Here is the patch for bdwgc on RTEMS with pthread support, while no
> thread support's patch has been merged.
>
> Index: configure
> ===================================================================
> RCS file: /cvsroot/bdwgc/bdwgc/configure,v
> retrieving revision 1.72
> diff -u -r1.72 configure
> --- configure 4 Jul 2011 13:29:55 -0000 1.72
> +++ configure 5 Aug 2011 06:31:43 -0000
> @@ -5293,6 +5293,11 @@
> $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
> ;;
> 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 5 Aug 2011 06:32:33 -0000
> @@ -1351,6 +1351,16 @@
> # 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)
> + {
> + printf("run in GC_get_stack_base\n");
Remove printf here or ifdef with DEBUG_... and use GC_log_printf instead.
> + 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 5 Aug 2011 06:32:36 -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 5 Aug 2011 06:32: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;
Is this really needed? see " if (GC_nprocs <= 0)" below.
> # 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 5 Aug 2011 06:33:24 -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,10 +118,13 @@
> /* 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) \
> +#if (!defined(GC_WIN32_THREADS) || defined(GC_WIN32_PTHREADS) ||
> defined(GC_RTEMS_PTHREADS)\
Split this line into 2.
> || defined(__CYGWIN32__) || defined(__CYGWIN__)) && defined(GC_THREADS)
> /* Posix threads. */
> # define GC_PTHREADS
> @@ -289,7 +295,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 5 Aug 2011 06:33:27 -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 5 Aug 2011 06:33:28 -0000
> @@ -51,6 +51,10 @@
> # define USE_PTHREAD_LOCKS
> # endif
>
> +# if defined(GC_RTEMS_PTHREADS) && defined(GC_PTHREADS)
Why do you test GC_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 5 Aug 2011 06:33:35 -0000
> @@ -1380,10 +1380,13 @@
> # include <sys/unistd.h>
> extern int etext[];
> extern int end[];
> - extern void *InitStackBottom;
> + void *rtems_get_stack_bottom();
Place "void" into ().
> +# 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 5 Aug 2011 06:33:36 -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 5 Aug 2011 06:34:44 -0000
> @@ -1462,6 +1462,9 @@
> # ifdef MSWIN32
> GC_win32_free_heap();
> # endif
> +# ifdef RTEMS
> + exit(0);
The compiler might issue an "unreachable" warning here: consider changing return type to void and removing "return".
> +# endif
> return(0);
> }
> # endif
>
>
>
> Thanks,
> Jie
More information about the Gc
mailing list