Changeset: 10f163163396 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/10f163163396
Modified Files:
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_utils.c
Branch: default
Log Message:

Merge with Sep2022 branch.


diffs (281 lines):

diff --git a/cmake/Modules/FindReadline.cmake b/cmake/Modules/FindReadline.cmake
--- a/cmake/Modules/FindReadline.cmake
+++ b/cmake/Modules/FindReadline.cmake
@@ -9,22 +9,24 @@ find_package(PkgConfig QUIET)
 pkg_check_modules(PC_READLINE QUIET readline>=8.0)
 
 if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR PC_READLINE_FOUND)
+  if(NOT WIN32)
 
-# Look for the header file.
-find_path(READLINE_INCLUDE_DIR NAMES readline/readline.h
-   HINTS
-   ${PC_READLINE_INCLUDEDIR}
-   ${PC_READLINE_INCLUDE_DIRS}
-   PATH_SUFFIXES readline
-   )
+    # Look for the header file.
+    find_path(READLINE_INCLUDE_DIR NAMES readline/readline.h
+      HINTS
+      ${PC_READLINE_INCLUDEDIR}
+      ${PC_READLINE_INCLUDE_DIRS}
+      PATH_SUFFIXES readline
+      )
 
-# Look for the library.
-find_library(READLINE_LIBRARIES NAMES readline
-   HINTS
-   ${PC_READLINE_LIBDIR}
-   ${PC_READLINE_LIBRARY_DIRS}
-   )
+    # Look for the library.
+    find_library(READLINE_LIBRARIES NAMES readline
+      HINTS
+      ${PC_READLINE_LIBDIR}
+      ${PC_READLINE_LIBRARY_DIRS}
+      )
 
+  endif()
 endif()
 
 # Handle the QUIETLY and REQUIRED arguments and set READLINE_FOUND to TRUE if 
all listed variables are TRUE.
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -738,8 +738,7 @@ typedef struct {
 #define GDKLIBRARY_TAILN       061043U /* first in Jul2021: str offset heaps 
names don't take width into account */
 #define GDKLIBRARY_HASHASH     061044U /* first in Jul2021: hashash bit in 
string heaps */
 #define GDKLIBRARY_HSIZE       061045U /* first in Jan2022: heap "size" values 
*/
-/* if the version number is updated, also fix snapshot_bats() in bat_logger.c 
*/
-#define GDKLIBRARY             061046U /* first after Jan2022 */
+#define GDKLIBRARY             061046U /* first in Sep2022 */
 
 /* The batRestricted field indicates whether a BAT is readonly.
  * we have modes: BAT_WRITE  = all permitted
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2219,7 +2219,7 @@ backup_new(Heap *hp, bool lock)
        if (batpath != NULL && bakpath != NULL) {
                /* file actions here interact with the global commits */
                if (lock)
-                       MT_lock_set(&GDKtmLock);
+                       BBPtmlock();
 
                batret = MT_stat(batpath, &st);
                bakret = MT_stat(bakpath, &st);
@@ -2240,7 +2240,7 @@ backup_new(Heap *hp, bool lock)
                        ret = 0;
                }
                if (lock)
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
        }
        GDKfree(batpath);
        GDKfree(bakpath);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -265,15 +265,37 @@ static volatile MT_Id locked_by = 0;
 static int BBPunloadCnt = 0;
 static MT_Lock GDKunloadLock = MT_LOCK_INITIALIZER(GDKunloadLock);
 
+/* GDKtmLock protects all accesses and changes to BAKDIR and SUBDIR
+ * must use BBPtmlock()/BBPtmunlock() to set/unset the lock */
+static MT_Lock GDKtmLock = MT_LOCK_INITIALIZER(GDKtmLock);
+static char *lockfile;
+static int lockfd;
+
 void
 BBPtmlock(void)
 {
        MT_lock_set(&GDKtmLock);
+       if (GDKinmemory(0))
+               return;
+       /* also use an external lock file to synchronize with external
+        * programs */
+       if (lockfile == NULL) {
+               lockfile = GDKfilepath(0, NULL, ".tm_lock", NULL);
+               if (lockfile == NULL)
+                       return;
+       }
+       lockfd = MT_lockf(lockfile, F_LOCK);
 }
 
 void
 BBPtmunlock(void)
 {
+       if (lockfile && lockfd >= 0) {
+               assert(!GDKinmemory(0));
+               MT_lockf(lockfile, F_ULOCK);
+               close(lockfd);
+               lockfd = -1;
+       }
        MT_lock_unset(&GDKtmLock);
 }
 
@@ -290,7 +312,7 @@ BBPlock(void)
                MT_lock_set(&GDKunloadLock);
        }
 
-       MT_lock_set(&GDKtmLock);
+       BBPtmlock();
        MT_lock_set(&GDKcacheLock);
        for (i = 0; i <= BBP_BATMASK; i++)
                MT_lock_set(&GDKswapLock(i));
@@ -308,7 +330,7 @@ BBPunlock(void)
                MT_lock_unset(&GDKswapLock(i));
        MT_lock_unset(&GDKcacheLock);
        locked_by = 0;
-       MT_lock_unset(&GDKtmLock);
+       BBPtmunlock();
 }
 
 static gdk_return
