ThreadObserverI.java

// Copyright (c) ZeroC, Inc.

package com.zeroc.Ice;

import com.zeroc.Ice.Instrumentation.ThreadObserver;
import com.zeroc.Ice.Instrumentation.ThreadState;
import com.zeroc.IceMX.Observer;
import com.zeroc.IceMX.ObserverWithDelegate;
import com.zeroc.IceMX.ThreadMetrics;

/**
 * @hidden Public because it's used by IceMX (via reflection).
 */
public class ThreadObserverI
    extends ObserverWithDelegate<ThreadMetrics, ThreadObserver>
    implements ThreadObserver {
    @Override
    public void stateChanged(final ThreadState oldState, final ThreadState newState) {
        _oldState = oldState;
        _newState = newState;
        forEach(_threadStateUpdate);
        if (_delegate != null) {
            _delegate.stateChanged(oldState, newState);
        }
    }

    private final Observer.MetricsUpdate<ThreadMetrics> _threadStateUpdate =
        new Observer.MetricsUpdate<ThreadMetrics>() {
            @Override
            public void update(ThreadMetrics v) {
                switch (_oldState) {
                    case ThreadStateInUseForIO -> --v.inUseForIO;
                    case ThreadStateInUseForUser -> --v.inUseForUser;
                    case ThreadStateInUseForOther -> --v.inUseForOther;
                    default -> {}
                }
                switch (_newState) {
                    case ThreadStateInUseForIO -> ++v.inUseForIO;
                    case ThreadStateInUseForUser -> ++v.inUseForUser;
                    case ThreadStateInUseForOther -> ++v.inUseForOther;
                    default -> {}
                }
            }
        };

    private ThreadState _oldState;
    private ThreadState _newState;
}