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

#ifndef __java_util_concurrent_locks_AbstractQueuedSynchronizer$ConditionObject__
#define __java_util_concurrent_locks_AbstractQueuedSynchronizer$ConditionObject__

#pragma interface

#include <java/lang/Object.h>

class java::util::concurrent::locks::AbstractQueuedSynchronizer$ConditionObject : public ::java::lang::Object
{

public:
  AbstractQueuedSynchronizer$ConditionObject(::java::util::concurrent::locks::AbstractQueuedSynchronizer *);
private:
  ::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node * addConditionWaiter();
  void doSignal(::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node *);
  void doSignalAll(::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node *);
  jboolean isOnConditionQueue(::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node *);
  void unlinkCancelledWaiter(::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node *);
public:
  virtual void signal();
  virtual void signalAll();
  virtual void awaitUninterruptibly();
private:
  jint checkInterruptWhileWaiting(::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node *);
  void reportInterruptAfterWait(jint);
public:
  virtual void await();
  virtual jlong awaitNanos(jlong);
  virtual jboolean awaitUntil(::java::util::Date *);
  virtual jboolean await(jlong, ::java::util::concurrent::TimeUnit *);
public: // actually package-private
  virtual jboolean isOwnedBy(::java::util::concurrent::locks::AbstractQueuedSynchronizer *);
public: // actually protected
  virtual jboolean hasWaiters();
  virtual jint getWaitQueueLength();
  virtual ::java::util::Collection * getWaitingThreads();
private:
  static const jlong serialVersionUID = 1173984872572414699LL;
  ::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node * __attribute__((aligned(__alignof__( ::java::lang::Object)))) firstWaiter;
  ::java::util::concurrent::locks::AbstractQueuedSynchronizer$Node * lastWaiter;
  static const jint REINTERRUPT = 1;
  static const jint THROW_IE = -1;
public: // actually package-private
  ::java::util::concurrent::locks::AbstractQueuedSynchronizer * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_locks_AbstractQueuedSynchronizer$ConditionObject__
