Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 01 Nov 2007 21:04:35 +0000
From:      lemon <lemon+freebsd@zomo.co.uk>
To:        freebsd-ports@freebsd.org
Subject:   ruby18, -pthreads, deep recursion
Message-ID:  <472A3F63.9010500@zomo.co.uk>

next in thread | raw e-mail | index | archive | help
Hi,

I've been struggling with FreeBSD's ruby18 port and threads. I realise
there's previous discussion[0] about this and I feel I'm blundering
somewhat, but here goes.

On both 7.x and 6.x boxes I've built ruby18 with the pthreads knob
deliberately turned off (the default). The resultant ruby has problems
with deep recursion, shown by this script[1] but less pathologically in
production in a busy RoR site too.

  $ ruby -e 'def d(x); p x; d x+1; end; d 0'

This bombs with SIGILL[2].

I note that, as per the conversations linked above, this build uses the
GCC option -pthread and links against libthr[3].

If I build the port without -pthread (and related config.h #define),
install the library alongside the from-port one, and employ the
resultant binary with some libmap.conf guidance I get a ruby which
behaves far nicer[4]. I can recurse way deeper and receive a graceful
SystemStackError exception when things hit the wall[5].

What's the score here? Clearly there's motive for building like it does,
but the hacked ruby works better for me in everyday life. Any ideas?

I hope this is on-topic for freebsd-ports. I mailed the maintainer first
but got no response.

Regards, l.

[0]
http://lists.freebsd.org/pipermail/freebsd-ports/2005-January/019352.html
    http://lists.freebsd.org/pipermail/freebsd-ports/2006-March/030691.html

[1] Google found me this, I forget where!

[2] $ ruby -e 'def d(x); p x; d x+1; end; d 0' | head
	0
	1
	2
    ...
    2138
    2139
    Illegal instruction: 4

[3] $ ldd `which ruby`
	/usr/local/bin/ruby:
	        libruby18.so.18 => /usr/local/lib/libruby18.so.18 (0x2807d000)
	        libcrypt.so.4 => /lib/libcrypt.so.4 (0x28154000)
	        libm.so.5 => /lib/libm.so.5 (0x2816d000)
	        libthr.so.3 => /lib/libthr.so.3 (0x28182000)
	        libc.so.7 => /lib/libc.so.7 (0x28195000)

[4] $ ldd ~/tmp/ruby18
	/home/lemon/tmp/ruby18:
	        libruby18.so.18 => /usr/local/lib/libruby18-nothread.so.18
(0x2807d000)
	        libcrypt.so.4 => /lib/libcrypt.so.4 (0x28154000)
	        libm.so.5 => /lib/libm.so.5 (0x2816d000)
	        libc.so.7 => /lib/libc.so.7 (0x28182000)

[5] $ ~/tmp/ruby18 -e 'def d(x); p x; d x+1; end; d 0'
	0
	1
	2
	...
	67705
	67706
	-e:1:in `inspect': stack level too deep (SystemStackError)
	        from -e:1:in `p'
	        from -e:1:in `d'
	        from -e:1:in `d'
	        from -e:1



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?472A3F63.9010500>