vm: sample pc on windows
							parent
							
								
									1833beea52
								
							
						
					
					
						commit
						2d87b68a56
					
				| 
						 | 
				
			
			@ -212,9 +212,10 @@ void factor_vm::start_standalone_factor(int argc, vm_char **argv)
 | 
			
		|||
 | 
			
		||||
factor_vm *new_factor_vm()
 | 
			
		||||
{
 | 
			
		||||
	factor_vm *newvm = new factor_vm();
 | 
			
		||||
	THREADHANDLE thread = thread_id();
 | 
			
		||||
	factor_vm *newvm = new factor_vm(thread);
 | 
			
		||||
	register_vm_with_thread(newvm);
 | 
			
		||||
	thread_vms[thread_id()] = newvm;
 | 
			
		||||
	thread_vms[thread] = newvm;
 | 
			
		||||
 | 
			
		||||
	return newvm;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,13 +320,28 @@ void factor_vm::sampler_thread_loop()
 | 
			
		|||
		assert(ok);
 | 
			
		||||
		new_counter.QuadPart *= samples_per_second;
 | 
			
		||||
		cell samples = 0;
 | 
			
		||||
		while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart) {
 | 
			
		||||
			// We would have to suspend the thread to sample the PC
 | 
			
		||||
		while (new_counter.QuadPart - counter.QuadPart > units_per_second.QuadPart)
 | 
			
		||||
		{
 | 
			
		||||
			++samples;
 | 
			
		||||
			counter.QuadPart += units_per_second.QuadPart;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (samples > 0)
 | 
			
		||||
			enqueue_safepoint_sample(samples, 0, false);
 | 
			
		||||
		{
 | 
			
		||||
			DWORD suscount = SuspendThread(thread);
 | 
			
		||||
			assert(suscount == 0);
 | 
			
		||||
 | 
			
		||||
			CONTEXT context;
 | 
			
		||||
			memset((void*)&context, 0, sizeof(CONTEXT));
 | 
			
		||||
			context.ContextFlags = CONTEXT_CONTROL;
 | 
			
		||||
			BOOL context_ok = GetThreadContext(thread, &context);
 | 
			
		||||
			assert(context_ok);
 | 
			
		||||
 | 
			
		||||
			suscount = ResumeThread(thread);
 | 
			
		||||
			assert(suscount == 1);
 | 
			
		||||
 | 
			
		||||
			enqueue_safepoint_sample(samples, context.EIP, false);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ void factor_vm::enqueue_safepoint_sample(cell samples, cell pc, bool foreign_thr
 | 
			
		|||
				atomic::add(&safepoint_sample_counts.gc_sample_count, samples);
 | 
			
		||||
			if (atomic::load(¤t_jit_count) > 0)
 | 
			
		||||
				atomic::add(&safepoint_sample_counts.jit_sample_count, samples);
 | 
			
		||||
			if (pc != 0 && !code->seg->in_segment_p(pc))
 | 
			
		||||
			if (!code->seg->in_segment_p(pc))
 | 
			
		||||
				atomic::add(&safepoint_sample_counts.foreign_sample_count, samples);
 | 
			
		||||
		}
 | 
			
		||||
		code->guard_safepoint();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,9 @@
 | 
			
		|||
namespace factor
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
factor_vm::factor_vm() :
 | 
			
		||||
factor_vm::factor_vm(THREADHANDLE thread) :
 | 
			
		||||
	nursery(0,0),
 | 
			
		||||
        thread(thread),
 | 
			
		||||
	callback_id(0),
 | 
			
		||||
	c_to_factor_func(NULL),
 | 
			
		||||
	counting_profiler_p(false),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,9 @@ struct factor_vm
 | 
			
		|||
	// ^^^^^^
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
        /* Handle to the main thread we run in */
 | 
			
		||||
        THREADHANDLE thread;
 | 
			
		||||
 | 
			
		||||
	/* Data stack and retain stack sizes */
 | 
			
		||||
	cell datastack_size, retainstack_size, callstack_size;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -754,7 +757,7 @@ struct factor_vm
 | 
			
		|||
	void call_fault_handler(exception_type_t exception, exception_data_type_t code, MACH_EXC_STATE_TYPE *exc_state, MACH_THREAD_STATE_TYPE *thread_state, MACH_FLOAT_STATE_TYPE *float_state);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
	factor_vm();
 | 
			
		||||
	factor_vm(THREADHANDLE thread_id);
 | 
			
		||||
	~factor_vm();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue