OLD | NEW |
| (Empty) |
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 #include "sandbox/mac/dispatch_source_mach.h" | |
6 | |
7 namespace sandbox { | |
8 | |
9 DispatchSourceMach::DispatchSourceMach(const char* name, | |
10 mach_port_t port, | |
11 void (^event_handler)()) | |
12 // TODO(rsesek): Specify DISPATCH_QUEUE_SERIAL, in the 10.7 SDK. NULL | |
13 // means the same thing but is not symbolically clear. | |
14 : DispatchSourceMach(dispatch_queue_create(name, NULL), | |
15 port, | |
16 event_handler) { | |
17 // Since the queue was created above in the delegated constructor, and it was | |
18 // subsequently retained, release it here. | |
19 dispatch_release(queue_); | |
20 } | |
21 | |
22 DispatchSourceMach::DispatchSourceMach(dispatch_queue_t queue, | |
23 mach_port_t port, | |
24 void (^event_handler)()) | |
25 : queue_(queue), | |
26 source_(dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, | |
27 port, 0, queue_)), | |
28 source_canceled_(dispatch_semaphore_create(0)) { | |
29 dispatch_retain(queue); | |
30 | |
31 dispatch_source_set_event_handler(source_, event_handler); | |
32 dispatch_source_set_cancel_handler(source_, ^{ | |
33 dispatch_semaphore_signal(source_canceled_); | |
34 }); | |
35 } | |
36 | |
37 DispatchSourceMach::~DispatchSourceMach() { | |
38 Cancel(); | |
39 } | |
40 | |
41 void DispatchSourceMach::Resume() { | |
42 dispatch_resume(source_); | |
43 } | |
44 | |
45 void DispatchSourceMach::Cancel() { | |
46 if (source_) { | |
47 dispatch_source_cancel(source_); | |
48 dispatch_release(source_); | |
49 source_ = NULL; | |
50 | |
51 dispatch_semaphore_wait(source_canceled_, DISPATCH_TIME_FOREVER); | |
52 dispatch_release(source_canceled_); | |
53 source_canceled_ = NULL; | |
54 } | |
55 | |
56 if (queue_) { | |
57 dispatch_release(queue_); | |
58 queue_ = NULL; | |
59 } | |
60 } | |
61 | |
62 } // namespace sandbox | |
OLD | NEW |