@@ -1579,11 +1601,11 @@ BBPinit(void)
        if (!GDKinmemory(0)) {
                str bbpdirstr, backupbbpdirstr;
 
-               MT_lock_set(&GDKtmLock);
+               BBPtmlock();
 
                if (!(bbpdirstr = GDKfilepath(0, BATDIR, "BBP", "dir"))) {
                        TRC_CRITICAL(GDK, "GDKmalloc failed\n");
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
                        GDKdebug = dbg;
                        return GDK_FAIL;
                }
@@ -1591,7 +1613,7 @@ BBPinit(void)
                if (!(backupbbpdirstr = GDKfilepath(0, BAKDIR, "BBP", "dir"))) {
                        GDKfree(bbpdirstr);
                        TRC_CRITICAL(GDK, "GDKmalloc failed\n");
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
                        GDKdebug = dbg;
                        return GDK_FAIL;
                }
@@ -1600,7 +1622,7 @@ BBPinit(void)
                        GDKfree(bbpdirstr);
                        GDKfree(backupbbpdirstr);
                        TRC_CRITICAL(GDK, "cannot remove directory %s\n", 
TEMPDIR);
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
                        GDKdebug = dbg;
                        return GDK_FAIL;
                }
@@ -1609,7 +1631,7 @@ BBPinit(void)
                        GDKfree(bbpdirstr);
                        GDKfree(backupbbpdirstr);
                        TRC_CRITICAL(GDK, "cannot remove directory %s\n", 
DELDIR);
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
                        GDKdebug = dbg;
                        return GDK_FAIL;
                }
@@ -1619,7 +1641,7 @@ BBPinit(void)
                        GDKfree(bbpdirstr);
                        GDKfree(backupbbpdirstr);
                        TRC_CRITICAL(GDK, "cannot properly recover_subdir 
process %s.", SUBDIR);
-                       MT_lock_unset(&GDKtmLock);
+                       BBPtmunlock();
                        GDKdebug = dbg;
                        return GDK_FAIL;
                }
@@ -1630,14 +1652,14 @@ BBPinit(void)
                        if (recover_dir(0, MT_stat(bbpdirstr, &st) == 0) != 
GDK_SUCCEED) {
                                GDKfree(bbpdirstr);
                                GDKfree(backupbbpdirstr);
-                               MT_lock_unset(&GDKtmLock);
+                               BBPtmunlock();
                                goto bailout;
                        }
                        if ((fp = GDKfilelocate(0, "BBP", "r", "dir")) == NULL) 
{
                                GDKfree(bbpdirstr);
                                GDKfree(backupbbpdirstr);
                                TRC_CRITICAL(GDK, "cannot open recovered 
BBP.dir.");
-                               MT_lock_unset(&GDKtmLock);
+                               BBPtmunlock();
                                GDKdebug = dbg;
                                return GDK_FAIL;
                        }
@@ -1651,7 +1673,7 @@ BBPinit(void)
                                if (BBPdir_init() != GDK_SUCCEED) {
                                        GDKfree(bbpdirstr);
                                        GDKfree(backupbbpdirstr);
-                                       MT_lock_unset(&GDKtmLock);
+                                       BBPtmunlock();
                                        goto bailout;
                                }
                        } else if (GDKmove(0, BATDIR, "BBP", "bak", BATDIR, 
"BBP", "dir", true) == GDK_SUCCEED)
@@ -1661,14 +1683,14 @@ BBPinit(void)
                                GDKsyserror("cannot open BBP.dir");
                                GDKfree(bbpdirstr);
                                GDKfree(backupbbpdirstr);
-                               MT_lock_unset(&GDKtmLock);
+                               BBPtmunlock();
                                goto bailout;
                        }
                }
                assert(fp != NULL);
                GDKfree(bbpdirstr);
                GDKfree(backupbbpdirstr);
-               MT_lock_unset(&GDKtmLock);
+               BBPtmunlock();
        }
 
        /* scan the BBP.dir to obtain current size */
@@ -1725,9 +1747,9 @@ BBPinit(void)
 
        /* will call BBPrecover if needed */
        if (!GDKinmemory(0)) {
-               MT_lock_set(&GDKtmLock);
+               BBPtmlock();
                gdk_return rc = BBPprepare(false);
-               MT_lock_unset(&GDKtmLock);
+               BBPtmunlock();
                if (rc != GDK_SUCCEED) {
 #ifdef GDKLIBRARY_HASHASH
                        GDKfree(hashbats);
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -476,7 +476,6 @@ extern batlock_t GDKbatLock[BBP_BATMASK 
 extern size_t GDK_mmap_minsize_persistent; /* size after which we use memory 
mapped files for persistent heaps */
 extern size_t GDK_mmap_minsize_transient; /* size after which we use memory 
mapped files for transient heaps */
 extern size_t GDK_mmap_pagesize; /* mmap granularity */
-extern MT_Lock GDKtmLock;
 
 #define BATcheck(tst, err)                             \
        do {                                            \
diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c
--- a/gdk/gdk_tm.c
+++ b/gdk/gdk_tm.c
@@ -187,12 +187,12 @@ TMsubcommit_list(bat *restrict subcommit
                }
        }
        /* lock just prevents other global (sub-)commits */
-       MT_lock_set(&GDKtmLock);
+       BBPtmlock();
        if (BBPsync(cnt, subcommit, sizes, logno, transid) == GDK_SUCCEED) { /* 
write BBP.dir (++) */
                epilogue(cnt, subcommit, false);
                ret = GDK_SUCCEED;
        }
-       MT_lock_unset(&GDKtmLock);
+       BBPtmunlock();
        return ret;
 }
 
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1326,9 +1326,6 @@ GDKreset(int status)
 
 batlock_t GDKbatLock[BBP_BATMASK + 1];
 
-/* GDKtmLock protects all accesses and changes to BAKDIR and SUBDIR */
-MT_Lock GDKtmLock = MT_LOCK_INITIALIZER(GDKtmLock);
-
 /*
  * @+ Concurrency control
  * Concurrency control requires actions at several levels of the
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to