// 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 #include "base/basictypes.h" #include "sandbox/sandbox_export.h" namespace sandbox { // This class encapsulates a MACH_RECV dispatch source. When this object is // destroyed, the source will be cancelled and it will wait for the source // to stop executing work. The source can run on either a user-supplied queue, // or it can create its own for the source. class SANDBOX_EXPORT 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(); private: // Cancels the source, after which this class will no longer receive Mach // messages. Calling this more than once is a no-op. void Cancel(); // 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_