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 package org.chromium.mojo.bindings; | |
6 | |
7 import org.chromium.mojo.system.Core; | |
8 import org.chromium.mojo.system.MessagePipeHandle; | |
9 | |
10 import java.util.concurrent.Executor; | |
11 | |
12 /** | |
13 * Wrapper around {@link Router} that will close the connection when not referen
ced anymore. | |
14 */ | |
15 class AutoCloseableRouter implements Router { | |
16 | |
17 /** | |
18 * The underlying router. | |
19 */ | |
20 private final Router mRouter; | |
21 | |
22 /** | |
23 * The executor to close the underlying router. | |
24 */ | |
25 private final Executor mExecutor; | |
26 | |
27 /** | |
28 * Flags to keep track if this router owns an unclosed handle. | |
29 */ | |
30 private boolean mOwnsHandle; | |
31 | |
32 /** | |
33 * Constructor. | |
34 */ | |
35 public AutoCloseableRouter(Core core, Router router) { | |
36 mRouter = router; | |
37 mExecutor = ExecutorFactory.getExecutorForCurrentThread(core); | |
38 mOwnsHandle = true; | |
39 } | |
40 | |
41 /** | |
42 * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder) | |
43 */ | |
44 @Override | |
45 public void setIncomingMessageReceiver(MessageReceiverWithResponder incoming
MessageReceiver) { | |
46 mRouter.setIncomingMessageReceiver(incomingMessageReceiver); | |
47 } | |
48 | |
49 /** | |
50 * @see HandleOwner#passHandle() | |
51 */ | |
52 @Override | |
53 public MessagePipeHandle passHandle() { | |
54 mOwnsHandle = false; | |
55 return mRouter.passHandle(); | |
56 } | |
57 | |
58 /** | |
59 * @see MessageReceiver#accept(Message) | |
60 */ | |
61 @Override | |
62 public boolean accept(Message message) { | |
63 return mRouter.accept(message); | |
64 } | |
65 | |
66 /** | |
67 * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageRec
eiver) | |
68 */ | |
69 @Override | |
70 public boolean acceptWithResponder(Message message, MessageReceiver responde
r) { | |
71 return mRouter.acceptWithResponder(message, responder); | |
72 | |
73 } | |
74 | |
75 /** | |
76 * @see Router#start() | |
77 */ | |
78 @Override | |
79 public void start() { | |
80 mRouter.start(); | |
81 } | |
82 | |
83 /** | |
84 * @see Router#setErrorHandler(ConnectionErrorHandler) | |
85 */ | |
86 @Override | |
87 public void setErrorHandler(ConnectionErrorHandler errorHandler) { | |
88 mRouter.setErrorHandler(errorHandler); | |
89 } | |
90 | |
91 /** | |
92 * @see java.io.Closeable#close() | |
93 */ | |
94 @Override | |
95 public void close() { | |
96 mRouter.close(); | |
97 mOwnsHandle = false; | |
98 } | |
99 | |
100 /** | |
101 * @see Object#finalize() | |
102 */ | |
103 @Override | |
104 protected void finalize() throws Throwable { | |
105 if (mOwnsHandle) { | |
106 mExecutor.execute(new Runnable() { | |
107 | |
108 @Override | |
109 public void run() { | |
110 close(); | |
111 } | |
112 }); | |
113 throw new IllegalStateException("Warning: Router objects should be e
xplicitly closed " + | |
114 "when no longer required otherwise you may leak handles."); | |
115 } | |
116 super.finalize(); | |
117 } | |
118 } | |
OLD | NEW |