Index: sandbox/mac/dispatch_source_mach.h |
diff --git a/sandbox/mac/dispatch_source_mach.h b/sandbox/mac/dispatch_source_mach.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b896f6769e070e39cb35365d16e10dc90f33cbd |
--- /dev/null |
+++ b/sandbox/mac/dispatch_source_mach.h |
@@ -0,0 +1,60 @@ |
+// Copyright 2014 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. |
+ |
+#ifndef SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ |
+#define SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ |
+ |
+#include <dispatch/dispatch.h> |
+ |
+#include "base/basictypes.h" |
+ |
+namespace sandbox { |
+ |
+// This class encapsulates a MACH_RECV dispatch source. When this object is |
+// destructed, the source will be cancelled and it will wait for the source |
Mark Mentovai
2014/07/16 15:45:38
I think “destruct” is an awkward verb and can usua
Robert Sesek
2014/07/16 19:18:17
Done.
|
+// to stop executing work. The source can run on either a user-supplied queue, |
+// or it can create its own for the source. |
+class DispatchSourceMach { |
+ public: |
+ // Creates a new dispatch source for the |port| and schedules it on a new |
+ // queue that will be created with |name|. When a Mach message is received, |
+ // the |event_handler| will be called. |
+ DispatchSourceMach(const char* name, |
+ mach_port_t port, |
+ void (^event_handler)()); |
+ |
+ // Creates a new dispatch source with the same semantics as above, but rather |
+ // than creating a new queue, it schedules the source on |queue|. |
+ DispatchSourceMach(dispatch_queue_t queue, |
+ mach_port_t port, |
+ void (^event_handler)()); |
+ |
+ // Cancels the source and waits for it to become fully cancelled before |
+ // releasing the source. |
+ ~DispatchSourceMach(); |
+ |
+ // Resumes the source. This must be called before any Mach messages will |
+ // be received. |
+ void Resume(); |
+ |
+ // Cancels the source, after which this class will no longer receive Mach |
+ // messages. Calling this more than once is a no-op. |
+ void Cancel(); |
Mark Mentovai
2014/07/16 15:45:38
This can be private.
Robert Sesek
2014/07/16 19:18:17
Done.
|
+ |
+ private: |
+ // The dispatch queue used to service the source_. |
+ dispatch_queue_t queue_; |
+ |
+ // A MACH_RECV dispatch source. |
+ dispatch_source_t source_; |
+ |
+ // Semaphore used to wait on the |source_|'s cancellation in the destructor. |
+ dispatch_semaphore_t source_canceled_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DispatchSourceMach); |
+}; |
+ |
+} // namespace sandbox |
+ |
+#endif // SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ |