| 
									
										
										
										
											2019-08-25 18:55:56 +03:00
										 |  |  | #include <LibThread/Thread.h>
 | 
					
						
							| 
									
										
										
										
											2019-11-13 21:49:24 +01:00
										 |  |  | #include <pthread.h>
 | 
					
						
							| 
									
										
										
										
											2019-08-25 18:55:56 +03:00
										 |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LibThread::Thread::Thread(Function<int()> action) | 
					
						
							|  |  |  |     : CObject(nullptr) | 
					
						
							|  |  |  |     , m_action(move(action)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LibThread::Thread::~Thread() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_tid != -1) { | 
					
						
							|  |  |  |         dbg() << "trying to destroy a running thread!"; | 
					
						
							|  |  |  |         ASSERT_NOT_REACHED(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void LibThread::Thread::start() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-13 21:49:24 +01:00
										 |  |  |     int rc = pthread_create( | 
					
						
							|  |  |  |         &m_tid, | 
					
						
							|  |  |  |         nullptr, | 
					
						
							|  |  |  |         [](void* arg) -> void* { | 
					
						
							|  |  |  |             Thread* self = static_cast<Thread*>(arg); | 
					
						
							|  |  |  |             int exit_code = self->m_action(); | 
					
						
							|  |  |  |             self->m_tid = -1; | 
					
						
							|  |  |  |             pthread_exit((void*)exit_code); | 
					
						
							|  |  |  |             return (void*)exit_code; | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         static_cast<void*>(this)); | 
					
						
							| 
									
										
										
										
											2019-08-25 18:55:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-13 21:49:24 +01:00
										 |  |  |     ASSERT(rc == 0); | 
					
						
							|  |  |  |     dbg() << "Started a thread, tid = " << m_tid; | 
					
						
							| 
									
										
										
										
											2019-08-25 18:55:56 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void LibThread::Thread::quit(int code) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASSERT(m_tid == gettid()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_tid = -1; | 
					
						
							| 
									
										
										
										
											2019-11-13 21:49:24 +01:00
										 |  |  |     pthread_exit((void*)code); | 
					
						
							| 
									
										
										
										
											2019-08-25 18:55:56 +03:00
										 |  |  | } |