| // Copyright 2009 The RE2 Authors.  All Rights Reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | #include <pthread.h> | 
 |  | 
 | #include "util/util.h" | 
 | #include "util/thread.h" | 
 |  | 
 | Thread::Thread() { | 
 |   pid_ = 0; | 
 |   running_ = 0; | 
 |   joinable_ = 0; | 
 | } | 
 |  | 
 | Thread::~Thread() { | 
 | } | 
 |  | 
 | void *startThread(void *v) { | 
 |   Thread* t = (Thread*)v; | 
 |   t->Run(); | 
 |   return 0; | 
 | } | 
 |  | 
 | void Thread::Start() { | 
 |   CHECK(!running_); | 
 |   pthread_create(&pid_, 0, startThread, this); | 
 |   running_ = true; | 
 |   if (!joinable_) | 
 |     pthread_detach(pid_); | 
 | } | 
 |  | 
 | void Thread::Join() { | 
 |   CHECK(running_); | 
 |   CHECK(joinable_); | 
 |   void *val; | 
 |   pthread_join(pid_, &val); | 
 |   running_ = 0; | 
 | } | 
 |  | 
 | void Thread::SetJoinable(bool j) { | 
 |   CHECK(!running_); | 
 |   joinable_ = j; | 
 | } |