|
@@ -112,22 +112,19 @@ class Thread {
|
|
}
|
|
}
|
|
|
|
|
|
/// The destructor is strictly optional; either the thread never came to life
|
|
/// The destructor is strictly optional; either the thread never came to life
|
|
- /// and the constructor itself killed it, or it has already been joined and
|
|
|
|
- /// the Join function kills it, or it was detached (non-joinable) and it has
|
|
|
|
- /// run to completion and is now killing itself. The destructor shouldn't have
|
|
|
|
- /// to do anything.
|
|
|
|
- ~Thread() { GPR_ASSERT(!options_.joinable() || impl_ == nullptr); }
|
|
|
|
|
|
+ /// and the constructor itself killed it or it has already been joined and
|
|
|
|
+ /// the Join function kills it. The destructor shouldn't have to do anything.
|
|
|
|
+ ~Thread() { GPR_ASSERT(impl_ == nullptr); }
|
|
|
|
|
|
void Start() {
|
|
void Start() {
|
|
if (impl_ != nullptr) {
|
|
if (impl_ != nullptr) {
|
|
GPR_ASSERT(state_ == ALIVE);
|
|
GPR_ASSERT(state_ == ALIVE);
|
|
state_ = STARTED;
|
|
state_ = STARTED;
|
|
impl_->Start();
|
|
impl_->Start();
|
|
- // If the Thread is not joinable, then the impl_ will cause the deletion
|
|
|
|
- // of this Thread object when the thread function completes. Since no
|
|
|
|
- // other operation is allowed to a detached thread after Start, there is
|
|
|
|
- // no need to change the value of the impl_ or state_ . The next operation
|
|
|
|
- // on this object will be the deletion, which will trigger the destructor.
|
|
|
|
|
|
+ if (!options_.joinable()) {
|
|
|
|
+ state_ = DONE;
|
|
|
|
+ impl_ = nullptr;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
GPR_ASSERT(state_ == FAILED);
|
|
GPR_ASSERT(state_ == FAILED);
|
|
}
|
|
}
|