mirror of
https://github.com/isar/libmdbx.git
synced 2025-11-07 07:18:56 +08:00
mdbx: partial fix for recursive SRW-lock with MDBX_NOTLS on Windows.
Here are some changes to avoid recursive acquisition of SRW-lock, which is still in use: - Read transactions don't acquire the shared SRW-lock with `MDBX_NOTLS. - Memory-mapping of DB is always kept while DB opened, therefore following limitations are: - DB file can't be shrinked while it used, including auto-shrink due to auto-compactification with corresponding geometry settings. - The upper limit of DB size can't be changed while DB is used. - The DB can grow within the upper size limit defined while opening by a first process, but this does not work under Wine since there is no `NtExtendSection()` function. Partially fix https://github.com/erthink/libmdbx/issues/203
This commit is contained in:
@@ -260,6 +260,7 @@ static int suspend_and_append(mdbx_handle_array_t **array,
|
||||
|
||||
MDBX_INTERNAL_FUNC int
|
||||
mdbx_suspend_threads_before_remap(MDBX_env *env, mdbx_handle_array_t **array) {
|
||||
mdbx_assert(env, (env->me_flags & MDBX_NOTLS) == 0);
|
||||
const uintptr_t CurrentTid = GetCurrentThreadId();
|
||||
int rc;
|
||||
if (env->me_lck_mmap.lck) {
|
||||
@@ -277,12 +278,6 @@ mdbx_suspend_threads_before_remap(MDBX_env *env, mdbx_handle_array_t **array) {
|
||||
if (reader->mr_tid.weak == CurrentTid ||
|
||||
reader->mr_tid.weak == WriteTxnOwner)
|
||||
goto skip_lck;
|
||||
if (env->me_flags & MDBX_NOTLS) {
|
||||
/* Skip duplicates in no-tls mode */
|
||||
for (const MDBX_reader *scan = reader; --scan >= begin;)
|
||||
if (scan->mr_tid.weak == reader->mr_tid.weak)
|
||||
goto skip_lck;
|
||||
}
|
||||
|
||||
rc = suspend_and_append(array, (mdbx_tid_t)reader->mr_tid.weak);
|
||||
if (rc != MDBX_SUCCESS) {
|
||||
|
||||
Reference in New Issue
Block a user