blob: 76ca415bf199a1dca8ee1a038b0b429b390fdc3c [file] [log] [blame]
/*
* Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
package org.eclipse.persistence.internal.helper.type;
import org.eclipse.persistence.internal.helper.ConcurrencyManager;
/**
* Helper type that tells us for a given cache key what threads are having some sort of relationship to the cache key (e.g
* acquired the cache key as an active thread, have a deferred lock on the cache key or have incremented the counter of
* readers on the lock or simply are stuck waiting for the cache key to be available.
*/
public class IsBuildObjectCompleteOutcome {
/**
* Algorithm can return null when it detects that the object is fully built ant the thread should be allowed to
* progresses.
*/
public static final IsBuildObjectCompleteOutcome BUILD_OBJECT_IS_COMPLETE_TRUE = null;
/**
* This the thread that at some recursion depth is making the thread that needed to defer locks stop progressing
*/
private final Thread threadBlockingTheDeferringThreadFromFinishing;
/**
* This is the cache key that is being owned by the blocking thread.
*/
private final ConcurrencyManager cacheKeyOwnedByBlockingThread;
/**
* Create a new IsBuildObjectCompleteOutcome.
*
* @param threadBlockingTheDeferringThreadFromFinishing
* the thread that during going in deep in the recursion is discovered as blocking our initial thread
* @param cacheKeyOwnedByBlockingThread
* the cache key that the blocking thread is currently owning and not releasing.
*/
public IsBuildObjectCompleteOutcome(Thread threadBlockingTheDeferringThreadFromFinishing,
ConcurrencyManager cacheKeyOwnedByBlockingThread) {
super();
this.threadBlockingTheDeferringThreadFromFinishing = threadBlockingTheDeferringThreadFromFinishing;
this.cacheKeyOwnedByBlockingThread = cacheKeyOwnedByBlockingThread;
}
/** Getter for {@link #threadBlockingTheDeferringThreadFromFinishing} */
public Thread getThreadBlockingTheDeferringThreadFromFinishing() {
return threadBlockingTheDeferringThreadFromFinishing;
}
/** Getter for {@link #cacheKeyOwnedByBlockingThread} */
public ConcurrencyManager getCacheKeyOwnedByBlockingThread() {
return cacheKeyOwnedByBlockingThread;
}
}