Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Unified Diff: ppapi/utility/threading/simple_thread.cc

Issue 9097006: First pass at implementing the MessageLoop interface. This includes a simple (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« ppapi/proxy/ppb_message_loop_proxy.cc ('K') | « ppapi/utility/threading/simple_thread.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698