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

org.hyperledger.fabric.shim.helper.Channel Maven / Gradle / Ivy

There is a newer version: 2.5.3
Show newest version
/*
Copyright IBM Corp., DTCC All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package org.hyperledger.fabric.shim.helper;

import java.io.Closeable;
import java.util.HashSet;
import java.util.concurrent.LinkedBlockingQueue;

@SuppressWarnings("serial")
public class Channel extends LinkedBlockingQueue implements Closeable {

    private boolean closed = false;

    private HashSet waiting = new HashSet<>();

    // TODO add other methods to secure closing behavior

    @Override
    public E take() throws InterruptedException {
        synchronized (waiting) {
            if (closed) throw new InterruptedException("Channel closed");
            waiting.add(Thread.currentThread());
        }
        E e = super.take();
        synchronized (waiting) {
            waiting.remove(Thread.currentThread());
        }
        return e;
    }

    @Override
    public boolean add(E e) {
        if (closed) {
            throw new IllegalStateException("Channel is closed");
        }
        return super.add(e);
    }

    @Override
    public void close() {
        synchronized (waiting) {
            closed = true;
            for (Thread t : waiting) {
                t.interrupt();
            }
            waiting.clear();
            clear();
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy