diff options
| -rw-r--r-- | src/dynarec/dynablock.c | 13 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 4 | ||||
| -rw-r--r-- | src/include/dynablock.h | 1 |
3 files changed, 14 insertions, 4 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 28906f96..d603fdd9 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -221,6 +221,16 @@ void cancelFillBlock() LongJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1); } +#ifndef WIN32 +static int critical_filled = 0; +static sigset_t critical_prot = {0}; +sigset_t old_sig = {0}; +#endif + +void cancelFillBlockCriticalSection() +{ + pthread_sigmask(SIG_SETMASK, &old_sig, NULL); +} /* return NULL if block is not found / cannot be created. Don't create if create==0 @@ -238,9 +248,6 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t } #ifndef WIN32 - static int critical_filled = 0; - static sigset_t critical_prot = {0}; - sigset_t old_sig = {0}; if(!critical_filled) { critical_filled = 1; sigfillset(&critical_prot); diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index e73870c5..961ba441 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -493,8 +493,10 @@ void CancelBlock64(int need_lock) } current_helper = NULL; redundant_helper = NULL; - if(need_lock) + if(need_lock) { mutex_unlock(&my_context->mutex_dyndump); + cancelFillBlockCriticalSection(); + } } uintptr_t native_pass0(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max); diff --git a/src/include/dynablock.h b/src/include/dynablock.h index 650e18cd..42bf34b5 100644 --- a/src/include/dynablock.h +++ b/src/include/dynablock.h @@ -20,6 +20,7 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, // for use in signal handler void cancelFillBlock(void); +void cancelFillBlockCriticalSection(void); // clear instruction cache on a range void ClearCache(void* start, size_t len); |