After some examination, this is what i found (i changed the code somewhat, i dont modify rawdata anymore)
load("/tmp/v.Rdata") dyn.load("/ln/meraki/custom/lib64/R/library/mylib/libs/lib.so") v=.Call("returnListOfKV",rawkv,numread) ## v is a list of 28231 lists each of length 2 j=v[1:10000] ; u=list();u=append(u,j) and j=v[1:15164] ; u=list();u=append(u,j) both work but for n> 15164 j=v[1:n] ; u=list();u=append(u,j) returns Error: protect(): protection stack overflow I have no idea why... Regards Saptarshi On Sat, Sep 19, 2009 at 10:15 PM, Saptarshi Guha <saptarshi.g...@gmail.com> wrote: > Hello, > I call a function via .Call passing to it a raw vector(D) and an integer(I) > The vector is a series K1,KData1, V1,VData1, K2, KData2, ... > where the integer K1 is the length of Data1 and similarly for Ki (wrt > Datai)(similarly for V*) There 2*I such pairs( (Ki,KDatai), (Vi,VDatai)) > > The numbers Ki(and Vi) are written in network order. > > I am returning a list of I elements each element a list of two elements > corresponding to KData and VData (which are serialized R objects) . > > ll <- .Call("returnListOfKV", rawkv, numread) > > When use the function with browser(), and type head(ll) i get valid results. > However, i get a segfault when the code runs the next line > > j <- append(j,ll) > > (where j was defined as vector(mode='list') ) > > The code below looks alright, but it appears to crash when getting copied. > Now one could blame message2rexp (in kk_), but once in R, the result of > .Call is assigned to ll, everything should be protected. > In fact, if in kk_ i simply return a VECSXP with 2 elements, no errors, so > one could conclude that message2rexp is to blame. > > Yet, when i replace the code with R code, that is using readBin and only > calling calling C(to call message2rexp) to deserialize a raw vector, I get > no such error. > > There is something I'm missing , could someone tell me where? > Thank you for your time > Regards > Saptarshi > > > === Using GDB? ==== > I would like to run it through gdb, i get the following message > [Thread debugging using libthread_db enabled] > Error while reading shared library symbols: > Cannot find new threads: generic error > Cannot find new threads: generic error] > > and cannot proceed. > > ==== Code ==== > SEXP returnListOfKV(SEXP raw,SEXP numread){ > > if(TYPEOF(raw)!=RAWSXP){ > return(R_NilValue); > } > int num = INTEGER(numread)[0]; > char *rawdata = (char*)RAW(raw); > SEXP KV ,rval; > int r; > PROTECT(rval = Rf_allocVector(VECSXP, num)); > for(int i=0;i<num;i++){ > SEXP k = R_NilValue; > PROTECT(KV = Rf_allocVector(VECSXP, 2)); > > r = reverseUInt(*((int*) rawdata)); //converts network order to host > rawdata+=4; //yes, hard code size of int > PROTECT(k= kk_(rawdata,r)); //deserializes data and returns a SEXP > rawdata+= r; > SET_VECTOR_ELT(KV,0, k); > UNPROTECT(1); > > r = reverseUInt(*((int*) rawdata)); > rawdata+=4; > PROTECT(k= kk_(rawdata,r)); > rawdata+=r; > SET_VECTOR_ELT(KV,1, k); > UNPROTECT(1); > > SET_VECTOR_ELT(rval,i,KV); > UNPROTECT(1); > } > UNPROTECT(1); > return(rval); > } > > > SEXP kk_(char *d,int n){ > SEXP k; > REXP *rexp = new REXP(); > rexp->Clear(); > rexp->ParseFromArray(d,n); > PROTECT(k = message2rexp(*rexp)); > delete(rexp); > UNPROTECT(1); > return(k); > } > > Saptarshi Guha | saptarshi.g...@gmail.com | > http://www.stat.purdue.edu/~sguha > > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel