VM: refactoring, new function get_thread_pc() and simpler logic in exception_handler()
							parent
							
								
									2a852915d2
								
							
						
					
					
						commit
						5a39631b4b
					
				| 
						 | 
					@ -228,20 +228,15 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
 | 
				
			||||||
                              (cell)factor::synchronous_signal_handler_impl);
 | 
					                              (cell)factor::synchronous_signal_handler_impl);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return ExceptionContinueExecution;
 | 
					  return ExceptionContinueExecution;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
 | 
					VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void* frame, PCONTEXT c,
 | 
				
			||||||
                                void* dispatch) {
 | 
					                                void* dispatch) {
 | 
				
			||||||
  if (factor_vm::fatal_erroring_p)
 | 
					 | 
				
			||||||
    return ExceptionContinueSearch;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  factor_vm* vm = current_vm_p();
 | 
					  factor_vm* vm = current_vm_p();
 | 
				
			||||||
  if (vm)
 | 
					  if (factor_vm::fatal_erroring_p || !vm)
 | 
				
			||||||
    return vm->exception_handler(e, frame, c, dispatch);
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    return ExceptionContinueSearch;
 | 
					    return ExceptionContinueSearch;
 | 
				
			||||||
 | 
					  return vm->exception_handler(e, frame, c, dispatch);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* On Unix SIGINT (ctrl-c) automatically interrupts blocking io system
 | 
					/* On Unix SIGINT (ctrl-c) automatically interrupts blocking io system
 | 
				
			||||||
| 
						 | 
					@ -306,6 +301,21 @@ void unlock_console() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void close_console() {}
 | 
					void close_console() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cell get_thread_pc(THREADHANDLE th) {
 | 
				
			||||||
 | 
					  DWORD suscount = SuspendThread(th);
 | 
				
			||||||
 | 
					  FACTOR_ASSERT(suscount == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CONTEXT context;
 | 
				
			||||||
 | 
					  memset((void*)&context, 0, sizeof(CONTEXT));
 | 
				
			||||||
 | 
					  context.ContextFlags = CONTEXT_CONTROL;
 | 
				
			||||||
 | 
					  BOOL context_ok = GetThreadContext(th, &context);
 | 
				
			||||||
 | 
					  FACTOR_ASSERT(context_ok);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  suscount = ResumeThread(th);
 | 
				
			||||||
 | 
					  FACTOR_ASSERT(suscount == 1);
 | 
				
			||||||
 | 
					  return context.EIP;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void factor_vm::sampler_thread_loop() {
 | 
					void factor_vm::sampler_thread_loop() {
 | 
				
			||||||
  LARGE_INTEGER counter, new_counter, units_per_second;
 | 
					  LARGE_INTEGER counter, new_counter, units_per_second;
 | 
				
			||||||
  DWORD ok;
 | 
					  DWORD ok;
 | 
				
			||||||
| 
						 | 
					@ -328,22 +338,11 @@ void factor_vm::sampler_thread_loop() {
 | 
				
			||||||
      ++samples;
 | 
					      ++samples;
 | 
				
			||||||
      counter.QuadPart += units_per_second.QuadPart;
 | 
					      counter.QuadPart += units_per_second.QuadPart;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (samples == 0)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (samples > 0) {
 | 
					    cell pc = get_thread_pc(thread);
 | 
				
			||||||
      DWORD suscount = SuspendThread(thread);
 | 
					    safepoint.enqueue_samples(this, samples, pc, false);
 | 
				
			||||||
      FACTOR_ASSERT(suscount == 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      CONTEXT context;
 | 
					 | 
				
			||||||
      memset((void*)&context, 0, sizeof(CONTEXT));
 | 
					 | 
				
			||||||
      context.ContextFlags = CONTEXT_CONTROL;
 | 
					 | 
				
			||||||
      BOOL context_ok = GetThreadContext(thread, &context);
 | 
					 | 
				
			||||||
      FACTOR_ASSERT(context_ok);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      suscount = ResumeThread(thread);
 | 
					 | 
				
			||||||
      FACTOR_ASSERT(suscount == 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      safepoint.enqueue_samples(this, samples, context.EIP, false);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue