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 |