blob: e38e2c9739964270d6e694aaf8f9b77a4ccbe157 [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.latch;
import com.sleepycat.je.EnvironmentFailureException;
import com.sleepycat.je.dbi.EnvironmentImpl;
public class LatchFactory {
/**
* Creates a SharedLatch using a given LatchContext.
*
* @param exclusiveOnly indicates whether this latch can only be set
* exclusively (not shared).
*/
public static SharedLatch createSharedLatch(final LatchContext context,
final boolean exclusiveOnly) {
if (exclusiveOnly) {
return new LatchImpl(context);
}
return new SharedLatchImpl(false /*fair*/, context);
}
/**
* Creates a SharedLatch, creating a LatchContext from the given name and
* envImpl.
*
* @param exclusiveOnly indicates whether this latch can only be set
* exclusively (not shared).
*/
public static SharedLatch createSharedLatch(final EnvironmentImpl envImpl,
final String name,
final boolean exclusiveOnly) {
if (exclusiveOnly) {
return new LatchImpl(createContext(envImpl, name));
}
return new SharedLatchImpl(
false /*fair*/, createContext(envImpl, name));
}
/**
* Creates a Latch using a given LatchContext.
*
* @param collectStats is true to collect stats. If false, a smaller and
* faster implementation is used.
*/
public static Latch createExclusiveLatch(final LatchContext context,
final boolean collectStats) {
if (collectStats) {
return new LatchWithStatsImpl(context);
}
return new LatchImpl(context);
}
/**
* Creates a Latch, creating a LatchContext from the given name and
* envImpl.
*
* @param collectStats is true to collect stats. If false, a smaller and
* faster implementation is used.
*/
public static Latch createExclusiveLatch(final EnvironmentImpl envImpl,
final String name,
final boolean collectStats) {
if (collectStats) {
return new LatchWithStatsImpl(createContext(envImpl, name));
}
return new LatchImpl(createContext(envImpl, name));
}
private static LatchContext createContext(final EnvironmentImpl envImpl,
final String name) {
return new LatchContext() {
@Override
public int getLatchTimeoutMs() {
return envImpl.getLatchTimeoutMs();
}
@Override
public String getLatchName() {
return name;
}
@Override
public LatchTable getLatchTable() {
return LatchSupport.otherLatchTable;
}
@Override
public EnvironmentImpl getEnvImplForFatalException() {
return envImpl;
}
};
}
/**
* Used for creating latches in tests, with having an EnvironmentImpl.
*/
public static LatchContext createTestLatchContext(final String name) {
return new LatchContext() {
@Override
public int getLatchTimeoutMs() {
return 1000;
}
@Override
public String getLatchName() {
return name;
}
@Override
public LatchTable getLatchTable() {
return LatchSupport.otherLatchTable;
}
@Override
public EnvironmentImpl getEnvImplForFatalException() {
throw EnvironmentFailureException.unexpectedState();
}
};
}
}