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

#ifndef __java_util_concurrent_FutureTask$Sync__
#define __java_util_concurrent_FutureTask$Sync__

#pragma interface

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

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

public: // actually package-private
  FutureTask$Sync(::java::util::concurrent::FutureTask *, ::java::util::concurrent::Callable *);
private:
  jboolean ranOrCancelled(jint);
public: // actually protected
  jint tryAcquireShared(jint);
  jboolean tryReleaseShared(jint);
public: // actually package-private
  jboolean innerIsCancelled();
  jboolean innerIsDone();
  ::java::lang::Object * innerGet();
  ::java::lang::Object * innerGet(jlong);
  void innerSet(::java::lang::Object *);
  void innerSetException(::java::lang::Throwable *);
  jboolean innerCancel(jboolean);
  void innerRun();
  jboolean innerRunAndReset();
private:
  static const jlong serialVersionUID = -7828117401763700385LL;
  static const jint RUNNING = 1;
  static const jint RAN = 2;
  static const jint CANCELLED = 4;
  ::java::util::concurrent::Callable * __attribute__((aligned(__alignof__( ::java::util::concurrent::locks::AbstractQueuedSynchronizer)))) callable;
  ::java::lang::Object * result;
  ::java::lang::Throwable * exception;
  ::java::lang::Thread * volatile runner;
public: // actually package-private
  ::java::util::concurrent::FutureTask * this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_FutureTask$Sync__
