| Index: ppapi/utility/threading/simple_thread.cc
|
| diff --git a/ppapi/utility/threading/simple_thread.cc b/ppapi/utility/threading/simple_thread.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ff2ccd462da6e2ca499e26d53a3103010692cf5a
|
| --- /dev/null
|
| +++ b/ppapi/utility/threading/simple_thread.cc
|
| @@ -0,0 +1,92 @@
|
| +// Copyright (c) 2012 The Chromium 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 "ppapi/utility/threading/simple_thread.h"
|
| +
|
| +namespace pp {
|
| +
|
| +namespace {
|
| +
|
| +struct ThreadData {
|
| + MessageLoop_Dev message_loop;
|
| +
|
| + SimpleThread::ThreadFunc func;
|
| + void* user_data;
|
| +};
|
| +
|
| +#ifdef WIN32
|
| +DWORD WINAPI RunThread(void* void_data) {
|
| +#else
|
| +void* RunThread(void* void_data) {
|
| +#endif
|
| + ThreadData* data = static_cast<ThreadData*>(void_data);
|
| + data->message_loop.AttachToCurrentThread();
|
| +
|
| + if (data->func)
|
| + data->func(data->message_loop, data->user_data);
|
| + else
|
| + data->message_loop.Run();
|
| +
|
| + delete data;
|
| + return NULL;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +SimpleThread::SimpleThread(Instance* instance)
|
| + : instance_(instance),
|
| + message_loop_(instance),
|
| + thread_(0) {
|
| +}
|
| +
|
| +SimpleThread::~SimpleThread() {
|
| + Join();
|
| +}
|
| +
|
| +bool SimpleThread::Start() {
|
| + return StartWithFunction(NULL, NULL);
|
| +}
|
| +
|
| +bool SimpleThread::Join() {
|
| + if (!thread_)
|
| + return false;
|
| +
|
| + message_loop_.PostQuit(true);
|
| +
|
| +#ifdef WIN32
|
| + DWORD result = WaitForSingleObject(thread_, INFINITE);
|
| + CloseHandle(thread_);
|
| + thread_ = 0;
|
| + return result == WAIT_OBJECT_0;
|
| +
|
| +#else
|
| + void* retval;
|
| + int result = pthread_join(thread_, &retval);
|
| + thread_ = 0;
|
| + return result == 0;
|
| +#endif
|
| +}
|
| +
|
| +bool SimpleThread::StartWithFunction(ThreadFunc func, void* user_data) {
|
| + if (thread_)
|
| + return false;
|
| +
|
| + ThreadData* data = new ThreadData;
|
| + data->message_loop = message_loop_;
|
| + data->func = func;
|
| + data->user_data = user_data;
|
| +
|
| +#ifdef WIN32
|
| + thread_ = CreateThread(NULL, 0, &RunThread, data, NULL);
|
| + if (!thread_) {
|
| +#else
|
| + if (pthread_create(&thread_, NULL, &RunThread, data) != 0) {
|
| +#endif
|
| + delete data;
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace pp
|
|
|