forked from Bananymous/banan-os
				
			Kernel: Allow adding signals to thread that are blocked
This commit is contained in:
		
							parent
							
								
									84f579be81
								
							
						
					
					
						commit
						49122cf729
					
				|  | @ -59,7 +59,7 @@ namespace Kernel | |||
| 		bool will_execute_signal() const; | ||||
| 		// Returns true if handled signal had SA_RESTART
 | ||||
| 		bool handle_signal(int signal = 0); | ||||
| 		bool add_signal(int signal); | ||||
| 		void add_signal(int signal); | ||||
| 
 | ||||
| 		// blocks current thread and returns either on unblock, eintr, spuriously or after timeout
 | ||||
| 		// if mutex is not nullptr, it will be atomically freed before blocking and automatically locked on wake
 | ||||
|  |  | |||
|  | @ -309,7 +309,7 @@ namespace Kernel | |||
| 			LockGuard _(m_process_lock); | ||||
| 			for (auto* thread : m_threads) | ||||
| 				if (thread != &Thread::current()) | ||||
| 					ASSERT(thread->add_signal(SIGKILL)); | ||||
| 					thread->add_signal(SIGKILL); | ||||
| 		} | ||||
| 
 | ||||
| 		while (m_threads.size() > 1) | ||||
|  |  | |||
|  | @ -619,7 +619,7 @@ namespace Kernel | |||
| 		return has_sa_restart; | ||||
| 	} | ||||
| 
 | ||||
| 	bool Thread::add_signal(int signal) | ||||
| 	void Thread::add_signal(int signal) | ||||
| 	{ | ||||
| 		SpinLockGuard _(m_signal_lock); | ||||
| 		if (m_process) | ||||
|  | @ -631,19 +631,16 @@ namespace Kernel | |||
| 				signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler; | ||||
| 			} | ||||
| 			if (signal_handler == (vaddr_t)SIG_IGN) | ||||
| 				return false; | ||||
| 				return; | ||||
| 			if (signal_handler == (vaddr_t)SIG_DFL && is_default_ignored_signal(signal)) | ||||
| 				return false; | ||||
| 				return; | ||||
| 		} | ||||
| 		uint64_t mask = 1ull << signal; | ||||
| 		if (!(m_signal_block_mask & mask)) | ||||
| 		{ | ||||
| 
 | ||||
| 		const uint64_t mask = 1ull << signal; | ||||
| 		m_signal_pending_mask |= mask; | ||||
| 
 | ||||
| 		if (this != &Thread::current()) | ||||
| 			Processor::scheduler().unblock_thread(this); | ||||
| 			return true; | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue