Kernel: Threads are deleted sooner and cleaner
We now delete threads when
    1. it is marked as Terminated and is the current thread
    2. it tries to start execution in Terminated state
This allows us to never have thread executing in Terminated state
			
			
This commit is contained in:
		
							parent
							
								
									a11b5ae41f
								
							
						
					
					
						commit
						e57c1fc9fc
					
				|  | @ -201,13 +201,11 @@ namespace IDT | |||
| 			Kernel::panic("Unhandled exception"); | ||||
| 		} | ||||
| 
 | ||||
| 		// Don't continue exection when terminated
 | ||||
| 		if (Kernel::Thread::current().state() == Kernel::Thread::State::Terminated) | ||||
| 			Kernel::Scheduler::get().execute_current_thread(); | ||||
| 		 | ||||
| 		ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminated); | ||||
| 
 | ||||
| 		if (from_userspace) | ||||
| 		{ | ||||
| 			ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminating); | ||||
| 			ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 			Kernel::Thread::current().load_sse(); | ||||
| 		} | ||||
| 	} | ||||
|  | @ -243,13 +241,11 @@ namespace IDT | |||
| 
 | ||||
| 		Kernel::Scheduler::get().reschedule_if_idling(); | ||||
| 
 | ||||
| 		// Don't continue exection when terminated
 | ||||
| 		if (Kernel::Thread::current().state() == Kernel::Thread::State::Terminated) | ||||
| 			Kernel::Scheduler::get().execute_current_thread(); | ||||
| 		ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminated); | ||||
| 
 | ||||
| 		if (from_userspace) | ||||
| 		{ | ||||
| 			ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminating); | ||||
| 			ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 			Kernel::Thread::current().load_sse(); | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -177,11 +177,7 @@ namespace Kernel | |||
| 
 | ||||
| 		asm volatile("cli"); | ||||
| 
 | ||||
| 		// Don't continue exection when terminated
 | ||||
| 		if (Kernel::Thread::current().state() == Kernel::Thread::State::Terminated) | ||||
| 			Kernel::Scheduler::get().execute_current_thread(); | ||||
| 
 | ||||
| 		ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminating); | ||||
| 		ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 		Thread::current().load_sse(); | ||||
| 
 | ||||
| 		if (ret.is_error()) | ||||
|  |  | |||
|  | @ -31,6 +31,9 @@ namespace Kernel | |||
| 	{ | ||||
| 		CriticalScope _; | ||||
| 
 | ||||
| 		// FIXME: this should not be a requirement
 | ||||
| 		ASSERT(&thread == &Thread::current()); | ||||
| 
 | ||||
| 		if (m_thread.state() == State::Executing || m_thread.m_terminate_blockers > 0) | ||||
| 		{ | ||||
| 			m_thread.m_terminate_blockers++; | ||||
|  | @ -38,8 +41,11 @@ namespace Kernel | |||
| 		} | ||||
| 
 | ||||
| 		if (m_thread.state() == State::Terminating && m_thread.m_terminate_blockers == 0) | ||||
| 		{ | ||||
| 			m_thread.m_state = State::Terminated; | ||||
| 				 | ||||
| 			Scheduler::get().execute_current_thread(); | ||||
| 		} | ||||
| 
 | ||||
| 		while (true) | ||||
| 			Scheduler::get().reschedule(); | ||||
| 	} | ||||
|  | @ -54,17 +60,29 @@ namespace Kernel | |||
| 			return; | ||||
| 
 | ||||
| 		if (m_thread.state() == State::Terminating && m_thread.m_terminate_blockers == 0) | ||||
| 		{ | ||||
| 			m_thread.m_state = State::Terminated; | ||||
| 			Scheduler::get().execute_current_thread(); | ||||
| 		} | ||||
| 
 | ||||
| 		while (true) | ||||
| 			Scheduler::get().reschedule(); | ||||
| 		ASSERT_NOT_REACHED(); | ||||
| 	} | ||||
| 
 | ||||
| 	void Thread::set_terminating() | ||||
| 	{ | ||||
| 		CriticalScope _; | ||||
| 		m_state = m_terminate_blockers == 0 ? State::Terminated : State::Terminating; | ||||
| 		Scheduler::get().unblock_thread(tid()); | ||||
| 		if (m_terminate_blockers == 0) | ||||
| 		{ | ||||
| 			m_state = State::Terminated; | ||||
| 			if (this == &Thread::current()) | ||||
| 				Scheduler::get().execute_current_thread(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			m_state = State::Terminating; | ||||
| 			if (this == &Thread::current()) | ||||
| 				Scheduler::get().unblock_thread(tid()); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	static pid_t s_next_tid = 1; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue