1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_APPLE_DISPATCH_SOURCE_MACH_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_APPLE_DISPATCH_SOURCE_MACH_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <dispatch/dispatch.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base::apple { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker // This class encapsulates a MACH_RECV dispatch source. When this object is 17*6777b538SAndroid Build Coastguard Worker // destroyed, the source will be cancelled and it will wait for the source 18*6777b538SAndroid Build Coastguard Worker // to stop executing work. The source can run on either a user-supplied queue, 19*6777b538SAndroid Build Coastguard Worker // or it can create its own for the source. 20*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT DispatchSourceMach { 21*6777b538SAndroid Build Coastguard Worker public: 22*6777b538SAndroid Build Coastguard Worker // Creates a new dispatch source for the |port| and schedules it on a new 23*6777b538SAndroid Build Coastguard Worker // queue that will be created with |name|. When a Mach message is received, 24*6777b538SAndroid Build Coastguard Worker // the |event_handler| will be called. 25*6777b538SAndroid Build Coastguard Worker DispatchSourceMach(const char* name, 26*6777b538SAndroid Build Coastguard Worker mach_port_t port, 27*6777b538SAndroid Build Coastguard Worker void (^event_handler)()); 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Creates a new dispatch source with the same semantics as above, but rather 30*6777b538SAndroid Build Coastguard Worker // than creating a new queue, it schedules the source on |queue|. 31*6777b538SAndroid Build Coastguard Worker DispatchSourceMach(dispatch_queue_t queue, 32*6777b538SAndroid Build Coastguard Worker mach_port_t port, 33*6777b538SAndroid Build Coastguard Worker void (^event_handler)()); 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker DispatchSourceMach(const DispatchSourceMach&) = delete; 36*6777b538SAndroid Build Coastguard Worker DispatchSourceMach& operator=(const DispatchSourceMach&) = delete; 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker // Cancels the source and waits for it to become fully cancelled before 39*6777b538SAndroid Build Coastguard Worker // releasing the source. 40*6777b538SAndroid Build Coastguard Worker ~DispatchSourceMach(); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Resumes the source. This must be called before any Mach messages will 43*6777b538SAndroid Build Coastguard Worker // be received. 44*6777b538SAndroid Build Coastguard Worker void Resume(); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker dispatch_queue_t Queue() const; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker private: 49*6777b538SAndroid Build Coastguard Worker struct Storage; 50*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Storage> storage_; 51*6777b538SAndroid Build Coastguard Worker }; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker } // namespace base::apple 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker #endif // BASE_APPLE_DISPATCH_SOURCE_MACH_H_ 56