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 -- [email protected]
To unsubscribe send an email to [email protected]