38 class ThreadInternalsWindows;
40 ThreadInternalsWindows*
thread;
41 void (*body)(
void*
arg);
49 class ThreadInternalsWindows
52 ThreadInternalsWindows(
void (*thd_body)(
void*
arg),
void*
arg,
bool* success,
61 info_->body = thd_body;
63 info_->join_event =
nullptr;
65 if (
info_->joinable) {
67 if (
info_->join_event ==
nullptr) {
74 if (
options.stack_size() != 0) {
79 handle = CreateThread(
nullptr, 64 * 1024, thread_body,
info_, 0,
nullptr);
91 ~ThreadInternalsWindows()
override {
96 void Start()
override {
103 void Join()
override {
104 DWORD
ret = WaitForSingleObject(
info_->join_event, INFINITE);
110 static DWORD WINAPI thread_body(
void*
v) {
111 g_thd_info =
static_cast<thd_info*
>(
v);
113 while (!g_thd_info->thread->started_) {
114 gpr_cv_wait(&g_thd_info->thread->ready_, &g_thd_info->thread->mu_,
118 if (!g_thd_info->joinable) {
119 delete g_thd_info->thread;
120 g_thd_info->thread =
nullptr;
122 g_thd_info->body(g_thd_info->arg);
123 if (g_thd_info->joinable) {
124 BOOL ret = SetEvent(g_thd_info->join_event);
132 void destroy_thread() {
134 CloseHandle(
info_->join_event);
150 bool* success,
const Options&
options)
152 bool outcome =
false;
162 if (success !=
nullptr) {
170 return reinterpret_cast<gpr_thd_id>(g_thd_info);