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

#ifndef __java_util_concurrent_locks_AbstractQueuedLongSynchronizer$ConditionObject__
#define __java_util_concurrent_locks_AbstractQueuedLongSynchronizer$ConditionObject__

#pragma interface

#include <java/lang/Object.h>

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

public:
  AbstractQueuedLongSynchronizer$ConditionObject(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer *);
private:
  ::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node * addConditionWaiter();
  void doSignal(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node *);
  void doSignalAll(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node *);
  jboolean isOnConditionQueue(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node *);
  void unlinkCancelledWaiter(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node *);
public:
  virtual void signal();
  virtual void signalAll();
  virtual void awaitUninterruptibly();
private:
  jint checkInterruptWhileWaiting(::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$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::AbstractQueuedLongSynchronizer *);
public: // actually protected
  virtual jboolean hasWaiters();
  virtual jint getWaitQueueLength();
  virtual ::java::util::Collection * getWaitingThreads();
private:
  static const jlong serialVersionUID = 1173984872572414699LL;
  ::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node * __attribute__((aligned(__alignof__( ::java::lang::Object)))) firstWaiter;
  ::java::util::concurrent::locks::AbstractQueuedLongSynchronizer$Node * lastWaiter;
  static const jint REINTERRUPT = 1;
  static const jint THROW_IE = -1;
public: // actually package-private
  ::java::util::concurrent::locks::AbstractQueuedLongSynchronizer * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_locks_AbstractQueuedLongSynchronizer$ConditionObject__
