diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/util/system.cpp | 6 | ||||
-rw-r--r-- | src/util/system.h | 1 | ||||
-rw-r--r-- | src/wallet/db.cpp | 7 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/util/system.cpp b/src/util/system.cpp index 789dcfaba9..bb9fcab59e 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -111,6 +111,12 @@ bool LockDirectory(const fs::path& directory, const std::string lockfile_name, b return true; } +void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name) +{ + std::lock_guard<std::mutex> lock(cs_dir_locks); + dir_locks.erase((directory / lockfile_name).string()); +} + void ReleaseDirectoryLocks() { std::lock_guard<std::mutex> ulock(cs_dir_locks); diff --git a/src/util/system.h b/src/util/system.h index 5932e55793..17723d427d 100644 --- a/src/util/system.h +++ b/src/util/system.h @@ -70,6 +70,7 @@ int RaiseFileDescriptorLimit(int nMinFD); void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length); bool RenameOver(fs::path src, fs::path dest); bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only=false); +void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name); bool DirIsWritable(const fs::path& directory); /** Release all directory locks. This is used for unit testing only, at runtime diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp index cfa9bdd20e..c64a85c910 100644 --- a/src/wallet/db.cpp +++ b/src/wallet/db.cpp @@ -126,11 +126,18 @@ void BerkeleyEnvironment::Close() } } + FILE* error_file = nullptr; + dbenv->get_errfile(&error_file); + int ret = dbenv->close(0); if (ret != 0) LogPrintf("BerkeleyEnvironment::Close: Error %d closing database environment: %s\n", ret, DbEnv::strerror(ret)); if (!fMockDb) DbEnv((u_int32_t)0).remove(strPath.c_str(), 0); + + if (error_file) fclose(error_file); + + UnlockDirectory(strPath, ".walletlock"); } void BerkeleyEnvironment::Reset() |