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

#ifndef __java_util_concurrent_locks_ReentrantLock__
#define __java_util_concurrent_locks_ReentrantLock__

#pragma interface

#include <java/lang/Object.h>

class java::util::concurrent::locks::ReentrantLock : public ::java::lang::Object
{

public:
  ReentrantLock();
  ReentrantLock(jboolean);
  virtual void lock();
  virtual void lockInterruptibly();
  virtual jboolean tryLock();
  virtual jboolean tryLock(jlong, ::java::util::concurrent::TimeUnit *);
  virtual void unlock();
  virtual ::java::util::concurrent::locks::Condition * newCondition();
  virtual jint getHoldCount();
  virtual jboolean isHeldByCurrentThread();
  virtual jboolean isLocked();
  virtual jboolean isFair();
public: // actually protected
  virtual ::java::lang::Thread * getOwner();
public:
  virtual jboolean hasQueuedThreads();
  virtual jboolean hasQueuedThread(::java::lang::Thread *);
  virtual jint getQueueLength();
public: // actually protected
  virtual ::java::util::Collection * getQueuedThreads();
public:
  virtual jboolean hasWaiters(::java::util::concurrent::locks::Condition *);
  virtual jint getWaitQueueLength(::java::util::concurrent::locks::Condition *);
public: // actually protected
  virtual ::java::util::Collection * getWaitingThreads(::java::util::concurrent::locks::Condition *);
public:
  virtual ::java::lang::String * toString();
private:
  static const jlong serialVersionUID = 7373984872572414699LL;
  ::java::util::concurrent::locks::ReentrantLock$Sync * __attribute__((aligned(__alignof__( ::java::lang::Object)))) sync;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_locks_ReentrantLock__
