RequestHandlerCache.java

// Copyright (c) ZeroC, Inc.

package com.zeroc.Ice;

final class RequestHandlerCache {
    RequestHandler getRequestHandler() {
        if (_cacheConnection) {
            synchronized (this) {
                if (_cachedRequestHandler != null) {
                    return _cachedRequestHandler;
                }
            }
        }

        RequestHandler handler = _reference.getRequestHandler();
        if (_cacheConnection) {
            synchronized (this) {
                if (_cachedRequestHandler == null) {
                    _cachedRequestHandler = handler;
                }
                // else ignore handler: another thread cached a handler before we could.
                return _cachedRequestHandler;
            }
        } else {
            return handler;
        }
    }

    public Connection getCachedConnection() {
        if (_cacheConnection) {
            RequestHandler handler;
            synchronized (this) {
                handler = _cachedRequestHandler;
            }
            if (handler != null) {
                return handler.getConnection();
            }
        }
        return null;
    }

    void clearCachedRequestHandler(RequestHandler handler) {
        if (_cacheConnection) {
            synchronized (this) {
                if (handler == _cachedRequestHandler) {
                    _cachedRequestHandler = null;
                }
            }
        }
    }

    public RequestHandlerCache(Reference reference) {
        _reference = reference;
        _cacheConnection = reference.getCacheConnection();
    }

    private final Reference _reference;
    private final boolean _cacheConnection;
    private RequestHandler _cachedRequestHandler;
}