12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // 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 "base/mac/dispatch_source_mach.h"
- namespace base {
- DispatchSourceMach::DispatchSourceMach(const char* name,
- mach_port_t port,
- void (^event_handler)())
- : DispatchSourceMach(dispatch_queue_create(name, DISPATCH_QUEUE_SERIAL),
- 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, base::scoped_policy::RETAIN),
- source_(dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV,
- port, 0, queue_)),
- source_canceled_(dispatch_semaphore_create(0)) {
- dispatch_source_set_event_handler(source_, event_handler);
- dispatch_source_set_cancel_handler(source_, ^{
- dispatch_semaphore_signal(source_canceled_);
- });
- }
- DispatchSourceMach::~DispatchSourceMach() {
- // Cancel the source and wait for the semaphore to be signaled. This will
- // ensure the source managed by this class is not used after it is freed.
- dispatch_source_cancel(source_);
- source_.reset();
- dispatch_semaphore_wait(source_canceled_, DISPATCH_TIME_FOREVER);
- }
- void DispatchSourceMach::Resume() {
- dispatch_resume(source_);
- }
- } // namespace base
|