| 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 |