All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.servicetalk.concurrent.internal.SignalOffloaders Maven / Gradle / Ivy

/*
 * Copyright © 2018 Apple Inc. and the ServiceTalk project authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.servicetalk.concurrent.internal;

import io.servicetalk.concurrent.Executor;

/**
 * A factory for creating different {@link SignalOffloader}s.
 */
public final class SignalOffloaders {

    /**
     * Uses {@link TaskBasedSignalOffloader} for offloading
     */
    private static final SignalOffloaderFactory TASK_BASED_OFFLOADER_FACTORY = new SignalOffloaderFactory() {
        @Override
        public SignalOffloader newSignalOffloader(final Executor executor) {
            return newTaskBasedOffloader(executor);
        }

        @Override
        public boolean hasThreadAffinity() {
            return false;
        }
    };

    /**
     * Uses {@link ThreadBasedSignalOffloader} for offloading
     */
    private static final SignalOffloaderFactory THREAD_BASED_OFFLOADER_FACTORY = new SignalOffloaderFactory() {
        @Override
        public SignalOffloader newSignalOffloader(final Executor executor) {
            return newThreadBasedOffloader(executor);
        }

        @Override
        public boolean hasThreadAffinity() {
            return true;
        }
    };

    private static final SignalOffloaderFactory DEFAULT_OFFLOADER_FACTORY = TASK_BASED_OFFLOADER_FACTORY;

    private SignalOffloaders() {
        // No instances
    }

    /**
     * Return a default {@link SignalOffloaderFactory}.
     *
     * @return The default {@link SignalOffloaderFactory}.
     */
    public static SignalOffloaderFactory defaultOffloaderFactory() {
        return DEFAULT_OFFLOADER_FACTORY;
    }

    /**
     * Return a {@link SignalOffloaderFactory} with thread affinity.
     *
     * @return A {@link SignalOffloaderFactory} with thread affinity..
     */
    public static SignalOffloaderFactory threadBasedOffloaderFactory() {
        return THREAD_BASED_OFFLOADER_FACTORY;
    }

    /**
     * Return a {@link SignalOffloaderFactory} that uses granular tasks for sending signals.
     *
     * @return A {@link SignalOffloaderFactory} that uses granular tasks for sending signals.
     */
    public static SignalOffloaderFactory taskBasedOffloaderFactory() {
        return TASK_BASED_OFFLOADER_FACTORY;
    }

    /**
     * Create a new instance of {@link SignalOffloader} using the passed {@code executor}.
     *
     * @param executor {@link Executor} to be used by the returned {@link SignalOffloader} to offload signals.
     * @return Newly created {@link SignalOffloader}.
     */
    public static SignalOffloader newOffloaderFor(final Executor executor) {
        return executor instanceof SignalOffloaderFactory ?
                ((SignalOffloaderFactory) executor).newSignalOffloader(executor) :
                defaultOffloaderFactory().newSignalOffloader(executor);
    }

    /**
     * Create a new instance of {@link SignalOffloader} using the passed {@code executor} that uses granular tasks for
     * sending signals.
     *
     * @param executor {@link Executor} to be used by the returned {@link SignalOffloader} to offload signals.
     * @return Newly created {@link SignalOffloader}.
     */
    public static SignalOffloader newTaskBasedOffloader(final Executor executor) {
        return new TaskBasedSignalOffloader(executor);
    }

    /**
     * Create a new instance of {@link SignalOffloader} using the passed {@code executor} that captures a thread for
     * its lifetime.
     *
     * @param executor {@link Executor} to be used by the returned {@link SignalOffloader} to offload signals.
     * @return Newly created {@link SignalOffloader}.
     */
    public static SignalOffloader newThreadBasedOffloader(final Executor executor) {
        return new ThreadBasedSignalOffloader(executor);
    }

    /**
     * Returns {@code true} if the passed {@link Executor} honors thread affinity.
     *
     * @param executor {@link Executor} to inspect.
     * @return {@code true} if the passed {@link Executor} honors thread affinity.
     */
    public static boolean hasThreadAffinity(Executor executor) {
        return executor instanceof SignalOffloaderFactory && ((SignalOffloaderFactory) executor).hasThreadAffinity();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy