pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg/41603: Making ECL work with threads



The following reply was made to PR pkg/41603; it has been noted by GNATS.

From: Matthew Mondor <mm_lists%pulsar-zone.net@localhost>
To: gnats-bugs%netbsd.org@localhost, asau%netbsd.org@localhost
Cc: 
Subject: Re: pkg/41603: Making ECL work with threads
Date: Sat, 15 Aug 2009 16:16:20 -0400

 --MP_/YQeQX3d6eH8cic/2bWXa.wO
 Content-Type: text/plain; charset=US-ASCII
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 So a few revisions were out since and I couldn't really start to look
 at the code until now.  I could resume debugging this problem a bit
 today.
 
 So with ECL CVS HEAD, all is fine when built without threads support
 again.  With threads support and CFLAGS='-O0 -g' and LDFLAGS='-g',
 ecl_min still gets stuck in an endless RUN state loop after the
 reception if a signal (SIGSEGV):
 
 behemoth$ gdb ~/work/ecl-cvs/build/ecl_min 13414
 GNU gdb 6.5
 Copyright (C) 2006 Free Software Foundation, Inc.
 GDB is free software, covered by the GNU General Public License, and
 you are welcome to change it and/or distribute copies of it under
 certain conditions. Type "show copying" to see the conditions.
 There is absolutely no warranty for GDB.  Type "show warranty" for
 details. This GDB was configured as "i386--netbsdelf"...
 Attaching to program: /home/mmondor/work/ecl-cvs/build/ecl_min, process
 13414 Reading symbols from /usr/lib/libpthread.so.0...done.
 Loaded symbols for /usr/lib/libpthread.so.0
 Reading symbols from /usr/lib/libm.so.0...done.
 Loaded symbols for /usr/lib/libm.so.0
 Reading symbols from /usr/lib/libc.so.12...done.
 Loaded symbols for /usr/lib/libc.so.12
 Reading symbols from /usr/libexec/ld.elf_so...done.
 Loaded symbols for /usr/libexec/ld.elf_so
 sigsegv_handler (sig=11, info=0xbfbfe264, aux=0xbfbfe2e4)
 at /home/mmondor/work/ecl-cvs/src/c/unixint.d:357 357
 cl_env_ptr the_env = ecl_process_env(); (gdb) bt
 #0  sigsegv_handler (sig=11, info=0xbfbfe264, aux=0xbfbfe2e4)
 at /home/mmondor/work/ecl-cvs/src/c/unixint.d:357 #1  <signal handler
 called> #2  ecl_set_process_env (env=0xbbab4000) at 
/home/mmondor/work/ecl-cvs/src/c/threads.d:85
 #3  0x080b2b05 in init_threads (env=0xbbab4000)
 at /home/mmondor/work/ecl-cvs/src/c/threads.d:677 #4  0x0804de50 in
 cl_boot (argc=2, argv=0xbfbfe714)
 at /home/mmondor/work/ecl-cvs/src/c/main.d:397 #5  0x0804ccc8 in main
 (argc=572653570, args=0x1)
 at /home/mmondor/work/ecl-cvs/src/c/cinit.d:127 (gdb) frame 2 #2
 ecl_set_process_env (env=0xbbab4000)
 at /home/mmondor/work/ecl-cvs/src/c/threads.d:85 85
 cl_env_p = env; (gdb) info locals No locals. (gdb) print *env
 $1 = {disable_interrupts = 1, nvalues = 0, values = {0x0 <repeats 64
 times>}, function = 0x0, stack_size = 0, stack = 0x0, stack_top = 0x0, 
stack_limit = 0x0, bds_size = 0, bds_org = 0x0, bds_top = 0x0, bds_limit = 0x0, 
bindings_hash = 0x0, ihs_top = 0x0, frs_size = 0, frs_org = 0x0, frs_top = 0x0, 
frs_limit = 0x0, 
   nlj_fr = 0x0, frame_id = 0, cs_org = 0x0, cs_limit = 0x0, cs_barrier
 = 0x0, cs_size = 0, string_pool = 0x0, c_env = 0x0, fmt_aux_stream =
 0x0, print_pretty = 0, queue = 0x0, indent_stack = 0x0, qh = 0, qt = 0,
 qc = 0, isp = 0, iisp = 0, big_register = {0x0, 0x0, 0x0},
 big_register_limbs = {{ 0 <repeats 16 times>}, {0 <repeats 16 times>},
 {0 <repeats 16 times>}}, own_process = 0x0, interrupt_pending = 0,
 interrupt_info = 0x0, method_hash_clear_list = 0x0, method_hash = 0x0,
 method_spec_vector = 0x0, method_generation = 0, fficall = 0x0,
 altstack = 0x0, altstack_size = 0, trap_fpe_bits = 0} (gdb) print
 *cl_env_p Cannot access memory at address 0x0
 
 There are various definitions used for conditions in the thread-related
 code.  ECL_THREADS, WITH___THREAD, ECL_WINDOWS_THREADS.  I at first
 expected the pthread_key_t pthread_getspecific()/pthread_setspecific()
 related code in c/threads.d to be used with threads, although that
 actually compiles if not WITH___THREAD (and I verified that
 WITH___THREAD was defined).  In c/main.d, cl_env_p is declared with
 __thread prefix if WITH___THREAD, however.  But, 8.12.0, which used to
 work also used this, and the HEAD configure script reports that __thread
 tests are successful.
 
 There however were a number of changes since 8.12.0.  The win32 and
 POSIX threads code have been merged for instance and the #ifdef mess is
 worse.  However, an interesting difference relating to __thread is that
 8.12.0 configure script had the --with-__thread default to NO, while
 new ECL uses AUTO.  I built a recent ECL with --with-__thread=no and it
 worked (!).
 
 Now I'm not familiar enough with __thread on NetBSD to know if they're
 supposed to work or not.  The configure script runs a gcc command to
 test that it's available if --with-__thread is AUTO or YES, and since
 this test appears successful it attempts to use the feature.
 
 Asau updated ECL on pkgsrc-current, and I for now propose the attached
 changes to that new stub on -current pkgsrc (diffs and a new
 patch-aa).  This also adds libffi as an option which is disabled by
 default.
 
 However, for ECL threading to also work, the boehm-gc package also has
 to be compiled with threading support.  Interestingly, on even
 pkgsrc-2009Q2, there was an erroneous conditional in devel/boehm-gc
 stubs's Makefile disabling threading on != Darwin, which probably had
 to be reversed.  However, -current pkgsrc has the fixes.
 
 Thanks,
 -- 
 Matt
 
 --MP_/YQeQX3d6eH8cic/2bWXa.wO
 Content-Type: text/plain
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename=Makefile-diff.txt
 
 --- ./Makefile.orig    2009-08-13 14:17:18.000000000 -0400
 +++ ./Makefile 2009-08-15 15:23:47.000000000 -0400
 @@ -16,9 +16,13 @@
  USE_PKGLOCALEDIR=     yes
  GNU_CONFIGURE=                yes
  USE_LIBTOOL=          yes
 -USE_TOOLS+=           gmake makeinfo
 +USE_TOOLS+=           gmake makeinfo autoconf
  INFO_FILES=           yes
  
 +# Make ffi patch take effect
 +pre-configure:
 +      cd ${WRKSRC}/src && autoconf
 +
  CONFIGURE_ARGS+=      --enable-boehm=system --with-system-gmp
  
  .include "options.mk"
 
 --MP_/YQeQX3d6eH8cic/2bWXa.wO
 Content-Type: text/plain
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename=distinfo-diff.txt
 
 --- ./distinfo.orig    2009-08-13 14:17:18.000000000 -0400
 +++ ./distinfo 2009-08-15 15:20:15.000000000 -0400
 @@ -3,3 +3,4 @@
  SHA1 (ecl-9.8.3.tgz) = 51928757ddf0a33ef24beac35971ce4a8df786d7
  RMD160 (ecl-9.8.3.tgz) = 94a746abc8bdb6881dfe361e0c7f074f17e3da04
  Size (ecl-9.8.3.tgz) = 5732346 bytes
 +SHA1 (patch-aa) = 2bdbae3ec960a993f38b005d4d4063c206120e10
 
 --MP_/YQeQX3d6eH8cic/2bWXa.wO
 Content-Type: text/plain
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename=options-mk-diff.txt
 
 --- ./options.mk.orig  2009-08-13 14:17:18.000000000 -0400
 +++ ./options.mk       2009-08-15 15:17:51.000000000 -0400
 @@ -1,7 +1,7 @@
  # $NetBSD: options.mk,v 1.1 2009/08/13 18:17:18 asau Exp $
  
  PKG_OPTIONS_VAR=              PKG_OPTIONS.ecl
 -PKG_SUPPORTED_OPTIONS+=               threads unicode
 +PKG_SUPPORTED_OPTIONS+=               threads unicode libffi
  PKG_SUGGESTED_OPTIONS+=               # empty
  # Unicode support proved to break Axioms.
  # Threads are off, since threaded ECL build crashes on NetBSD and FreeBSD.
 @@ -15,6 +15,9 @@
  CONFIGURE_ENV+=               THREAD_CFLAGS=${PTHREAD_CFLAGS:Q}
  CONFIGURE_ENV+=               THREAD_LDLAGS=${BUILDLINK_LDLAGS.pthread:Q}
  CONFIGURE_ENV+=               THREAD_LIBS=${BUILDLINK_LIBS.pthread:Q}
 +.if ${OPSYS} == "NetBSD"
 +CONFIGURE_ARGS+=      --with-__thread=no
 +.endif
  .include "../../mk/pthread.buildlink3.mk"
  .endif
  
 @@ -22,3 +25,7 @@
  CONFIGURE_ARGS+=      --enable-unicode
  PLIST_SRC+=           PLIST.unicode
  .endif
 +
 +.if !empty(PKG_OPTIONS:Mlibffi)
 +.include "../../devel/libffi/buildlink3.mk"
 +.endif
 
 --MP_/YQeQX3d6eH8cic/2bWXa.wO
 Content-Type: text/plain
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename=patch-aa
 
 --- ./src/configure.in.orig    2009-08-07 16:21:24.000000000 -0400
 +++ ./src/configure.in 2009-08-08 12:55:37.000000000 -0400
 @@ -320,7 +320,7 @@
  LIBS="${LIBS} -lm"
  AC_CHECK_LIB(sun, getpwnam)         # on IRIX adds -lsun
  AC_CHECK_LIB( ffi, ffi_call, [has_ffi_lib=yes], [has_ffi_lib=no] )
 -AC_CHECK_HEADER( [ffi/ffi.h], [has_ffi_h=$has_ffi_lib], [has_ffi_h=no] )
 +AC_CHECK_HEADER( [ffi.h], [has_ffi_h=$has_ffi_lib], [has_ffi_h=no] )
  AC_ISC_POSIX
  if test $has_ffi_h = "yes"; then
    AC_DEFINE(HAVE_LIBFFI)
 --- ./src/c/ffi.d.orig 2009-08-07 16:21:20.000000000 -0400
 +++ ./src/c/ffi.d      2009-08-08 13:02:17.000000000 -0400
 @@ -17,7 +17,7 @@
  #include <ecl/ecl.h>
  #include <ecl/internal.h>
  #ifdef HAVE_LIBFFI
 -# include <ffi/ffi.h>
 +# include <ffi.h>
  #endif
  
  static const cl_object ecl_foreign_type_table[] = {
 
 --MP_/YQeQX3d6eH8cic/2bWXa.wO--
 


Home | Main Index | Thread Index | Old Index