[Mono-dev] NetBSD patches

Paolo Molaro lupus at ximian.com
Mon Jan 29 13:01:45 EST 2007


On 01/29/07 kangaroo wrote:
> I'm obviously having a difficult morning with this.

> Index: libgc/configure.in
> ===================================================================
> --- libgc/configure.in	(revision 71807)
> +++ libgc/configure.in	(working copy)
> @@ -151,6 +151,14 @@
>  	  AC_DEFINE(PARALLEL_MARK)
>  	fi
>  	;;
> +     *-*-netbsd*)
> +	AC_DEFINE(GC_NETBSD_THREADS)
> +	AC_DEFINE(THREAD_LOCAL_ALLOC)
> +	if test "${enable_parallel_mark}" = yes; then
> +	  AC_DEFINE(PARALLEL_MARK)
> +	fi
> +	AC_DEFINE(THREAD_LOCAL_ALLOC)

THREAD_LOCAL_ALLOC is defined twice.

> Index: libgc/pthread_stop_world.c
> ===================================================================
> --- libgc/pthread_stop_world.c	(revision 71807)
> +++ libgc/pthread_stop_world.c	(working copy)
> @@ -111,6 +111,7 @@
>  #  endif
>  #endif
>  
> +#if !defined(GC_NETBSD_THREADS)
>  sem_t GC_suspend_ack_sem;
>  
>  static void _GC_suspend_handler(int sig)
> @@ -220,6 +221,7 @@
>      GC_printf1("In GC_restart_handler for 0x%lx\n", pthread_self());
>  #endif
>  }
> +#endif /* !GC_NETBSD_THREADS */
>  
>  # ifdef IA64
>  #   define IF_IA64(x) x
> @@ -295,12 +297,14 @@
>        ABORT("Collecting from unknown thread.");
>  }
>  
> +#if !defined(GC_NETBSD_THREADS)
>  void GC_restart_handler(int sig)
>  {
>  	int old_errno = errno;
>  	_GC_restart_handler (sig);
>  	errno = old_errno;
>  }
> +#endif
>  
>  /* We hold allocation lock.  Should do exactly the right thing if the	*/
>  /* world is stopped.  Should not fail if it isn't.			*/
> @@ -309,6 +313,28 @@
>      pthread_push_all_stacks();
>  }
>  
> +#if defined(GC_NETBSD_THREADS)
> +/* 
> + * Get the stack start address for the specified address.
> + */ 
> +int 
> +np_stackinfo(pthread_t p, void **addr) 
> +{ 
> +	pthread_attr_t attr; 
> +	int ret = -1; 
> +
> +	if (pthread_attr_init(&attr)) 
> +		return -1;
> +
> +	if (!pthread_attr_get_np(p, &attr))
> +		if (!pthread_attr_getstackaddr(&attr, addr)) 
> +			ret = 0;
> +
> +	pthread_attr_destroy(&attr); 
> +	return ret; 
> +}
> +#endif
> +
>  /* There seems to be a very rare thread stopping problem.  To help us  */
>  /* debug that, we save the ids of the stopping thread. */
>  pthread_t GC_stopping_thread;
> @@ -334,6 +360,7 @@
>              if (p -> stop_info.last_stop_count == GC_stop_count) continue;
>  	    if (p -> thread_blocked) /* Will wait */ continue;
>              n_live_threads++;
> +#if !defined(GC_NETBSD_THREADS)
>  	    #if DEBUG_THREADS
>  	      GC_printf1("Sending suspend signal to 0x%lx\n", p -> id);
>  	    #endif
> @@ -349,6 +376,23 @@
>                  default:
>                      ABORT("pthread_kill failed");
>              }
> +#else
> +	    #if DEBUG_THREADS
> +	      GC_printf1("Suspending 0x%lx ...\n", p -> id);
> +	    #endif
> +
> +		if(pthread_suspend_np(p -> id) != 0)
> +			GC_printf1("Could not susend thread... 0x%lx\n", p -> id);
> +
> +		/* Right now, this is not enough. Retreiving the stack base address is not the correct */
> +		/* info to give to the GC, but since there is no way to get the current stack pointer  */
> +		/* for the suspended thread, base pointer will have to be enough. Mono seems to be     */
> +		/* happy with it so... */
> +		if(np_stackinfo(p -> id, &(p -> stop_info.stack_ptr)) != 0)
> +			GC_err_printf1("Could not get thread stack address... 0x%lx\n", p -> id);			
> +
> +        n_live_threads--;
> +#endif /* !GC_NETBSD_THREADS */

Why do you need these stop/start changes? The thread stack addresse is
definitely not enough: we need all the registers from a suspended
thread. What doesn't work in the signal code for stopping the threads?

> Index: libgc/dyn_load.c
> ===================================================================
> --- libgc/dyn_load.c	(revision 71807)
> +++ libgc/dyn_load.c	(working copy)
> @@ -75,6 +75,11 @@
>  #   include <dlfcn.h>
>  #   include <link.h>
>  #endif
> +
> +#ifdef NETBSD 
> +#include <dlfcn.h>
> +#endif

There is already a #if defined(NETBSD) a few lines below...
Anyway, for mono we should just #ifdef out this whole file.

> Index: configure.in
> ===================================================================
> --- configure.in	(revision 71807)
> +++ configure.in	(working copy)
> @@ -82,14 +82,16 @@
>  		;;
>  	*-*-*netbsd*)
>  		platform_win32=no
> -		CPPFLAGS="$CPPFLAGS -D_REENTRANT"
> +		CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
>  		libmono_cflags="-D_REENTRANT"
>  		LDFLAGS="$LDFLAGS -pthread"
>  		CPPFLAGS="$CPPFLAGS -DPLATFORM_BSD"
>  		libmono_ldflags="-pthread"
>  		need_link_unlink=yes
> -		libdl=
> -		libgc_threads=no
> +		libdl="-ldl /libexec/ld.elf_so"

What is /libexec/ld.elf_so needed for?

> +		libgc_threads=pthreads
> +		with_tls=__thread

You should not force-set libgc_threads. configure will check if it
works.

lupus

-- 
-----------------------------------------------------------------
lupus at debian.org                                     debian/rules
lupus at ximian.com                             Monkeys do it better



More information about the Mono-devel-list mailing list