vm: write signals to pipe immediately
The whole point is to wake up the mx without waiting for the next safepoint derpdb4
							parent
							
								
									0e3c315099
								
							
						
					
					
						commit
						04c6b2c393
					
				| 
						 | 
				
			
			@ -180,11 +180,19 @@ void synchronous_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 | 
			
		|||
		fatal_error("Foreign thread received signal", signal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void safe_write(int fd, void *data, ssize_t size);
 | 
			
		||||
 | 
			
		||||
static void enqueue_signal(factor_vm *vm, int signal)
 | 
			
		||||
{
 | 
			
		||||
	if (vm->signal_pipe_output != 0)
 | 
			
		||||
		safe_write(vm->signal_pipe_output, &signal, sizeof(int));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void enqueue_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 | 
			
		||||
{
 | 
			
		||||
	factor_vm *vm = current_vm_p();
 | 
			
		||||
	if (vm)
 | 
			
		||||
		vm->safepoint.enqueue_signal(signal);
 | 
			
		||||
		enqueue_signal(vm, signal);
 | 
			
		||||
	else
 | 
			
		||||
		fatal_error("Foreign thread received signal", signal);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -193,7 +201,10 @@ void fep_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 | 
			
		|||
{
 | 
			
		||||
	factor_vm *vm = current_vm_p();
 | 
			
		||||
	if (vm)
 | 
			
		||||
		vm->safepoint.enqueue_fep(signal);
 | 
			
		||||
	{
 | 
			
		||||
		vm->safepoint.enqueue_fep();
 | 
			
		||||
		enqueue_signal(vm, signal);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		fatal_error("Foreign thread received signal", signal);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -268,7 +279,7 @@ static void safe_pipe(int *in, int *out)
 | 
			
		|||
static void init_signal_pipe(factor_vm *vm)
 | 
			
		||||
{
 | 
			
		||||
	safe_pipe(&vm->signal_pipe_input, &vm->signal_pipe_output);
 | 
			
		||||
	vm->special_objects[OBJ_SIGNAL_PIPE] = tag_fixnum(vm->signal_pipe_output);
 | 
			
		||||
	vm->special_objects[OBJ_SIGNAL_PIPE] = tag_fixnum(vm->signal_pipe_input);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::unix_init_signals()
 | 
			
		||||
| 
						 | 
				
			
			@ -443,14 +454,4 @@ void open_console()
 | 
			
		|||
	start_thread(stdin_loop,NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void safepoint_state::report_signal(int fd) volatile
 | 
			
		||||
{
 | 
			
		||||
	int signal = (int)atomic::load(&queued_signal);
 | 
			
		||||
	if (signal != 0)
 | 
			
		||||
	{
 | 
			
		||||
		safe_write(fd, &signal, sizeof(int));
 | 
			
		||||
		atomic::store(&queued_signal, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -169,7 +169,6 @@ void factor_vm::move_file(const vm_char *path1, const vm_char *path2)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::init_signals() {}
 | 
			
		||||
void safepoint_state::report_signal(int fd) volatile {}
 | 
			
		||||
 | 
			
		||||
THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -289,7 +288,7 @@ static BOOL WINAPI ctrl_handler(DWORD dwCtrlType)
 | 
			
		|||
		threads. */
 | 
			
		||||
		assert(thread_vms.size() == 1);
 | 
			
		||||
		factor_vm *vm = thread_vms.begin()->second;
 | 
			
		||||
		vm->safepoint.enqueue_fep(0);
 | 
			
		||||
		vm->safepoint.enqueue_fep();
 | 
			
		||||
		return TRUE;
 | 
			
		||||
	}
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,19 +8,11 @@ void safepoint_state::enqueue_safepoint() volatile
 | 
			
		|||
	parent->code->guard_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void safepoint_state::enqueue_fep(cell signal) volatile
 | 
			
		||||
void safepoint_state::enqueue_fep() volatile
 | 
			
		||||
{
 | 
			
		||||
	if (parent->fep_p)
 | 
			
		||||
		fatal_error("Low-level debugger interrupted", 0);
 | 
			
		||||
	atomic::store(&fep_p, true);
 | 
			
		||||
	if (signal != 0)
 | 
			
		||||
		atomic::store(&queued_signal, signal);
 | 
			
		||||
	enqueue_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void safepoint_state::enqueue_signal(cell signal) volatile
 | 
			
		||||
{
 | 
			
		||||
	atomic::store(&queued_signal, signal);
 | 
			
		||||
	enqueue_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -28,9 +20,9 @@ void safepoint_state::enqueue_samples(cell samples, cell pc, bool foreign_thread
 | 
			
		|||
{
 | 
			
		||||
	if (atomic::load(&parent->sampling_profiler_p))
 | 
			
		||||
	{
 | 
			
		||||
		atomic::add(&sample_counts.sample_count, samples);
 | 
			
		||||
		atomic::fetch_add(&sample_counts.sample_count, samples);
 | 
			
		||||
		if (foreign_thread_p)
 | 
			
		||||
			atomic::add(&sample_counts.foreign_thread_sample_count, samples);
 | 
			
		||||
			atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
 | 
			
		||||
		else {
 | 
			
		||||
			if (atomic::load(&parent->current_gc_p))
 | 
			
		||||
				atomic::fetch_add(&sample_counts.gc_sample_count, samples);
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +39,6 @@ void safepoint_state::handle_safepoint() volatile
 | 
			
		|||
{
 | 
			
		||||
	parent->code->unguard_safepoint();
 | 
			
		||||
 | 
			
		||||
	report_signal(parent->signal_pipe_input);
 | 
			
		||||
 | 
			
		||||
	if (atomic::load(&fep_p))
 | 
			
		||||
	{
 | 
			
		||||
		if (atomic::load(&parent->sampling_profiler_p))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,13 +6,11 @@ struct safepoint_state
 | 
			
		|||
	factor_vm *parent;
 | 
			
		||||
 | 
			
		||||
	cell fep_p;
 | 
			
		||||
	cell queued_signal;
 | 
			
		||||
	profiling_sample_count sample_counts;
 | 
			
		||||
 | 
			
		||||
	safepoint_state(factor_vm *parent) :
 | 
			
		||||
		parent(parent),
 | 
			
		||||
		fep_p(false),
 | 
			
		||||
		queued_signal(0),
 | 
			
		||||
		sample_counts()
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,12 +19,7 @@ struct safepoint_state
 | 
			
		|||
 | 
			
		||||
	void enqueue_safepoint() volatile;
 | 
			
		||||
	void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile;
 | 
			
		||||
	void enqueue_fep(cell signal) volatile;
 | 
			
		||||
 | 
			
		||||
	// os-*.cpp
 | 
			
		||||
	void enqueue_signal(cell signal) volatile;
 | 
			
		||||
	void report_signal(int fd) volatile;
 | 
			
		||||
 | 
			
		||||
	void enqueue_fep() volatile;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue