summaryrefslogtreecommitdiff
path: root/util/threadwin.cc
blob: d68f2c58b3f4c0559be25da05d978528a60bb1ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 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 "util/thread.h"
#include "util/util.h"

Thread::Thread() {
  pid_ = 0;
  running_ = 0;
  joinable_ = 0;
}

Thread::~Thread() {
}

DWORD WINAPI startThread(void *v) {
  Thread* t = (Thread*)v;
  t->Run();
  return 0;
}

void Thread::Start() {
  CHECK(!running_);
  pid_ = CreateThread(NULL, 0, startThread, this, 0, NULL);
  running_ = true;
  if (!joinable_) {
    CloseHandle(pid_);
    pid_ = 0;
  }
}

void Thread::Join() {
  CHECK(running_);
  CHECK(joinable_);
  if (pid_ != 0)
    WaitForSingleObject(pid_, INFINITE);
  running_ = 0;
}

void Thread::SetJoinable(bool j) {
  CHECK(!running_);
  joinable_ = j;
}