Changeset: ff4cb599a3b2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ff4cb599a3b2
Modified Files:
tools/embedded/Tests/lowlevel.R
tools/embedded/embeddedr.c
Branch: embedded
Log Message:
finalizer for connections, bug #3897
diffs (41 lines):
diff --git a/tools/embedded/Tests/lowlevel.R b/tools/embedded/Tests/lowlevel.R
--- a/tools/embedded/Tests/lowlevel.R
+++ b/tools/embedded/Tests/lowlevel.R
@@ -124,4 +124,11 @@ test_that("the logger does not misbehave
monetdb_embedded_disconnect(con)
})
+test_that("the garbage collector closes connections", {
+ # there are 64 connections max. if gc() does not close them, the last
line will provoke a crash
+ conns <- lapply(1:60, function(x) monetdb_embedded_connect())
+ rm(conns)
+ gc()
+ conns <- lapply(1:60, function(x) monetdb_embedded_connect())
+})
diff --git a/tools/embedded/embeddedr.c b/tools/embedded/embeddedr.c
--- a/tools/embedded/embeddedr.c
+++ b/tools/embedded/embeddedr.c
@@ -133,12 +133,19 @@ SEXP monetdb_append_R(SEXP connsexp, SEX
SEXP monetdb_connect_R() {
- return R_MakeExternalPtr(monetdb_connect(), R_NilValue, R_NilValue);
+ SEXP conn = PROTECT(R_MakeExternalPtr(
+ monetdb_connect(), R_NilValue, R_NilValue));
+ R_RegisterCFinalizer(conn, monetdb_disconnect_R);
+ UNPROTECT(1);
+ return conn;
}
SEXP monetdb_disconnect_R(SEXP connsexp) {
- monetdb_disconnect(R_ExternalPtrAddr(connsexp));
- R_ClearExternalPtr(connsexp);
+ void* addr = R_ExternalPtrAddr(connsexp);
+ if (addr != NULL) {
+ monetdb_disconnect(R_ExternalPtrAddr(connsexp));
+ R_ClearExternalPtr(connsexp);
+ }
return R_NilValue;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list