So I'm working on a custom front end to R, in one mode of the front end I dynamically load libR.so into a child worker thread. I'm very careful to make sure it is loaded by a single thread and loaded only once, but since it is a child thread it violates assumptions made by the stack size checking inside of R and I get innumerable errors along the lines of
Error: C stack usage 140732526462740 is too close to the limit Digging through this email list (and I also found similar things out on google) I found the following advice from 2009 ---------------------------------------- SNIP ------------------------------------------------------------------------------ > Hi everyone! > I meet one problem when embedding R in C code, when I run the the > R code in one child thread , > it always print error info: > Error: C stack usage is too close to the limit > > I also try to set R_CStackLimit = (uintptr_t)-1 to disable the C > stack check as the R-exts doc say, > but it still does not work, the error info still exist. > That is the way to do it (and other project use it successfully) - the fact that it doesn't work means that you probably do it at the wrong place (you must set it *after* Rf_initialize_R). Cheers, Simon ---------------------------------------- SNIP ------------------------------------------------------------------------------ my code is as follows ---------------------------------------- SNIP ------------------------------------------------------------------------------ void init_r() { SEXP aperm_function; const char *init_argv[] = {"MyFront", "--vanilla", "--slave"}; Rf_initEmbeddedR(sizeof (init_argv) / sizeof (init_argv[0]), (char**) init_argv); R_CStackLimit = (uintptr_t)-1; /* * transposeVector above uses the R builtin function aperm instead of * looking it up every time we need deal with transposing a multidimensional * intput/output look it up once here and save it off */ aperm_function = findFun(install("aperm"), R_GlobalEnv); if (aperm_function == NULL || aperm_function == R_NilValue || aperm_function == R_UnboundValue) { aperm_function = NULL; } else { aperm_expression = PROTECT(allocVector(LANGSXP, 2)); SETCAR(aperm_expression, aperm_function); } } ---------------------------------------- SNIP ------------------------------------------------------------------------------ but as I say I still get the error and it seems like the call to Rf_initEmbeddedR just never returns. As an experiment I edited config.h.in and removed the define for HAVE_GETRLIMIT and recompiled, thus compiling out the stack checking mechanism entirely. Then everything worked great!, so I know it's the stack checking mechanism from a child thread that is falling to pieces. So what I have in mind is looking to fix this mechanism so that it works from a child thread if the pthread library is available and submitting a patch. My question is two fold, 1. Is there a way to get this to work without a code change ( I'd like to be able to offer my front end stand alone and not have to bundle R with it ) 2. If I do come up with a diff, how do I go about submitting it back to the r foundation? for completeness the version of R I am using > version _ platform x86_64-unknown-linux-gnu arch x86_64 os linux-gnu system x86_64, linux-gnu status major 3 minor 2.1 year 2015 month 06 day 18 svn rev 68531 language R version.string R version 3.2.1 (2015-06-18) nickname World-Famous Astronaut compiled from source with configure options head R-3.2.1/config.log This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by R configure 3.2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ ./configure --prefix /u/rmetzger/linux_R_vanilla --enable-R-shlib ## --------- ## ## Platform. ## thank you! Ryan ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel