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