diff options
Diffstat (limited to 'sandbox/mac/dispatch_source_mach.cc')
-rw-r--r-- | sandbox/mac/dispatch_source_mach.cc | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/sandbox/mac/dispatch_source_mach.cc b/sandbox/mac/dispatch_source_mach.cc new file mode 100644 index 0000000..a6f3ac8 --- /dev/null +++ b/sandbox/mac/dispatch_source_mach.cc @@ -0,0 +1,62 @@ +// 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. + +#include "sandbox/mac/dispatch_source_mach.h" + +namespace sandbox { + +DispatchSourceMach::DispatchSourceMach(const char* name, + mach_port_t port, + void (^event_handler)()) + // TODO(rsesek): Specify DISPATCH_QUEUE_SERIAL, in the 10.7 SDK. NULL + // means the same thing but is not symbolically clear. + : DispatchSourceMach(dispatch_queue_create(name, NULL), + port, + event_handler) { + // Since the queue was created above in the delegated constructor, and it was + // subsequently retained, release it here. + dispatch_release(queue_); +} + +DispatchSourceMach::DispatchSourceMach(dispatch_queue_t queue, + mach_port_t port, + void (^event_handler)()) + : queue_(queue), + source_(dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, + port, 0, queue_)), + source_canceled_(dispatch_semaphore_create(0)) { + dispatch_retain(queue); + + dispatch_source_set_event_handler(source_, event_handler); + dispatch_source_set_cancel_handler(source_, ^{ + dispatch_semaphore_signal(source_canceled_); + }); +} + +DispatchSourceMach::~DispatchSourceMach() { + Cancel(); +} + +void DispatchSourceMach::Resume() { + dispatch_resume(source_); +} + +void DispatchSourceMach::Cancel() { + if (source_) { + dispatch_source_cancel(source_); + dispatch_release(source_); + source_ = NULL; + + dispatch_semaphore_wait(source_canceled_, DISPATCH_TIME_FOREVER); + dispatch_release(source_canceled_); + source_canceled_ = NULL; + } + + if (queue_) { + dispatch_release(queue_); + queue_ = NULL; + } +} + +} // namespace sandbox |