summaryrefslogtreecommitdiffstats
path: root/gfx/2d/JobScheduler_posix.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/2d/JobScheduler_posix.h')
-rw-r--r--gfx/2d/JobScheduler_posix.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/gfx/2d/JobScheduler_posix.h b/gfx/2d/JobScheduler_posix.h
new file mode 100644
index 000000000..cc1bef84e
--- /dev/null
+++ b/gfx/2d/JobScheduler_posix.h
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WIN32
+#ifndef MOZILLA_GFX_TASKSCHEDULER_POSIX_H_
+#define MOZILLA_GFX_TASKSCHEDULER_POSIX_H_
+
+#include <string>
+#include <vector>
+#include <list>
+#include <pthread.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/gfx/CriticalSection.h"
+#include "mozilla/RefCounted.h"
+
+namespace mozilla {
+namespace gfx {
+
+class Job;
+class PosixCondVar;
+class WorkerThread;
+
+// posix platforms only!
+class PosixCondVar {
+public:
+ PosixCondVar() {
+ DebugOnly<int> err = pthread_cond_init(&mCond, nullptr);
+ MOZ_ASSERT(!err);
+ }
+
+ ~PosixCondVar() {
+ DebugOnly<int> err = pthread_cond_destroy(&mCond);
+ MOZ_ASSERT(!err);
+ }
+
+ void Wait(CriticalSection* aMutex) {
+ DebugOnly<int> err = pthread_cond_wait(&mCond, &aMutex->mMutex);
+ MOZ_ASSERT(!err);
+ }
+
+ void Broadcast() {
+ DebugOnly<int> err = pthread_cond_broadcast(&mCond);
+ MOZ_ASSERT(!err);
+ }
+
+protected:
+ pthread_cond_t mCond;
+};
+
+
+/// A simple and naive multithreaded task queue
+///
+/// The public interface of this class must remain identical to its equivalent
+/// in JobScheduler_win32.h
+class MultiThreadedJobQueue {
+public:
+ enum AccessType {
+ BLOCKING,
+ NON_BLOCKING
+ };
+
+ // Producer thread
+ MultiThreadedJobQueue();
+
+ // Producer thread
+ ~MultiThreadedJobQueue();
+
+ // Worker threads
+ bool WaitForJob(Job*& aOutJob);
+
+ // Any thread
+ bool PopJob(Job*& aOutJob, AccessType aAccess);
+
+ // Any threads
+ void SubmitJob(Job* aJob);
+
+ // Producer thread
+ void ShutDown();
+
+ // Any thread
+ size_t NumJobs();
+
+ // Any thread
+ bool IsEmpty();
+
+ // Producer thread
+ void RegisterThread();
+
+ // Worker threads
+ void UnregisterThread();
+
+protected:
+
+ std::list<Job*> mJobs;
+ CriticalSection mMutex;
+ PosixCondVar mAvailableCondvar;
+ PosixCondVar mShutdownCondvar;
+ int32_t mThreadsCount;
+ bool mShuttingDown;
+
+ friend class WorkerThread;
+};
+
+/// An object that a thread can synchronously wait on.
+/// Usually set by a SetEventJob.
+class EventObject : public external::AtomicRefCounted<EventObject>
+{
+public:
+ MOZ_DECLARE_REFCOUNTED_TYPENAME(EventObject)
+
+ EventObject();
+
+ ~EventObject();
+
+ /// Synchronously wait until the event is set.
+ void Wait();
+
+ /// Return true if the event is set, without blocking.
+ bool Peak();
+
+ /// Set the event.
+ void Set();
+
+protected:
+ CriticalSection mMutex;
+ PosixCondVar mCond;
+ bool mIsSet;
+};
+
+} // namespace
+} // namespace
+
+#include "JobScheduler.h"
+
+#endif
+#endif