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; | 		bool will_execute_signal() const; | ||||||
| 		// Returns true if handled signal had SA_RESTART
 | 		// Returns true if handled signal had SA_RESTART
 | ||||||
| 		bool handle_signal(int signal = 0); | 		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
 | 		// 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
 | 		// 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); | 			LockGuard _(m_process_lock); | ||||||
| 			for (auto* thread : m_threads) | 			for (auto* thread : m_threads) | ||||||
| 				if (thread != &Thread::current()) | 				if (thread != &Thread::current()) | ||||||
| 					ASSERT(thread->add_signal(SIGKILL)); | 					thread->add_signal(SIGKILL); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		while (m_threads.size() > 1) | 		while (m_threads.size() > 1) | ||||||
|  |  | ||||||
|  | @ -619,7 +619,7 @@ namespace Kernel | ||||||
| 		return has_sa_restart; | 		return has_sa_restart; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Thread::add_signal(int signal) | 	void Thread::add_signal(int signal) | ||||||
| 	{ | 	{ | ||||||
| 		SpinLockGuard _(m_signal_lock); | 		SpinLockGuard _(m_signal_lock); | ||||||
| 		if (m_process) | 		if (m_process) | ||||||
|  | @ -631,19 +631,16 @@ namespace Kernel | ||||||
| 				signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler; | 				signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler; | ||||||
| 			} | 			} | ||||||
| 			if (signal_handler == (vaddr_t)SIG_IGN) | 			if (signal_handler == (vaddr_t)SIG_IGN) | ||||||
| 				return false; | 				return; | ||||||
| 			if (signal_handler == (vaddr_t)SIG_DFL && is_default_ignored_signal(signal)) | 			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; | ||||||
| 			m_signal_pending_mask |= mask; | 
 | ||||||
| 			if (this != &Thread::current()) | 		if (this != &Thread::current()) | ||||||
| 				Processor::scheduler().unblock_thread(this); | 			Processor::scheduler().unblock_thread(this); | ||||||
| 			return true; |  | ||||||
| 		} |  | ||||||
| 		return false; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns) | 	BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue