
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_util_concurrent_locks_ReentrantReadWriteLock$Sync__
#define __java_util_concurrent_locks_ReentrantReadWriteLock$Sync__

#pragma interface

#include <java/util/concurrent/locks/AbstractQueuedSynchronizer.h>

class java::util::concurrent::locks::ReentrantReadWriteLock$Sync : public ::java::util::concurrent::locks::AbstractQueuedSynchronizer
{

public: // actually package-private
  static jint sharedCount(jint);
  static jint exclusiveCount(jint);
  ReentrantReadWriteLock$Sync();
  virtual jboolean readerShouldBlock(::java::lang::Thread *) = 0;
  virtual jboolean writerShouldBlock(::java::lang::Thread *) = 0;
public: // actually protected
  virtual jboolean tryRelease(jint);
  virtual jboolean tryAcquire(jint);
  virtual jboolean tryReleaseShared(jint);
  virtual jint tryAcquireShared(jint);
public: // actually package-private
  virtual jint fullTryAcquireShared(::java::lang::Thread *);
  virtual jboolean tryWriteLock();
  virtual jboolean tryReadLock();
public: // actually protected
  virtual jboolean isHeldExclusively();
public: // actually package-private
  virtual ::java::util::concurrent::locks::AbstractQueuedSynchronizer$ConditionObject * newCondition();
  virtual ::java::lang::Thread * getOwner();
  virtual jint getReadLockCount();
  virtual jboolean isWriteLocked();
  virtual jint getWriteHoldCount();
  virtual jint getReadHoldCount();
private:
  void readObject(::java::io::ObjectInputStream *);
public: // actually package-private
  virtual jint getCount();
private:
  static const jlong serialVersionUID = 6317671515068378041LL;
public: // actually package-private
  static const jint SHARED_SHIFT = 16;
  static const jint SHARED_UNIT = 65536;
  static const jint MAX_COUNT = 65535;
  static const jint EXCLUSIVE_MASK = 65535;
  ::java::util::concurrent::locks::ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter * __attribute__((aligned(__alignof__( ::java::util::concurrent::locks::AbstractQueuedSynchronizer)))) readHolds;
  ::java::util::concurrent::locks::ReentrantReadWriteLock$Sync$HoldCounter * cachedHoldCounter;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_locks_ReentrantReadWriteLock$Sync__
