Branch: Tag:

2008-11-18

2008-11-18 19:06:23 by Martin Stjernholm <mast@lysator.liu.se>

Fixed problems with uneven distribution of evaluator callback calls in the
interpreter loop: Changed to a single shared counter for
fast_check_threads_etc(), use the same fast_check_threads_etc interval for
all types of apply calls, and for all types of backward branch calls.

Rev: src/apply_low.h:1.35
Rev: src/interpret.c:1.409
Rev: src/interpret.h:1.176
Rev: src/interpret_functions.h:1.210

2:   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: interpret_functions.h,v 1.209 2008/06/30 13:46:05 mast Exp $ + || $Id: interpret_functions.h,v 1.210 2008/11/18 19:06:23 mast Exp $   */      /*
136:    SET_PROG_COUNTER(addr + tmp); \    FETCH; \    if(tmp < 0) \ -  fast_check_threads_etc(6); \ +  FAST_CHECK_THREADS_ON_BRANCH(); \    } while(0)      #endif /* OVERRIDE_JUMPS */
1384:    low_destruct_objects_to_destruct();       if (cc->continue_reladdr < 0) -  fast_check_threads_etc(6); +  FAST_CHECK_THREADS_ON_BRANCH();    addr = cc->next_addr + cc->continue_reladdr;       DO_IF_DEBUG({
1421:    DO_ALIGN(PTR_TO_INT(addr),    ((ptrdiff_t)sizeof(INT32))));    addr = (PIKE_OPCODE_T *)(((INT32 *)addr) + (tmp>=0 ? 1+tmp*2 : 2*~tmp)); -  if(*(INT32*)addr < 0) fast_check_threads_etc(7); +  if(*(INT32*)addr < 0) FAST_CHECK_THREADS_ON_BRANCH();    pop_stack();    DO_JUMP_TO(addr + *(INT32*)addr);   });
1441:    DO_ALIGN(PTR_TO_INT(addr),    ((ptrdiff_t)sizeof(INT32))));    addr = (PIKE_OPCODE_T *)(((INT32 *)addr) + (tmp>=0 ? 1+tmp*2 : 2*~tmp)); -  if(*(INT32*)addr < 0) fast_check_threads_etc(7); +  if(*(INT32*)addr < 0) FAST_CHECK_THREADS_ON_BRANCH();    DO_JUMP_TO(addr + *(INT32*)addr);   });   
1455:    DO_ALIGN(PTR_TO_INT(addr),    ((ptrdiff_t)sizeof(INT32))));    addr = (PIKE_OPCODE_T *)(((INT32 *)addr) + (tmp>=0 ? 1+tmp*2 : 2*~tmp)); -  if(*(INT32*)addr < 0) fast_check_threads_etc(7); +  if(*(INT32*)addr < 0) FAST_CHECK_THREADS_ON_BRANCH();    DO_JUMP_TO(addr + *(INT32*)addr);   });   
2252:    int args_=(ARGS); \    struct svalue *expected_stack=Pike_sp-args_; \    LOCAL_VAR(struct svalue *s); \ +  FAST_CHECK_THREADS_ON_CALL(); \    s = &Pike_fp->context->prog->constants[arg1].sval; \    if(Pike_interpreter.trace_level) \    { \
2294:    } \   }while(0)   #else - #define DO_CALL_BUILTIN(ARGS) \ - (*(Pike_fp->context->prog->constants[arg1].sval.u.efun->function))(ARGS) + #define DO_CALL_BUILTIN(ARGS) do { \ +  FAST_CHECK_THREADS_ON_CALL(); \ +  (*(Pike_fp->context->prog->constants[arg1].sval.u.efun->function))(ARGS); \ +  } while (0)   #endif      OPCODE1(F_CALL_BUILTIN, "call builtin", I_UPDATE_ALL, {
2434:    SECURITY_BIT_CALL, \    ("Function call permission denied.\n"))); \    \ -  fast_check_threads_etc(6); \ +  FAST_CHECK_THREADS_ON_CALL(); \    check_stack(256); \    \    new_frame=alloc_pike_frame(); \
2572:    PIKE_OPCODE_T *addr;    INT32 args;    -  fast_check_threads_etc(6); +  FAST_CHECK_THREADS_ON_CALL();       JUMP_SET_TO_PC_AT_NEXT (addr);    addr += GET_JUMP();