> ... > The idea is that if the srcfile is already open, then it > should be left > open; but if it is not open, it should be closed at the end. > open() on > an open srcfile is supposed to make no change to the srcfile, just > return the already open connection. > > > (It looks like the srcref stuff is not finished yet, as > there are other > > problems, like print(parse(file)) not showing what it used to.) > > > This is an encoding problem, which looks easy to fix. I > think the leak > was caused by this: because of the encoding problem, the connections > got opened but open.srcfile aborted before completion, so > close.srcfile > didn't think the srcfile was open at all, and it left the > connections in > existence.
That incompletely opened connection may be why after doing this test closeAllConnections crashed R because the ex_ptr component of an Rconnection object was a nil pointer: > tf<-tempfile() > cat(file=tf, "1:10\nlog(log(pi))\n") > p<-parse(tf) > p expression(<srcref: file "/tmp/RtmpazU79B/file327b23c6" chars 1:1 to 1:4>, <srcref: file "/tmp/RtmpazU79B/file327b23c6" chars 2:1 to 2:12>) attr(,"srcfile") /tmp/RtmpazU79B/file327b23c6 > showConnections() description class mode text isopen can read can write 3 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no" 4 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no" 5 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no" 6 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no" > closeAllConnections() Program received signal SIGSEGV, Segmentation fault. 0x08118eff in Rf_setAttrib (vec=0x883f278, name=0x8621948, val=0x0) at attrib.c:226 226 if (NAMED(val)) val = duplicate(val); (gdb) up #1 0x08146c7b in do_getconnection (call=0x87a3b74, op=0x85f6fd8, args=0x87a3ca8, env=0x87a3c1c) at connections.c:4166 4166 setAttrib(ans, install("conn_id"), con->ex_ptr); (gdb) list 4161 PROTECT(class = allocVector(STRSXP, 2)); 4162 SET_STRING_ELT(class, 0, mkChar(con->class)); 4163 SET_STRING_ELT(class, 1, mkChar("connection")); 4164 classgets(ans, class); 4165 if (what > 2) 4166 setAttrib(ans, install("conn_id"), con->ex_ptr); 4167 UNPROTECT(2); 4168 return ans; 4169 } 4170 (gdb) print con->ex_ptr $3 = (void *) 0x0 (gdb) print *con $4 = {class = 0x90c8940 "file", description = 0x89c5878 "/tmp/RtmpazU79B/file327b23c6", enc = 0, mode = "rt\000\000", text = TRUE, isopen = TRUE, incomplete = FALSE, canread = TRUE, canwrite = FALSE, canseek = TRUE, blocking = TRUE, isGzcon = FALSE, open = 0x813c4f2 <file_open>, close = 0x813c77b <file_close>, destroy = 0x813bcf9 <null_destroy>, vfprintf = 0x813c7c3 <file_vfprintf>, fgetc = 0x813bfef <dummy_fgetc>, fgetc_internal = 0x813c860 <file_fgetc_internal>, seek = 0x813c8f9 <file_seek>, truncate = 0x813caa1 <file_truncate>, fflush = 0x813cb8a <file_fflush>, read = 0x813cbae <file_read>, write = 0x813cc26 <file_write>, nPushBack = 0, posPushBack = 64256, PushBack = 0x204, save = -1000, save2 = -1000, encname = "unknown", '\0' <repeats 93 times>, "A", inconv = 0x0, outconv = 0x0, iconvbuff = " \036\022\tE\001\000\000F\001\000\000G\001\000\000H\001\000\000I\001\000\000J", oconvbuff = "\001\000\000K\001\000\000L\001\000\000M\001\000\000N\001\000\000O\001\000\000P\001\000\000Q\001\000\000R\001\000\000S\001\000\000T\001\000\000U\001\000\000V\001", next = 0x157 <Address 0x157 out of bounds>, init_out = "X\001\000\000Y\001\000\000Z\001\000\000[\001\000\000\\\001\000\000]\001\000\000^", navail = 0, inavail = 351, EOF_signalled = 352, UTF8out = FALSE, id = 0x23, ex_ptr = 0x0, private = 0x908ec78} ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel