def _get_adapted_tick_counter(self): # Normally, the tick counter is decremented by 1 for every message send. # Since we don't know how many messages are called during this trace, we # just decrement by 100th of the trace length (num of bytecodes). trace_length = jit.current_trace_length() decr_by = int(trace_length // 100) return max(decr_by, 1)
def new_jump(self, space, bytecode, frame, cur_pc, target_pc): if target_pc < cur_pc and jit.we_are_jitted(): trace_length = jit.current_trace_length() decr_by = int(trace_length >> 12 | 1) if interrupt_counter.triggers(decr_by=decr_by): switch_to_smalltalk(space.current_ruby_process.get()) return old_jump(self, space, bytecode, frame, cur_pc, target_pc)
def jitted_check_for_interrupt(self, s_frame): if not self.interrupts: return # Normally, the tick counter is decremented by 1 for every message send. # Since we don't know how many messages are called during this trace, we # just divide by 12**2 and make sure it's always at least 1 trace_length = jit.current_trace_length() decr_by = int(trace_length >> 12 | 1) self.quick_check_for_interrupt(s_frame, decr_by)
def jitted_check_for_interrupt(self, s_frame): if not self.interrupts: return # Normally, the tick counter is decremented by 1 for every message send. # Since we don't know how many messages are called during this trace, we # just decrement by 100th of the trace length (num of bytecodes). trace_length = jit.current_trace_length() decr_by = int(trace_length // 100) decr_by = max(decr_by, 1) self.quick_check_for_interrupt(s_frame, decr_by)
def jitted_check_for_interrupt(self, s_frame): if not self.interrupts: return # Normally, the tick counter is decremented by 1 for every message send. # Since we don't know how many messages are called during this trace, we # just decrement by 1000th of the trace length (num of bytecodes). trace_length = jit.current_trace_length() decr_by = int(trace_length // 1000) if decr_by > 0: self.quick_check_for_interrupt(s_frame, decr_by)
def _get_adapted_tick_counter(): # Normally, the tick counter is decremented by 100 for every # Python opcode. Here, to better support JIT compilation of # small loops, we decrement it by a possibly smaller constant. # We get the maximum 100 when the (unoptimized) trace length # is at least 3200 (a bit randomly). trace_length = r_uint(current_trace_length()) decr_by = trace_length // 32 if decr_by < 1: decr_by = 1 elif decr_by > 100: # also if current_trace_length() returned -1 decr_by = 100 return intmask(decr_by)