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);
 | 
							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)
 | 
					void enqueue_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	factor_vm *vm = current_vm_p();
 | 
						factor_vm *vm = current_vm_p();
 | 
				
			||||||
	if (vm)
 | 
						if (vm)
 | 
				
			||||||
		vm->safepoint.enqueue_signal(signal);
 | 
							enqueue_signal(vm, signal);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		fatal_error("Foreign thread received signal", signal);
 | 
							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();
 | 
						factor_vm *vm = current_vm_p();
 | 
				
			||||||
	if (vm)
 | 
						if (vm)
 | 
				
			||||||
		vm->safepoint.enqueue_fep(signal);
 | 
						{
 | 
				
			||||||
 | 
							vm->safepoint.enqueue_fep();
 | 
				
			||||||
 | 
							enqueue_signal(vm, signal);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		fatal_error("Foreign thread received signal", signal);
 | 
							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)
 | 
					static void init_signal_pipe(factor_vm *vm)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	safe_pipe(&vm->signal_pipe_input, &vm->signal_pipe_output);
 | 
						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()
 | 
					void factor_vm::unix_init_signals()
 | 
				
			||||||
| 
						 | 
					@ -443,14 +454,4 @@ void open_console()
 | 
				
			||||||
	start_thread(stdin_loop,NULL);
 | 
						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 factor_vm::init_signals() {}
 | 
				
			||||||
void safepoint_state::report_signal(int fd) volatile {}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
 | 
					THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -289,7 +288,7 @@ static BOOL WINAPI ctrl_handler(DWORD dwCtrlType)
 | 
				
			||||||
		threads. */
 | 
							threads. */
 | 
				
			||||||
		assert(thread_vms.size() == 1);
 | 
							assert(thread_vms.size() == 1);
 | 
				
			||||||
		factor_vm *vm = thread_vms.begin()->second;
 | 
							factor_vm *vm = thread_vms.begin()->second;
 | 
				
			||||||
		vm->safepoint.enqueue_fep(0);
 | 
							vm->safepoint.enqueue_fep();
 | 
				
			||||||
		return TRUE;
 | 
							return TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,19 +8,11 @@ void safepoint_state::enqueue_safepoint() volatile
 | 
				
			||||||
	parent->code->guard_safepoint();
 | 
						parent->code->guard_safepoint();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void safepoint_state::enqueue_fep(cell signal) volatile
 | 
					void safepoint_state::enqueue_fep() volatile
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (parent->fep_p)
 | 
						if (parent->fep_p)
 | 
				
			||||||
		fatal_error("Low-level debugger interrupted", 0);
 | 
							fatal_error("Low-level debugger interrupted", 0);
 | 
				
			||||||
	atomic::store(&fep_p, true);
 | 
						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();
 | 
						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))
 | 
						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)
 | 
							if (foreign_thread_p)
 | 
				
			||||||
			atomic::add(&sample_counts.foreign_thread_sample_count, samples);
 | 
								atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			if (atomic::load(&parent->current_gc_p))
 | 
								if (atomic::load(&parent->current_gc_p))
 | 
				
			||||||
				atomic::fetch_add(&sample_counts.gc_sample_count, samples);
 | 
									atomic::fetch_add(&sample_counts.gc_sample_count, samples);
 | 
				
			||||||
| 
						 | 
					@ -47,8 +39,6 @@ void safepoint_state::handle_safepoint() volatile
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	parent->code->unguard_safepoint();
 | 
						parent->code->unguard_safepoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	report_signal(parent->signal_pipe_input);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (atomic::load(&fep_p))
 | 
						if (atomic::load(&fep_p))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (atomic::load(&parent->sampling_profiler_p))
 | 
							if (atomic::load(&parent->sampling_profiler_p))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,13 +6,11 @@ struct safepoint_state
 | 
				
			||||||
	factor_vm *parent;
 | 
						factor_vm *parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cell fep_p;
 | 
						cell fep_p;
 | 
				
			||||||
	cell queued_signal;
 | 
					 | 
				
			||||||
	profiling_sample_count sample_counts;
 | 
						profiling_sample_count sample_counts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	safepoint_state(factor_vm *parent) :
 | 
						safepoint_state(factor_vm *parent) :
 | 
				
			||||||
		parent(parent),
 | 
							parent(parent),
 | 
				
			||||||
		fep_p(false),
 | 
							fep_p(false),
 | 
				
			||||||
		queued_signal(0),
 | 
					 | 
				
			||||||
		sample_counts()
 | 
							sample_counts()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -21,12 +19,7 @@ struct safepoint_state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void enqueue_safepoint() volatile;
 | 
						void enqueue_safepoint() volatile;
 | 
				
			||||||
	void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile;
 | 
						void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile;
 | 
				
			||||||
	void enqueue_fep(cell signal) volatile;
 | 
						void enqueue_fep() volatile;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// os-*.cpp
 | 
					 | 
				
			||||||
	void enqueue_signal(cell signal) volatile;
 | 
					 | 
				
			||||||
	void report_signal(int fd) volatile;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue