Class AbstractGammaObject

java.lang.Object
org.multiverse.stms.gamma.transactionalobjects.AbstractGammaObject
All Implemented Interfaces:
Lock, MultiverseConstants, GammaConstants, GammaObject
Direct Known Subclasses:
BaseGammaTxnRef

public abstract class AbstractGammaObject extends Object implements GammaObject, Lock
  • Field Details

    • MASK_OREC_EXCLUSIVELOCK

      public static final long MASK_OREC_EXCLUSIVELOCK
      See Also:
    • MASK_OREC_UPDATELOCK

      public static final long MASK_OREC_UPDATELOCK
      See Also:
    • MASK_OREC_READBIASED

      public static final long MASK_OREC_READBIASED
      See Also:
    • MASK_OREC_READLOCKS

      public static final long MASK_OREC_READLOCKS
      See Also:
    • MASK_OREC_SURPLUS

      public static final long MASK_OREC_SURPLUS
      See Also:
    • MASK_OREC_READONLY_COUNT

      public static final long MASK_OREC_READONLY_COUNT
      See Also:
    • ___unsafe

      protected static final sun.misc.Unsafe ___unsafe
    • listenersOffset

      protected static final long listenersOffset
    • valueOffset

      protected static final long valueOffset
    • stm

      public final GammaStm stm
    • listeners

      public volatile Listeners listeners
    • version

      public volatile long version
    • orec

      public volatile long orec
    • identityHashCode

      protected int identityHashCode
    • readBiasedThreshold

      private final int readBiasedThreshold
  • Constructor Details

    • AbstractGammaObject

      public AbstractGammaObject(GammaStm stm)
  • Method Details

    • getVersion

      public final long getVersion()
      Specified by:
      getVersion in interface GammaObject
    • getStm

      public final GammaStm getStm()
      Specified by:
      getStm in interface GammaObject
    • getLock

      public final Lock getLock()
      Specified by:
      getLock in interface GammaObject
    • ___removeListenersAfterWrite

      public final Listeners ___removeListenersAfterWrite()
    • identityHashCode

      public final int identityHashCode()
      Specified by:
      identityHashCode in interface GammaObject
    • atomicGetLockModeAsInt

      public final int atomicGetLockModeAsInt()
    • atomicGetLockMode

      public final LockMode atomicGetLockMode()
      Description copied from interface: Lock
      Returns the current LockMode. This call doesn't look at any running transaction, it shows the actual state of the Lock. The value could be stale as soon as it is received. To retrieve the LockMode a a Txn has on a Lock, the Lock.getLockMode() or Lock.getLockMode(Txn) need to be used.
      Specified by:
      atomicGetLockMode in interface Lock
      Returns:
      the current LockMode.
    • getLockMode

      public final LockMode getLockMode()
      Description copied from interface: Lock
      Gets the LockMode the transaction stored in the the TxnThreadLocal has on this Lock. To retrieve the actual LockMode of the Lock, you need to use the Lock.atomicGetLockMode().
      Specified by:
      getLockMode in interface Lock
      Returns:
      the LockMode.
      See Also:
    • getLockMode

      public final LockMode getLockMode(Txn tx)
      Description copied from interface: Lock
      Gets the LockMode the transaction has on the Lock. This call makes use of the tx. To retrieve the actual LockMode of the Lock, you need to use the Lock.atomicGetLockMode()
      Specified by:
      getLockMode in interface Lock
      Parameters:
      tx - the Lock
      Returns:
      the LockMode the transaction has on the Lock.
      See Also:
    • getLockMode

      public final LockMode getLockMode(GammaTxn tx)
    • yieldIfNeeded

      private static void yieldIfNeeded(int remainingSpins)
    • waitForExclusiveLockToBecomeFree

      public final boolean waitForExclusiveLockToBecomeFree(int spinCount)
    • hasWriteLock

      public final boolean hasWriteLock()
    • hasExclusiveLock

      public final boolean hasExclusiveLock()
    • getReadBiasedThreshold

      public final int getReadBiasedThreshold()
    • getSurplus

      public final long getSurplus()
    • isReadBiased

      public final boolean isReadBiased()
    • getReadonlyCount

      public final int getReadonlyCount()
    • getReadLockCount

      public final int getReadLockCount()
    • arrive

      public final int arrive(int spinCount)
      Arrives. The Arrive is needed for the fast conflict detection (rich mans conflict).
      Parameters:
      spinCount - the maximum number of times to spin if the exclusive lock is acquired.
      Returns:
      the arrive status.
    • upgradeReadLock

      public final int upgradeReadLock(int spinCount, boolean exclusiveLock)
    • upgradeWriteLock

      public final boolean upgradeWriteLock()
      Upgrades the writeLock to an exclusive lock.
      Returns:
      true if there was at least one conflict write.
    • arriveAndLock

      public final int arriveAndLock(int spinCount, int lockMode)
      Arrives and tries to acquire the lock. If one of them fails, there will not be any state change.
      Parameters:
      spinCount - the maximum number of times to spin to wait for the lock to come available.
      lockMode - the desired lockmode. It isn't allowed to be LOCKMODE_NONE.
      Returns:
      the result of this operation.
    • arriveAndExclusiveLock

      public final int arriveAndExclusiveLock(int spinCount)
      Tries to acquire the exclusive lock and arrive.
      Parameters:
      spinCount - the maximum number of spins when it is locked.
      Returns:
      the arrive-status.
    • lockAfterArrive

      public final int lockAfterArrive(int spinCount, int lockMode)
      Arrives and tries to acquire the lock. If one of them fails, there will not be any state change.
      Parameters:
      spinCount - the maximum number of times to spin if a lock is acquired.
      lockMode - the desired lockMode. This is not allowed to be LOCKMODE_NONE.
      Returns:
      the status of the operation.
    • departAfterReading

      public final void departAfterReading()
      Departs after a successful read is done and no lock was acquired.

      This call increased the readonly count. If the readonly count threshold is reached, the orec is made readbiased and the readonly count is set to 0.

    • departAfterReadingAndUnlock

      public final void departAfterReadingAndUnlock()
      Departs after a successful read is done and release the lock (it doesn't matter which lock is acquired as long is it is a read/write/exclusive lock.

      This method increases the readonly count of the orec and upgraded from update-biased to readbiased if the READBIASED_THRESHOLD is reached (also the readonly count is set to zero if that happens).

    • departAfterUpdateAndUnlock

      public final void departAfterUpdateAndUnlock()
    • departAfterFailureAndUnlock

      public final void departAfterFailureAndUnlock()
      Departs after a transaction fails and has an arrive on this Orec. It doesn't matter what the lock level is, as long as it is higher than LOCKMODE_NONE. This call can safely be made on a read or update biased ref.
    • departAfterFailure

      public final void departAfterFailure()
      Departs after failure.
    • unlockByUnregistered

      public final void unlockByUnregistered()
    • ___toOrecString

      public final String ___toOrecString()
    • setReadLockCount

      public static long setReadLockCount(long value, long readLockCount)
    • getReadLockCount

      public static int getReadLockCount(long value)
    • setExclusiveLock

      public static long setExclusiveLock(long value, boolean exclusiveLock)
    • hasWriteOrExclusiveLock

      public static boolean hasWriteOrExclusiveLock(long value)
    • hasAnyLock

      public static boolean hasAnyLock(long value)
    • hasExclusiveLock

      public static boolean hasExclusiveLock(long value)
    • isReadBiased

      public static boolean isReadBiased(long value)
    • setIsReadBiased

      public static long setIsReadBiased(long value, boolean isReadBiased)
    • hasWriteLock

      public static boolean hasWriteLock(long value)
    • setWriteLock

      public static long setWriteLock(long value, boolean updateLock)
    • getReadonlyCount

      public static int getReadonlyCount(long value)
    • setReadonlyCount

      public static long setReadonlyCount(long value, int readonlyCount)
    • setSurplus

      public static long setSurplus(long value, long surplus)
    • getSurplus

      public static long getSurplus(long value)
    • toOrecString

      private static String toOrecString(long value)