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

Reply via email to