// ********************************************************************** // // Copyright (c) 2003-2010 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** package IceInternal; public class EndpointHostResolver { EndpointHostResolver(Instance instance) { _instance = instance; try { _thread = new HelperThread(); if(_instance.initializationData().properties.getProperty("Ice.ThreadPriority").length() > 0) { _thread.setPriority(Util.getThreadPriorityProperty(_instance.initializationData().properties, "Ice")); } _thread.start(); } catch(RuntimeException ex) { String s = "cannot create thread for endpoint host resolver thread:\n" + Ex.toString(ex); _instance.initializationData().logger.error(s); throw ex; } } synchronized public void resolve(String host, int port, EndpointI endpoint, EndpointI_connectors callback) { // // TODO: Optimize to avoid the lookup if the given host is a textual IPv4 or IPv6 // address. This requires implementing parsing of IPv4/IPv6 addresses (Java does // not provide such methods). // assert(!_destroyed); ResolveEntry entry = new ResolveEntry(); entry.host = host; entry.port = port; entry.endpoint = endpoint; entry.callback = callback; _queue.add(entry); notify(); } synchronized public void destroy() { assert(!_destroyed); _destroyed = true; notify(); } public void joinWithThread() { if(_thread != null) { try { _thread.join(); } catch(InterruptedException ex) { } } } public void run() { while(true) { ResolveEntry resolve; synchronized(this) { while(!_destroyed && _queue.isEmpty()) { try { wait(); } catch(java.lang.InterruptedException ex) { } } if(_destroyed) { break; } resolve = (ResolveEntry)_queue.removeFirst(); } try { resolve.callback.connectors( resolve.endpoint.connectors( Network.getAddresses(resolve.host, resolve.port, _instance.protocolSupport()))); } catch(Ice.LocalException ex) { resolve.callback.exception(ex); } } for(ResolveEntry p : _queue) { p.callback.exception(new Ice.CommunicatorDestroyedException()); } _queue.clear(); } static class ResolveEntry { String host; int port; EndpointI endpoint; EndpointI_connectors callback; } private final Instance _instance; private boolean _destroyed; private java.util.LinkedList<ResolveEntry> _queue = new java.util.LinkedList<ResolveEntry>(); private final class HelperThread extends Thread { HelperThread() { String threadName = _instance.initializationData().properties.getProperty("Ice.ProgramName"); if(threadName.length() > 0) { threadName += "-"; } setName(threadName + "Ice.EndpointHostResolverThread"); } public void run() { try { EndpointHostResolver.this.run(); } catch(java.lang.Exception ex) { String s = "exception in endpoint host resolver thread " + getName() + ":\n" + Ex.toString(ex); _instance.initializationData().logger.error(s); } } } private HelperThread _thread; }