Class BaseLockManager
- java.lang.Object
-
- org.apache.manifoldcf.core.lockmanager.BaseLockManager
-
- All Implemented Interfaces:
ILockManager
- Direct Known Subclasses:
FileLockManager,ZooKeeperLockManager
public class BaseLockManager extends java.lang.Object implements ILockManager
A lock manager manages locks and shared information across all threads and JVMs and cluster members. There should be no more than ONE instance of this class per thread!!! The factory should enforce this. This is the base lock manager class. Its implementation works solely within one JVM, which makes it ideal for single-process work. Classes that handle multiple JVMs and thus need cross-JVM synchronization are thus expected to extend this class and override pertinent methods.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static classBaseLockManager.LockDescription
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String_rcsidprotected static java.lang.StringactivePrefixA flag prefix, followed by the service type, and then followed by "_" and the service nameprotected static java.lang.StringanonymousServiceNamePrefixAnonymous service name prefix, to be followed by an integerprotected static java.lang.StringanonymousServiceTypeCounterAnonymous global variable name prefix, to be followed by the service typeprotected static java.util.Map<java.lang.String,byte[]>globalDataGlobal resource data.protected static java.util.Map<java.lang.String,java.lang.Boolean>globalFlagsGlobal flag information.protected LocalLockPoollocalLocksprotected LocalLockPoollocalSectionsprotected static LockPoolmyLocksprotected static LockPoolmySectionsprotected static java.lang.StringserviceDataPrefixA data name prefix, followed by the service type, and then followed by "_" and the service name and "_" and the datatypeprotected static java.lang.StringserviceListPrefixA data name prefix, followed by the service type, and then followed by "_" and the instance numberprotected static java.lang.StringservicePrefixA flag prefix, followed by the service type, and then followed by "_" and the service nameprotected static java.lang.StringserviceTypeLockPrefixThe service-type global write lock to control sync, followed by the service typeprotected java.lang.LongthreadIDprotected static intTYPE_READprotected static intTYPE_WRITEprotected static intTYPE_WRITENONEX
-
Constructor Summary
Constructors Constructor Description BaseLockManager()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected static java.lang.StringbuildServiceListEntry(java.lang.String serviceType, int i)protected static java.lang.StringbuildServiceTypeLockName(java.lang.String serviceType)booleancheckGlobalFlag(java.lang.String flagName)Check the condition of a specified flag.booleancheckServiceActive(java.lang.String serviceType, java.lang.String serviceName)Check whether a service is active or not.booleancleanupInactiveService(java.lang.String serviceType, IServiceCleanup cleanup)Clean up any inactive services found.protected static voidclear(java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidclearGlobalFlag(java.lang.String flagName)Clear a flag.voidclearLocks()Clear all outstanding locks in the system.protected java.lang.StringconstructUniqueServiceName(java.lang.String serviceType)Construct a unique service name given the service type.intcountActiveServices(java.lang.String serviceType)Count all active services of a given type.protected voiddeleteServiceData(java.lang.String serviceType, java.lang.String serviceName)voidendServiceActivity(java.lang.String serviceType, java.lang.String serviceName)End service activity.protected static voidenter(java.lang.Long threadID, java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidenterCriticalSections(java.lang.String[] readSectionKeys, java.lang.String[] nonExSectionKeys, java.lang.String[] writeSectionKeys)Enter multiple critical sections simultaneously.voidenterLocks(java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks)Enter multiple locksvoidenterLocksNoWait(java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks)Enter multiple locks simultaneously.protected static voidenterNonExWrite(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidenterNonExWriteCriticalSection(java.lang.String sectionKey)Enter a named, non-exclusive write critical section (NOT a lock).voidenterNonExWriteLock(java.lang.String lockKey)Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").voidenterNonExWriteLockNoWait(java.lang.String lockKey)Enter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers").protected static voidenterNonExWriteNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)protected static voidenterNoWait(java.lang.Long threadID, java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)protected static voidenterRead(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidenterReadCriticalSection(java.lang.String sectionKey)Enter a named, read critical section (NOT a lock).voidenterReadLock(java.lang.String lockKey)Enter a read-only locked area (i.e., block ONLY if there's a writer)voidenterReadLockNoWait(java.lang.String lockKey)Enter a read-only locked area (i.e., block ONLY if there's a writer).protected static voidenterReadNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)protected static voidenterWrite(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidenterWriteCriticalSection(java.lang.String sectionKey)Enter a named, exclusive critical section (NOT a lock).voidenterWriteLock(java.lang.String lockKey)Enter a write locked area (i.e., block out both readers and other writers) NOTE: Can't enter until all readers have left.voidenterWriteLockNoWait(java.lang.String lockKey)Enter a write locked code area (i.e., block out both readers and other writers), but do not wait if the lock cannot be obtained.protected static voidenterWriteNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)protected LockPoolgetGlobalLockPool()Override this method to change the nature of global locks.ManifoldCFConfigurationgetSharedConfiguration()Get the current shared configuration.protected static BaseLockManager.LockDescription[]getSortedUniqueLocks(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks)Process inbound locks into a sorted vector of most-restrictive unique locksprotected static voidleave(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidleaveCriticalSections(java.lang.String[] readSectionKeys, java.lang.String[] nonExSectionKeys, java.lang.String[] writeSectionKeys)Leave multiple critical sections simultaneously.voidleaveLocks(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks)Leave multiple locksprotected static voidleaveNonExWrite(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidleaveNonExWriteCriticalSection(java.lang.String sectionKey)Leave a named, non-exclusive write critical section (NOT a lock).voidleaveNonExWriteLock(java.lang.String lockKey)Leave a non-exclusive write lock.protected static voidleaveRead(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidleaveReadCriticalSection(java.lang.String sectionKey)Leave a named, read critical section (NOT a lock).voidleaveReadLock(java.lang.String lockKey)Leave a read-locked code area.protected static voidleaveWrite(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks)voidleaveWriteCriticalSection(java.lang.String sectionKey)Leave a named, exclusive critical section (NOT a lock).voidleaveWriteLock(java.lang.String lockKey)Leave a write locked code area.protected static java.lang.StringmakeActiveServiceFlagName(java.lang.String serviceType, java.lang.String serviceName)protected static java.lang.StringmakeRegisteredServiceFlagName(java.lang.String serviceType, java.lang.String serviceName)protected static java.lang.StringmakeServiceCounterName(java.lang.String serviceType)Make the service counter name for a service type.protected static java.lang.StringmakeServiceDataName(java.lang.String serviceType, java.lang.String serviceName)byte[]readData(java.lang.String resourceName)Read data from a shared data resource.protected intreadServiceCounter(java.lang.String serviceCounterName)Read service counter.protected byte[]readServiceData(java.lang.String serviceType, java.lang.String serviceName)protected java.lang.StringreadServiceName(java.lang.String resourceName)java.lang.StringregisterServiceBeginServiceActivity(java.lang.String serviceType, java.lang.String serviceName, byte[] initialData, IServiceCleanup cleanup)Register a service and begin service activity.java.lang.StringregisterServiceBeginServiceActivity(java.lang.String serviceType, java.lang.String serviceName, IServiceCleanup cleanup)Register a service and begin service activity.byte[]retrieveServiceData(java.lang.String serviceType, java.lang.String serviceName)Retrieve service data for a service.voidscanServiceData(java.lang.String serviceType, IServiceDataAcceptor dataAcceptor)Scan service data for a service type.voidsetGlobalFlag(java.lang.String flagName)Raise a flag.voidtimedWait(int time)Wait for a time before retrying a lock.voidupdateServiceData(java.lang.String serviceType, java.lang.String serviceName, byte[] serviceData)Set service data for a service.voidwriteData(java.lang.String resourceName, byte[] data)Write data to a shared data resource.protected voidwriteServiceCounter(java.lang.String serviceCounterName, int counter)Write service counter.protected voidwriteServiceData(java.lang.String serviceType, java.lang.String serviceName, byte[] serviceData)protected voidwriteServiceName(java.lang.String resourceName, java.lang.String serviceName)
-
-
-
Field Detail
-
_rcsid
public static final java.lang.String _rcsid
- See Also:
- Constant Field Values
-
TYPE_READ
protected static final int TYPE_READ
- See Also:
- Constant Field Values
-
TYPE_WRITENONEX
protected static final int TYPE_WRITENONEX
- See Also:
- Constant Field Values
-
TYPE_WRITE
protected static final int TYPE_WRITE
- See Also:
- Constant Field Values
-
threadID
protected final java.lang.Long threadID
-
localLocks
protected final LocalLockPool localLocks
-
myLocks
protected static final LockPool myLocks
-
localSections
protected final LocalLockPool localSections
-
mySections
protected static final LockPool mySections
-
globalFlags
protected static final java.util.Map<java.lang.String,java.lang.Boolean> globalFlags
Global flag information. This is used only when all of ManifoldCF is run within one process.
-
globalData
protected static final java.util.Map<java.lang.String,byte[]> globalData
Global resource data. Used only when ManifoldCF is run entirely out of one process.
-
serviceTypeLockPrefix
protected static final java.lang.String serviceTypeLockPrefix
The service-type global write lock to control sync, followed by the service type- See Also:
- Constant Field Values
-
serviceListPrefix
protected static final java.lang.String serviceListPrefix
A data name prefix, followed by the service type, and then followed by "_" and the instance number- See Also:
- Constant Field Values
-
servicePrefix
protected static final java.lang.String servicePrefix
A flag prefix, followed by the service type, and then followed by "_" and the service name- See Also:
- Constant Field Values
-
activePrefix
protected static final java.lang.String activePrefix
A flag prefix, followed by the service type, and then followed by "_" and the service name- See Also:
- Constant Field Values
-
serviceDataPrefix
protected static final java.lang.String serviceDataPrefix
A data name prefix, followed by the service type, and then followed by "_" and the service name and "_" and the datatype- See Also:
- Constant Field Values
-
anonymousServiceNamePrefix
protected static final java.lang.String anonymousServiceNamePrefix
Anonymous service name prefix, to be followed by an integer- See Also:
- Constant Field Values
-
anonymousServiceTypeCounter
protected static final java.lang.String anonymousServiceTypeCounter
Anonymous global variable name prefix, to be followed by the service type- See Also:
- Constant Field Values
-
-
Constructor Detail
-
BaseLockManager
public BaseLockManager() throws ManifoldCFException- Throws:
ManifoldCFException
-
-
Method Detail
-
registerServiceBeginServiceActivity
public java.lang.String registerServiceBeginServiceActivity(java.lang.String serviceType, java.lang.String serviceName, IServiceCleanup cleanup) throws ManifoldCFExceptionRegister a service and begin service activity. This atomic operation creates a permanent registration entry for a service. If the permanent registration entry already exists, this method will not create it or treat it as an error. This operation also enters the "active" zone for the service. The "active" zone will remain in force until it is canceled, or until the process is interrupted. Ideally, the corresponding endServiceActivity method will be called when the service shuts down. Some ILockManager implementations require that this take place for proper management. If the transient registration already exists, it is treated as an error and an exception will be thrown. If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the current service, or all services on the cluster.- Specified by:
registerServiceBeginServiceActivityin interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service to register. If null is passed, a transient unique service name will be created, and will be returned to the caller.cleanup- is called to clean up either the current service, or all services of this type, if no other active service exists. May be null. Local service cleanup is never called if the serviceName argument is null.- Returns:
- the actual service name.
- Throws:
ManifoldCFException
-
registerServiceBeginServiceActivity
public java.lang.String registerServiceBeginServiceActivity(java.lang.String serviceType, java.lang.String serviceName, byte[] initialData, IServiceCleanup cleanup) throws ManifoldCFExceptionRegister a service and begin service activity. This atomic operation creates a permanent registration entry for a service. If the permanent registration entry already exists, this method will not create it or treat it as an error. This operation also enters the "active" zone for the service. The "active" zone will remain in force until it is canceled, or until the process is interrupted. Ideally, the corresponding endServiceActivity method will be called when the service shuts down. Some ILockManager implementations require that this take place for proper management. If the transient registration already exists, it is treated as an error and an exception will be thrown. If registration will succeed, then this method may call an appropriate IServiceCleanup method to clean up either the current service, or all services on the cluster.- Specified by:
registerServiceBeginServiceActivityin interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service to register. If null is passed, a transient unique service name will be created, and will be returned to the caller.initialData- is the initial service data for this service.cleanup- is called to clean up either the current service, or all services of this type, if no other active service exists. May be null. Local service cleanup is never called if the serviceName argument is null.- Returns:
- the actual service name.
- Throws:
ManifoldCFException
-
updateServiceData
public void updateServiceData(java.lang.String serviceType, java.lang.String serviceName, byte[] serviceData) throws ManifoldCFExceptionSet service data for a service.- Specified by:
updateServiceDatain interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service.serviceData- is the data to update to (may be null). This updates the service's transient data (or deletes it). If the service is not active, an exception is thrown.- Throws:
ManifoldCFException
-
retrieveServiceData
public byte[] retrieveServiceData(java.lang.String serviceType, java.lang.String serviceName) throws ManifoldCFExceptionRetrieve service data for a service.- Specified by:
retrieveServiceDatain interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service.- Returns:
- the service's transient data.
- Throws:
ManifoldCFException
-
scanServiceData
public void scanServiceData(java.lang.String serviceType, IServiceDataAcceptor dataAcceptor) throws ManifoldCFExceptionScan service data for a service type. Only active service data will be considered.- Specified by:
scanServiceDatain interfaceILockManager- Parameters:
serviceType- is the type of service.dataAcceptor- is the object that will be notified of each item of data for each service name found.- Throws:
ManifoldCFException
-
countActiveServices
public int countActiveServices(java.lang.String serviceType) throws ManifoldCFExceptionCount all active services of a given type.- Specified by:
countActiveServicesin interfaceILockManager- Parameters:
serviceType- is the service type.- Returns:
- the count.
- Throws:
ManifoldCFException
-
cleanupInactiveService
public boolean cleanupInactiveService(java.lang.String serviceType, IServiceCleanup cleanup) throws ManifoldCFExceptionClean up any inactive services found. Calling this method will invoke cleanup of one inactive service at a time. If there are no inactive services around, then false will be returned. Note that this method will block whatever service it finds from starting up for the time the cleanup is proceeding. At the end of the cleanup, if successful, the service will be atomically unregistered.- Specified by:
cleanupInactiveServicein interfaceILockManager- Parameters:
serviceType- is the service type.cleanup- is the object to call to clean up an inactive service.- Returns:
- true if there were no cleanup operations necessary.
- Throws:
ManifoldCFException
-
endServiceActivity
public void endServiceActivity(java.lang.String serviceType, java.lang.String serviceName) throws ManifoldCFExceptionEnd service activity. This operation exits the "active" zone for the service. This must take place using the same ILockManager object that was used to registerServiceBeginServiceActivity() - which implies that it is the same thread.- Specified by:
endServiceActivityin interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service to exit.- Throws:
ManifoldCFException
-
checkServiceActive
public boolean checkServiceActive(java.lang.String serviceType, java.lang.String serviceName) throws ManifoldCFExceptionCheck whether a service is active or not. This operation returns true if the specified service is considered active at the moment. Once a service is not active anymore, it can only return to activity by calling beginServiceActivity() once more.- Specified by:
checkServiceActivein interfaceILockManager- Parameters:
serviceType- is the type of service.serviceName- is the name of the service to check on.- Returns:
- true if the service is considered active.
- Throws:
ManifoldCFException
-
constructUniqueServiceName
protected java.lang.String constructUniqueServiceName(java.lang.String serviceType) throws ManifoldCFExceptionConstruct a unique service name given the service type.- Throws:
ManifoldCFException
-
makeServiceCounterName
protected static java.lang.String makeServiceCounterName(java.lang.String serviceType)
Make the service counter name for a service type.
-
readServiceCounter
protected int readServiceCounter(java.lang.String serviceCounterName) throws ManifoldCFExceptionRead service counter.- Throws:
ManifoldCFException
-
writeServiceCounter
protected void writeServiceCounter(java.lang.String serviceCounterName, int counter) throws ManifoldCFExceptionWrite service counter.- Throws:
ManifoldCFException
-
writeServiceData
protected void writeServiceData(java.lang.String serviceType, java.lang.String serviceName, byte[] serviceData) throws ManifoldCFException- Throws:
ManifoldCFException
-
readServiceData
protected byte[] readServiceData(java.lang.String serviceType, java.lang.String serviceName) throws ManifoldCFException- Throws:
ManifoldCFException
-
deleteServiceData
protected void deleteServiceData(java.lang.String serviceType, java.lang.String serviceName) throws ManifoldCFException- Throws:
ManifoldCFException
-
makeServiceDataName
protected static java.lang.String makeServiceDataName(java.lang.String serviceType, java.lang.String serviceName)
-
makeActiveServiceFlagName
protected static java.lang.String makeActiveServiceFlagName(java.lang.String serviceType, java.lang.String serviceName)
-
makeRegisteredServiceFlagName
protected static java.lang.String makeRegisteredServiceFlagName(java.lang.String serviceType, java.lang.String serviceName)
-
readServiceName
protected java.lang.String readServiceName(java.lang.String resourceName) throws ManifoldCFException- Throws:
ManifoldCFException
-
writeServiceName
protected void writeServiceName(java.lang.String resourceName, java.lang.String serviceName) throws ManifoldCFException- Throws:
ManifoldCFException
-
buildServiceListEntry
protected static java.lang.String buildServiceListEntry(java.lang.String serviceType, int i)
-
buildServiceTypeLockName
protected static java.lang.String buildServiceTypeLockName(java.lang.String serviceType)
-
getSharedConfiguration
public ManifoldCFConfiguration getSharedConfiguration() throws ManifoldCFException
Get the current shared configuration. This configuration is available in common among all nodes, and thus must not be accessed through here for the purpose of finding configuration data that is specific to any one specific node.- Specified by:
getSharedConfigurationin interfaceILockManager- Throws:
ManifoldCFException
-
setGlobalFlag
public void setGlobalFlag(java.lang.String flagName) throws ManifoldCFExceptionRaise a flag. Use this method to assert a condition, or send a global signal. The flag will be reset when the entire system is restarted.- Specified by:
setGlobalFlagin interfaceILockManager- Parameters:
flagName- is the name of the flag to set.- Throws:
ManifoldCFException
-
clearGlobalFlag
public void clearGlobalFlag(java.lang.String flagName) throws ManifoldCFExceptionClear a flag. Use this method to clear a condition, or retract a global signal.- Specified by:
clearGlobalFlagin interfaceILockManager- Parameters:
flagName- is the name of the flag to clear.- Throws:
ManifoldCFException
-
checkGlobalFlag
public boolean checkGlobalFlag(java.lang.String flagName) throws ManifoldCFExceptionCheck the condition of a specified flag.- Specified by:
checkGlobalFlagin interfaceILockManager- Parameters:
flagName- is the name of the flag to check.- Returns:
- true if the flag is set, false otherwise.
- Throws:
ManifoldCFException
-
readData
public byte[] readData(java.lang.String resourceName) throws ManifoldCFExceptionRead data from a shared data resource. Use this method to read any existing data, or get a null back if there is no such resource. Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.- Specified by:
readDatain interfaceILockManager- Parameters:
resourceName- is the global name of the resource.- Returns:
- a byte array containing the data, or null.
- Throws:
ManifoldCFException
-
writeData
public void writeData(java.lang.String resourceName, byte[] data) throws ManifoldCFExceptionWrite data to a shared data resource. Use this method to write a body of data into a shared resource. Note well that this is not necessarily an atomic operation, and it must thus be protected by a lock.- Specified by:
writeDatain interfaceILockManager- Parameters:
resourceName- is the global name of the resource.data- is the byte array containing the data. Pass null if you want to delete the resource completely.- Throws:
ManifoldCFException
-
timedWait
public final void timedWait(int time) throws ManifoldCFExceptionWait for a time before retrying a lock.- Specified by:
timedWaitin interfaceILockManager- Parameters:
time- is the amount of time to wait, in milliseconds. Zero is a legal value, and will wait no time, but will give up the current timeslice to another thread.- Throws:
ManifoldCFException
-
getGlobalLockPool
protected LockPool getGlobalLockPool()
Override this method to change the nature of global locks.
-
enterNonExWriteLock
public final void enterNonExWriteLock(java.lang.String lockKey) throws ManifoldCFExceptionEnter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers"). This kind of lock is designed to be used in conjunction with read locks. It is used typically in a situation where the read lock represents a query and the non-exclusive write lock represents a modification to an individual item that might affect the query, but where multiple modifications do not individually interfere with one another (use of another, standard, write lock per item can guarantee this).- Specified by:
enterNonExWriteLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterNonExWriteLockNoWait
public final void enterNonExWriteLockNoWait(java.lang.String lockKey) throws ManifoldCFException, LockExceptionDescription copied from interface:ILockManagerEnter a non-exclusive write-locked area (blocking out all readers, but letting in other "writers"). This kind of lock is designed to be used in conjunction with read locks. It is used typically in a situation where the read lock represents a query and the non-exclusive write lock represents a modification to an individual item that might affect the query, but where multiple modifications do not individually interfere with one another (use of another, standard, write lock per item can guarantee this). This method works across JVMs, and will throw LockException if the lock condition cannot be immediately met.- Specified by:
enterNonExWriteLockNoWaitin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFExceptionLockException
-
leaveNonExWriteLock
public final void leaveNonExWriteLock(java.lang.String lockKey) throws ManifoldCFExceptionLeave a non-exclusive write lock.- Specified by:
leaveNonExWriteLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterWriteLock
public final void enterWriteLock(java.lang.String lockKey) throws ManifoldCFExceptionEnter a write locked area (i.e., block out both readers and other writers) NOTE: Can't enter until all readers have left.- Specified by:
enterWriteLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterWriteLockNoWait
public final void enterWriteLockNoWait(java.lang.String lockKey) throws ManifoldCFException, LockExceptionDescription copied from interface:ILockManagerEnter a write locked code area (i.e., block out both readers and other writers), but do not wait if the lock cannot be obtained. Write locks permit only ONE thread to be in the named section, across JVM's as well. In order to guarantee this, an exception (LockException) will be thrown if the lock condition cannot be met immediately.- Specified by:
enterWriteLockNoWaitin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFExceptionLockException
-
leaveWriteLock
public final void leaveWriteLock(java.lang.String lockKey) throws ManifoldCFExceptionDescription copied from interface:ILockManagerLeave a write locked code area. Use this method to exit a write-locked section. The lockKey parameter must correspond to the key used for the enter method.- Specified by:
leaveWriteLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterReadLock
public final void enterReadLock(java.lang.String lockKey) throws ManifoldCFExceptionEnter a read-only locked area (i.e., block ONLY if there's a writer)- Specified by:
enterReadLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterReadLockNoWait
public final void enterReadLockNoWait(java.lang.String lockKey) throws ManifoldCFException, LockExceptionDescription copied from interface:ILockManagerEnter a read-only locked area (i.e., block ONLY if there's a writer). This kind of lock permits multiple threads inside the same code area, but only if there is no "writer" in the same section at the same time. This method works across JVMs, and will throw LockException if the required lock cannot be immediately met.- Specified by:
enterReadLockNoWaitin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFExceptionLockException
-
leaveReadLock
public final void leaveReadLock(java.lang.String lockKey) throws ManifoldCFExceptionDescription copied from interface:ILockManagerLeave a read-locked code area. Use this method to exit a read-locked section. The lockKey parameter must correspond to the key used for the enter method.- Specified by:
leaveReadLockin interfaceILockManager- Parameters:
lockKey- is the name of the lock.- Throws:
ManifoldCFException
-
enterLocks
public final void enterLocks(java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks) throws ManifoldCFExceptionEnter multiple locks- Specified by:
enterLocksin interfaceILockManager- Parameters:
readLocks- is an array of read lock names, or null if there are no read locks desired.nonExWriteLocks- is an array of non-ex write lock names, or null if none desired.writeLocks- is an array of write lock names, or null if there are none desired.- Throws:
ManifoldCFException
-
enterLocksNoWait
public final void enterLocksNoWait(java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks) throws ManifoldCFException, LockExceptionDescription copied from interface:ILockManagerEnter multiple locks simultaneously. Use this method if a series or set of locks needs to be thrown for an operation to take place. This operation will avoid deadlock if all the locks are thrown at the start of the area using this method. This method works cross-JVM, and will throw LockException if the required locks are not available.- Specified by:
enterLocksNoWaitin interfaceILockManager- Parameters:
readLocks- is an array of read lock names, or null if there are no read locks desired.nonExWriteLocks- is an array of non-ex write lock names, or null if none desired.writeLocks- is an array of write lock names, or null if there are none desired.- Throws:
ManifoldCFExceptionLockException
-
leaveLocks
public final void leaveLocks(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks) throws ManifoldCFExceptionLeave multiple locks- Specified by:
leaveLocksin interfaceILockManager- Parameters:
readLocks- is an array of read lock names, or null if there are no read locks desired.writeNonExLocks- is an array of non-ex write lock names, or null if none desired.writeLocks- is an array of write lock names, or null if there are none desired.- Throws:
ManifoldCFException
-
clearLocks
public final void clearLocks() throws ManifoldCFExceptionDescription copied from interface:ILockManagerClear all outstanding locks in the system. This is a very dangerous method to use (obviously)...- Specified by:
clearLocksin interfaceILockManager- Throws:
ManifoldCFException
-
enterReadCriticalSection
public final void enterReadCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionEnter a named, read critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names do not collide with lock names; they have a distinct namespace.- Specified by:
enterReadCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to enter. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
leaveReadCriticalSection
public final void leaveReadCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionLeave a named, read critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names do not collide with lock names; they have a distinct namespace.- Specified by:
leaveReadCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to leave. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
enterNonExWriteCriticalSection
public final void enterNonExWriteCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionEnter a named, non-exclusive write critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names do not collide with lock names; they have a distinct namespace.- Specified by:
enterNonExWriteCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to enter. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
leaveNonExWriteCriticalSection
public final void leaveNonExWriteCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionLeave a named, non-exclusive write critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names do not collide with lock names; they have a distinct namespace.- Specified by:
leaveNonExWriteCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to leave. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
enterWriteCriticalSection
public final void enterWriteCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionEnter a named, exclusive critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names should be distinct from all lock names.- Specified by:
enterWriteCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to enter. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
leaveWriteCriticalSection
public final void leaveWriteCriticalSection(java.lang.String sectionKey) throws ManifoldCFExceptionLeave a named, exclusive critical section (NOT a lock). Critical sections never cross JVM boundaries. Critical section names should be distinct from all lock names.- Specified by:
leaveWriteCriticalSectionin interfaceILockManager- Parameters:
sectionKey- is the name of the section to leave. Only one thread can be in any given named section at a time.- Throws:
ManifoldCFException
-
enterCriticalSections
public final void enterCriticalSections(java.lang.String[] readSectionKeys, java.lang.String[] nonExSectionKeys, java.lang.String[] writeSectionKeys) throws ManifoldCFExceptionEnter multiple critical sections simultaneously.- Specified by:
enterCriticalSectionsin interfaceILockManager- Parameters:
readSectionKeys- is an array of read section descriptors, or null if there are no read sections desired.nonExSectionKeys- is an array of non-ex write section descriptors, or null if none desired.writeSectionKeys- is an array of write section descriptors, or null if there are none desired.- Throws:
ManifoldCFException
-
leaveCriticalSections
public final void leaveCriticalSections(java.lang.String[] readSectionKeys, java.lang.String[] nonExSectionKeys, java.lang.String[] writeSectionKeys) throws ManifoldCFExceptionLeave multiple critical sections simultaneously.- Specified by:
leaveCriticalSectionsin interfaceILockManager- Parameters:
readSectionKeys- is an array of read section descriptors, or null if there are no read sections desired.nonExSectionKeys- is an array of non-ex write section descriptors, or null if none desired.writeSectionKeys- is an array of write section descriptors, or null if there are none desired.- Throws:
ManifoldCFException
-
enterNonExWrite
protected static void enterNonExWrite(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterNonExWriteNoWait
protected static void enterNonExWriteNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException, LockException- Throws:
ManifoldCFExceptionLockException
-
leaveNonExWrite
protected static void leaveNonExWrite(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterWrite
protected static void enterWrite(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterWriteNoWait
protected static void enterWriteNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException, LockException- Throws:
ManifoldCFExceptionLockException
-
leaveWrite
protected static void leaveWrite(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterRead
protected static void enterRead(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterReadNoWait
protected static void enterReadNoWait(java.lang.Long threadID, java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException, LockException- Throws:
ManifoldCFExceptionLockException
-
leaveRead
protected static void leaveRead(java.lang.String lockKey, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
clear
protected static void clear(java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enter
protected static void enter(java.lang.Long threadID, java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
enterNoWait
protected static void enterNoWait(java.lang.Long threadID, java.lang.String[] readLocks, java.lang.String[] nonExWriteLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException, LockException- Throws:
ManifoldCFExceptionLockException
-
leave
protected static void leave(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks, java.lang.String description, LocalLockPool localLocks, LockPool crossLocks) throws ManifoldCFException- Throws:
ManifoldCFException
-
getSortedUniqueLocks
protected static BaseLockManager.LockDescription[] getSortedUniqueLocks(java.lang.String[] readLocks, java.lang.String[] writeNonExLocks, java.lang.String[] writeLocks)
Process inbound locks into a sorted vector of most-restrictive unique locks
-
-