1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ 6 #define SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ 7 8 #include <dispatch/dispatch.h> 9 10 #include "base/basictypes.h" 11 #include "sandbox/sandbox_export.h" 12 13 namespace sandbox { 14 15 // This class encapsulates a MACH_RECV dispatch source. When this object is 16 // destroyed, the source will be cancelled and it will wait for the source 17 // to stop executing work. The source can run on either a user-supplied queue, 18 // or it can create its own for the source. 19 class SANDBOX_EXPORT DispatchSourceMach { 20 public: 21 // Creates a new dispatch source for the |port| and schedules it on a new 22 // queue that will be created with |name|. When a Mach message is received, 23 // the |event_handler| will be called. 24 DispatchSourceMach(const char* name, 25 mach_port_t port, 26 void (^event_handler)()); 27 28 // Creates a new dispatch source with the same semantics as above, but rather 29 // than creating a new queue, it schedules the source on |queue|. 30 DispatchSourceMach(dispatch_queue_t queue, 31 mach_port_t port, 32 void (^event_handler)()); 33 34 // Cancels the source and waits for it to become fully cancelled before 35 // releasing the source. 36 ~DispatchSourceMach(); 37 38 // Resumes the source. This must be called before any Mach messages will 39 // be received. 40 void Resume(); 41 42 private: 43 // Cancels the source, after which this class will no longer receive Mach 44 // messages. Calling this more than once is a no-op. 45 void Cancel(); 46 47 // The dispatch queue used to service the source_. 48 dispatch_queue_t queue_; 49 50 // A MACH_RECV dispatch source. 51 dispatch_source_t source_; 52 53 // Semaphore used to wait on the |source_|'s cancellation in the destructor. 54 dispatch_semaphore_t source_canceled_; 55 56 DISALLOW_COPY_AND_ASSIGN(DispatchSourceMach); 57 }; 58 59 } // namespace sandbox 60 61 #endif // SANDBOX_MAC_DISPATCH_SOURCE_MACH_H_ 62