[Rd] Testcase (was: Stack checking, core dumps, and embedding R)

From: Thomas Friedrichsmeier <thomas.friedrichsmeier_at_ruhr-uni-bochum.de>
Date: Mon 17 Apr 2006 - 19:11:53 GMT

Sorry about all the noise, but I'm slightly irritated by the absence of reactions of any kind, while the time to the release is ticking away.

Attached you will find a testcase for the problem. Likely the error will only show up on linux, due to the

	#if defined(linux)
	    R_CStackStart = (uintptr_t) __libc_stack_end;
	#elif ...

in unix/system.c . Also the error may not be 100% reproducible, depending on where exactly the stack for the worker thread is allocated, but at least for me it has triggered every single time I tried it (recent debian unstable on a Pentium M, for reference).

For your convenience, if you place the testcase in tests/Embedding of your R source tree, here are the lines needed to compile and run:

gcc -I. -I../../src/include -I../../src/include -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -std=gnu99 -c threadEmbed.c -o threadEmbed.o

../../bin/R CMD LINK gcc -o threadEmbed threadEmbed.o -L../../lib -lR -lpthread

(R_HOME=../..; export R_HOME; ./threadEmbed --silent)

Once again, I don't know how many embedding applications are affected by this, but it is absolutely fatal for rkward, at least. The proposed patch, cited again, below, fixes the problem.


On Monday 17 April 2006 15:20, Thomas Friedrichsmeier wrote:
> Excuse me please, for being impatient, but I'm worried this issue may not
> be considered important enough to be fixed in R 2.3.0 at this late point of
> time. So let me re-state this:
> In the current state, R will *not work at all* when run in a thread on
> linux.
> I do not know how many embedding applications run R in a separate thread,
> and are affected by this. I know that at least rkward does, and it will not
> run.
> Reconsidering the proposals I made yesterday, after some sleep, let me
> propose this corrected fix (insert into src/unix/system.c, at line 179,
> right above "if(R_CStackStart == -1) R_CStackLimit = -1; /* never set */"):
> if (abs (R_CStackStart - (uintptr_t) &i) > 20000) {
> /* Very unlikely we're this far away from the stack start at this
> point in the code. Disable checking */
> R_CStackStart = -1;
> }
> For all I care, set the safety margin to 50000 or even more. This heuristic
> is only meant to catch cases where the detected value for R_CStackStart is
> *obviously wrong*, most importantly in case of threads.
> In this case all it will do is to disable the check. I can see no other
> side-effect.
> Once again, excuse me for being impatient, but *please* consider this for
> inclusion in R 2.3.0.
> Regards
> Thomas

R-devel@r-project.org mailing list
Received on Tue Apr 18 05:11:53 2006

This archive was generated by hypermail 2.1.8 : Mon 17 Apr 2006 - 20:17:51 GMT