mirror of
https://github.com/isar/libmdbx.git
synced 2025-07-18 02:54:43 +08:00
mdbx: исправление resurrect-after-fork при использовании SysV-семафоров (MDBX_LOCKING=5
).
Ошибка/недоработка была с первой реализации resurrect-after-fork в ноябре 2023, но оставалась не замеченной из-за отсутствия CI-тестирования на платформе OSX/Mac (где нет поддержки разделяемых мьютексов).
This commit is contained in:
parent
90a4e1847d
commit
2b115069c1
@ -457,6 +457,10 @@ __cold MDBX_INTERNAL int lck_destroy(MDBX_env *env, MDBX_env *inprocess_neighbor
|
|||||||
jitter4testing(false);
|
jitter4testing(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if MDBX_LOCKING == MDBX_LOCKING_SYSV
|
||||||
|
env->me_sysv_ipc.semid = -1;
|
||||||
|
#endif /* MDBX_LOCKING */
|
||||||
|
|
||||||
if (current_pid != env->pid) {
|
if (current_pid != env->pid) {
|
||||||
eASSERT(env, !inprocess_neighbor);
|
eASSERT(env, !inprocess_neighbor);
|
||||||
NOTICE("drown env %p after-fork pid %d -> %d", __Wpedantic_format_voidptr(env), env->pid, current_pid);
|
NOTICE("drown env %p after-fork pid %d -> %d", __Wpedantic_format_voidptr(env), env->pid, current_pid);
|
||||||
@ -773,14 +777,14 @@ static int osal_ipclock_lock(MDBX_env *env, osal_ipclock_t *ipc, const bool dont
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int osal_ipclock_unlock(MDBX_env *env, osal_ipclock_t *ipc) {
|
static int osal_ipclock_unlock(MDBX_env *env, osal_ipclock_t *ipc) {
|
||||||
int err = MDBX_ENOSYS;
|
int err = MDBX_ENOSYS;
|
||||||
#if MDBX_LOCKING == MDBX_LOCKING_POSIX2001 || MDBX_LOCKING == MDBX_LOCKING_POSIX2008
|
#if MDBX_LOCKING == MDBX_LOCKING_POSIX2001 || MDBX_LOCKING == MDBX_LOCKING_POSIX2008
|
||||||
err = pthread_mutex_unlock(ipc);
|
err = pthread_mutex_unlock(ipc);
|
||||||
#elif MDBX_LOCKING == MDBX_LOCKING_POSIX1988
|
#elif MDBX_LOCKING == MDBX_LOCKING_POSIX1988
|
||||||
err = sem_post(ipc) ? errno : MDBX_SUCCESS;
|
err = sem_post(ipc) ? errno : MDBX_SUCCESS;
|
||||||
#elif MDBX_LOCKING == MDBX_LOCKING_SYSV
|
#elif MDBX_LOCKING == MDBX_LOCKING_SYSV
|
||||||
if (unlikely(*ipc != (pid_t)env->pid))
|
if (unlikely(*ipc != (pid_t)env->pid || env->me_sysv_ipc.key == -1))
|
||||||
err = EPERM;
|
err = EPERM;
|
||||||
else {
|
else {
|
||||||
*ipc = 0;
|
*ipc = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user