|
@@ -200,16 +200,16 @@ void syscall_wrapper_after_syscalldb(void);
|
|
|
|
|
|
void check_stack_hook (void);
|
|
|
|
|
|
-static inline uint64_t get_cur_preempt (void) {
|
|
|
+static inline int64_t get_cur_preempt (void) {
|
|
|
shim_tcb_t* tcb = shim_get_tls();
|
|
|
assert(tcb);
|
|
|
- return tcb->context.preempt;
|
|
|
+ return atomic_read(&tcb->context.preempt);
|
|
|
}
|
|
|
|
|
|
#define BEGIN_SHIM(name, args ...) \
|
|
|
SHIM_ARG_TYPE __shim_##name(args) { \
|
|
|
SHIM_ARG_TYPE ret = 0; \
|
|
|
- uint64_t preempt = get_cur_preempt(); \
|
|
|
+ int64_t preempt = get_cur_preempt(); \
|
|
|
/* handle_signal(); */ \
|
|
|
/* check_stack_hook(); */ \
|
|
|
BEGIN_SYSCALL_PROFILE();
|
|
@@ -467,13 +467,14 @@ static inline PAL_HANDLE thread_create (void * func, void * arg)
|
|
|
return DkThreadCreate(func, arg);
|
|
|
}
|
|
|
|
|
|
-static inline void __disable_preempt (shim_tcb_t * tcb)
|
|
|
+static inline int64_t __disable_preempt (shim_tcb_t * tcb)
|
|
|
{
|
|
|
//tcb->context.syscall_nr += SYSCALL_NR_PREEMPT_INC;
|
|
|
- tcb->context.preempt++;
|
|
|
+ int64_t preempt = atomic_inc_return(&tcb->context.preempt);
|
|
|
/* Assert if this counter overflows */
|
|
|
- assert(tcb->context.preempt != 0);
|
|
|
- //debug("disable preempt: %d\n", tcb->context.preempt);
|
|
|
+ assert(preempt != 0);
|
|
|
+ //debug("disable preempt: %d\n", preempt);
|
|
|
+ return preempt;
|
|
|
}
|
|
|
|
|
|
static inline void disable_preempt (shim_tcb_t * tcb)
|
|
@@ -486,11 +487,10 @@ static inline void disable_preempt (shim_tcb_t * tcb)
|
|
|
|
|
|
static inline void __enable_preempt (shim_tcb_t * tcb)
|
|
|
{
|
|
|
- //tcb->context.syscall_nr -= SYSCALL_NR_PREEMPT_INC;
|
|
|
+ int64_t preempt = atomic_add_return(-1, &tcb->context.preempt);
|
|
|
/* Assert if this counter underflows */
|
|
|
- assert(tcb->context.preempt > 0);
|
|
|
- tcb->context.preempt--;
|
|
|
- //debug("enable preempt: %d\n", tcb->context.preempt);
|
|
|
+ assert(preempt >= 0);
|
|
|
+ //debug("enable preempt: %d\n", preempt);
|
|
|
}
|
|
|
|
|
|
void __handle_signal (shim_tcb_t * tcb, int sig);
|
|
@@ -500,10 +500,11 @@ static inline void enable_preempt (shim_tcb_t * tcb)
|
|
|
if (!tcb && !(tcb = shim_get_tls()))
|
|
|
return;
|
|
|
|
|
|
- if (!tcb->context.preempt)
|
|
|
+ int64_t preempt = atomic_read(&tcb->context.preempt);
|
|
|
+ if (!preempt)
|
|
|
return;
|
|
|
|
|
|
- if (tcb->context.preempt == 1)
|
|
|
+ if (preempt == 1)
|
|
|
__handle_signal(tcb, 0);
|
|
|
|
|
|
__enable_preempt(tcb);
|