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. Besides it is interesting that if i put the R code in the main thread(don't create any thread), it work, and the E-exts doc say that "Embedded R is designed to be run in the main thread, and all the testing is done in that context." so i wonder is it that Embedded R can not run in the child thread ? so, can anybody give some help or suggestion about this problem, any response will be appreciated, tks in advance. *********************** Bin Dong BUAA, Beijing PR China goon83@126.com *********************** ps: my code, system info and error information list behand ----------------------------- 1, my example code lists here: ----------------------------- #include .... void *ts_thread(){ SEXP e, tmp; int hadError; int argc = 0; char *argv[1]; ParseStatus status; init_R(argc, argv); PROTECT(tmp = mkString("{print(lh)}")); PROTECT(e = R_ParseVector(tmp, 1, &status, R_NilValue)); PrintValue(e); R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError); UNPROTECT(2); end_R(); } int main(int argc, char *argv[]){ pthread_t th1; int iret1; iret1 = pthread_create(&th1, NULL, ts_thread,NULL); pthread_join(th1, NULL); printf("Thread 1 return:%d\n", iret1); return 0; } ----------------------------------- 2, My os and compiler is: ----------------------------------- Linux debian 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux gcc version 4.3.2 (Debian 4.3.2-1.1) ----------------------------------- 3, the error info: ------------------------------------ goon@debian:~/library/R-source/R-2.9.0/tests/Embedding$ ./Rar Error: C stack usage is too close to the limit Error: C stack usage is too close to the limit R version 2.7.1 (2008-06-23) Copyright (C) 2008 The R Foundation for Statistical Computing ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. expression({ print(lh) }) Error: C stack usage is too close to the limit Thread 1 return:0 ------------------------------------------ [[alternative HTML version deleted]]
Simon Urbanek
2009-May-19 10:23 UTC
[Rd] About " Error: C stack usage is too close to the limit"
On May 19, 2009, at 4:30 AM, goon83 wrote:> 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> Besides it is interesting that if i put the R code in the main > thread(don't create any thread), it work, and the E-exts doc say > that "Embedded R is designed to be run in the main thread, and all > the testing is done in that context." so i wonder is it that > Embedded R can not run in the child thread ? > > so, can anybody give some help or suggestion about this problem, > any response will be appreciated, tks in advance. > > *********************** > Bin Dong > BUAA, Beijing PR China > goon83 at 126.com > *********************** > > ps: my code, system info and error information list behand > > ----------------------------- > 1, my example code lists here: > ----------------------------- > #include .... > > void *ts_thread(){ > SEXP e, tmp; > int hadError; > int argc = 0; > char *argv[1]; > ParseStatus status; > > init_R(argc, argv); > > PROTECT(tmp = mkString("{print(lh)}")); > PROTECT(e = R_ParseVector(tmp, 1, &status, R_NilValue)); > PrintValue(e); > R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError); > > UNPROTECT(2); > end_R(); > } > > int main(int argc, char *argv[]){ > pthread_t th1; > int iret1; > > iret1 = pthread_create(&th1, NULL, ts_thread,NULL); > pthread_join(th1, NULL); > printf("Thread 1 return:%d\n", iret1); > > return 0; > } > ----------------------------------- > 2, My os and compiler is: > ----------------------------------- > Linux debian 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 > GNU/Linux > gcc version 4.3.2 (Debian 4.3.2-1.1) > > ----------------------------------- > 3, the error info: > ------------------------------------ > goon at debian:~/library/R-source/R-2.9.0/tests/Embedding$ ./Rar > Error: C stack usage is too close to the limit > Error: C stack usage is too close to the limit > > R version 2.7.1 (2008-06-23) > Copyright (C) 2008 The R Foundation for Statistical Computing > ISBN 3-900051-07-0 > > R is free software and comes with ABSOLUTELY NO WARRANTY. > You are welcome to redistribute it under certain conditions. > Type 'license()' or 'licence()' for distribution details. > > R is a collaborative project with many contributors. > Type 'contributors()' for more information and > 'citation()' on how to cite R or R packages in publications. > > Type 'demo()' for some demos, 'help()' for on-line help, or > 'help.start()' for an HTML browser interface to help. > Type 'q()' to quit R. > > expression({ > print(lh) > }) > Error: C stack usage is too close to the limit > Thread 1 return:0 > ------------------------------------------ > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >
Hi Simon, thanks for your information, I have tried to set "R_CStackLimit = (uintptr_t)-1" after Rf_initialize_R, but i don't know which Rf_initialize_R, because i found several in my source code. I had tried to set it in some place, but it still don't work. Strangely, i add "R_CStackLimit = (uintptr_t)-1" to my own application after init_R(argc, argv), it print new error info. The detail as follow: I firstly tried to add "R_CStackLimit = (uintptr_t)-1" to /R-2.9.0/src/main/Rmain.c , and then recompile R using --enable-R-shlib, but it did't work. Then i added it to "/R-2.9.0/src/unix/Rembedded.c", then compile it as above, it also didn't work. I finally added it to my own application code after "init_R(argc, argv)"(you can look at my previous mail), it didn't give me the error information, but this time it inform me the error info: Error: could not find function "print" (I use PROTECT(tmp = mkString("{print(lh)}")) in my application's code) so Simon, can you give me more advice, or you can give me a simple code using R in thread. Realy appreciate you help! ?*********************** ?Bin?Dong ?BUAA,?Beijing?PR?China ?goon83@126.com ?*********************** ÔÚ2009-05-19?18:23:08£¬"Simon?Urbanek"?<simon.urbanek@r-project.org>?дµÀ£º> >On?May?19,?2009,?at?4:30?AM,?goon83?wrote: > >>?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 > > >>???Besides?it?is?interesting?that?if?i?put?the?R?code?in?the?main?? >>?thread(don't?create?any?thread),?it?work,??and?the?E-exts?doc?say?? >>?that??"Embedded?R?is?designed?to?be?run?in?the?main?thread,?and?all?? >>?the?testing?is?done?in?that?context."?so?i?wonder?is?it?that?? >>?Embedded?R?can?not?run?in?the?child?thread?? >> >>???so,?can?anybody?give?some?help?or?suggestion?about?this?problem, >>???any?response?will?be?appreciated,?tks?in?advance. >> >>?*********************** >>?Bin?Dong >>?BUAA,?Beijing?PR?China >>?goon83@126.com >>?*********************** >> >>???ps:?my?code,?system?info?and?error?information?list?behand >> >>???----------------------------- >>???1,?my?example?code?lists?here: >>???----------------------------- >>???#include?.... >> >>???void?*ts_thread(){ >>?????????SEXP?e,?tmp; >>?????????int??hadError; >>?????????int?argc?=?0; >>?????????char?*argv[1]; >>?????????ParseStatus?status; >> >>?????????init_R(argc,?argv); >> >>????????PROTECT(tmp?=?mkString("{print(lh)}")); >>????????PROTECT(e?=?R_ParseVector(tmp,?1,?&status,?R_NilValue)); >>????????PrintValue(e); >>????????R_tryEval(VECTOR_ELT(e,0),?R_GlobalEnv,?&hadError); >> >>???????UNPROTECT(2); >>???????end_R(); >>?} >> >>?int?main(int?argc,?char?*argv[]){ >>????pthread_t?th1; >>????int?iret1; >> >>????iret1?=?pthread_create(&th1,?NULL,?ts_thread,NULL); >>????pthread_join(th1,?NULL); >>????printf("Thread?1?return:%d\n",?iret1); >> >>????return?0; >>?} >>?----------------------------------- >>?2,?My?os?and?compiler?is: >>?----------------------------------- >>?Linux?debian?2.6.26-1-686?#1?SMP?Sat?Jan?10?18:29:31?UTC?2009?i686?? >>?GNU/Linux >>?gcc?version?4.3.2?(Debian?4.3.2-1.1) >> >>?----------------------------------- >>?3,?the?error?info: >>?------------------------------------ >>?goon@debian:~/library/R-source/R-2.9.0/tests/Embedding$?./Rar >>?Error:?C?stack?usage?is?too?close?to?the?limit >>?Error:?C?stack?usage?is?too?close?to?the?limit >> >>?R?version?2.7.1?(2008-06-23) >>?Copyright?(C)?2008?The?R?Foundation?for?Statistical?Computing >>?ISBN?3-900051-07-0 >> >>?R?is?free?software?and?comes?with?ABSOLUTELY?NO?WARRANTY. >>?You?are?welcome?to?redistribute?it?under?certain?conditions. >>?Type?'license()'?or?'licence()'?for?distribution?details. >> >>?R?is?a?collaborative?project?with?many?contributors. >>?Type?'contributors()'?for?more?information?and >>?'citation()'?on?how?to?cite?R?or?R?packages?in?publications. >> >>?Type?'demo()'?for?some?demos,?'help()'?for?on-line?help,?or >>?'help.start()'?for?an?HTML?browser?interface?to?help. >>?Type?'q()'?to?quit?R. >> >>?expression({ >>????print(lh) >>?}) >>?Error:?C?stack?usage?is?too?close?to?the?limit >>?Thread?1?return:0 >>?------------------------------------------ >> >> >>? [[alternative?HTML?version?deleted]] >> >>?______________________________________________ >>?R-devel@r-project.org?mailing?list >>?https://stat.ethz.ch/mailman/listinfo/r-devel >> >> >[[alternative HTML version deleted]]