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

#ifndef __java_lang_Thread__
#define __java_lang_Thread__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace gcj
    {
        class RawData;
        class RawDataManaged;
    }
    namespace java
    {
      namespace util
      {
          class WeakIdentityHashMap;
      }
    }
  }
}

class _Jv_JNIEnv;
#define _JV_NOT_OWNER 1
#define _JV_INTERRUPTED 2
_Jv_JNIEnv * _Jv_GetCurrentJNIEnv ();
void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);
void _Jv_ThreadRun (java::lang::Thread* thread);
jint _Jv_AttachCurrentThread(java::lang::Thread* thread);
java::lang::Thread* _Jv_AttachCurrentThread (jstring name, java::lang::ThreadGroup* group);
java::lang::Thread* _Jv_AttachCurrentThreadAsDaemon (jstring name, java::lang::ThreadGroup* group);
jint _Jv_DetachCurrentThread ();
struct _Jv_Thread_t;
_Jv_Thread_t* _Jv_ThreadGetData (java::lang::Thread* thread);

class java::lang::Thread : public ::java::lang::Object
{

public:
  Thread();
  Thread(::java::lang::Runnable *);
  Thread(::java::lang::String *);
  Thread(::java::lang::ThreadGroup *, ::java::lang::Runnable *);
  Thread(::java::lang::ThreadGroup *, ::java::lang::String *);
  Thread(::java::lang::Runnable *, ::java::lang::String *);
  Thread(::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *);
  Thread(::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *, jlong);
public: // actually package-private
  Thread(::java::lang::String *, jboolean);
private:
  Thread(::java::lang::Thread *, ::java::lang::ThreadGroup *, ::java::lang::Runnable *, ::java::lang::String *, jboolean);
public:
  static jint activeCount();
  virtual void checkAccess();
  virtual jint countStackFrames();
  static ::java::lang::Thread * currentThread();
  virtual void destroy();
  static void dumpStack();
  static jint enumerate(JArray< ::java::lang::Thread * > *);
  virtual ::java::lang::String * getName();
  virtual jint getPriority();
  virtual ::java::lang::ThreadGroup * getThreadGroup();
  static jboolean holdsLock(::java::lang::Object *);
  virtual void interrupt();
  static jboolean interrupted();
  virtual jboolean isInterrupted();
  virtual jboolean isAlive();
  virtual jboolean isDaemon();
  virtual void join();
  virtual void join(jlong);
  virtual void join(jlong, jint);
  virtual void resume();
private:
  void finish_();
  jboolean isInterrupted(jboolean);
public:
  virtual void run();
  virtual void setDaemon(jboolean);
  virtual ::java::lang::ClassLoader * getContextClassLoader();
  virtual void setContextClassLoader(::java::lang::ClassLoader *);
  virtual void setName(::java::lang::String *);
  static void yield();
  static void sleep(jlong);
  static void sleep(jlong, jint);
  virtual void start();
  virtual void stop();
  virtual void stop(::java::lang::Throwable *);
  virtual void suspend();
  virtual void setPriority(jint);
  virtual ::java::lang::String * toString();
private:
  void initialize_native();
  static ::java::lang::String * gen_name();
public: // actually package-private
  static ::java::util::Map * getThreadLocals();
public:
  virtual void setUncaughtExceptionHandler(::java::lang::Thread$UncaughtExceptionHandler *);
  virtual ::java::lang::Thread$UncaughtExceptionHandler * getUncaughtExceptionHandler();
  static void setDefaultUncaughtExceptionHandler(::java::lang::Thread$UncaughtExceptionHandler *);
  static ::java::lang::Thread$UncaughtExceptionHandler * getDefaultUncaughtExceptionHandler();
  virtual jlong getId();
  virtual ::java::lang::Thread$State * getState();
  static ::java::util::Map * getAllStackTraces();
  virtual JArray< ::java::lang::StackTraceElement * > * getStackTrace();
  static const jint MIN_PRIORITY = 1;
  static const jint NORM_PRIORITY = 5;
  static const jint MAX_PRIORITY = 10;
public: // actually package-private
  ::java::lang::ThreadGroup * __attribute__((aligned(__alignof__( ::java::lang::Object)))) group;
private:
  ::java::lang::Runnable * runnable;
public: // actually package-private
  ::java::lang::String * name;
private:
  jboolean daemon;
  jint priority;
public: // actually package-private
  jboolean interrupt_flag;
private:
  static const jbyte THREAD_DEAD = 0;
  static const jbyte THREAD_ALIVE = 1;
  static const jbyte THREAD_SIGNALED = 2;
  jboolean startable_flag;
  ::java::lang::ClassLoader * contextClassLoader;
  jlong threadId;
  static jlong nextThreadId;
  static jlong totalThreadsCreated;
  static ::java::lang::Thread$UncaughtExceptionHandler * defaultHandler;
public: // actually package-private
  ::gnu::java::util::WeakIdentityHashMap * locals;
  ::java::lang::Thread$UncaughtExceptionHandler * exceptionHandler;
private:
  ::java::lang::Object * parkBlocker;
public: // actually package-private
  static const jbyte THREAD_PARK_RUNNING = 0;
  static const jbyte THREAD_PARK_PERMIT = 1;
  static const jbyte THREAD_PARK_PARKED = 2;
  static const jbyte THREAD_PARK_DEAD = 3;
  ::java::lang::Object * accessControlState;
  ::gnu::gcj::RawData * interp_frame;
  ::gnu::gcj::RawData * frame;
  jint volatile state;
  ::gnu::gcj::RawDataManaged * data;
public:
  static ::java::lang::Class class$;

  friend _Jv_JNIEnv * ::_Jv_GetCurrentJNIEnv ();
  friend void ::_Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);
  friend void ::_Jv_ThreadRun (java::lang::Thread* thread);
  friend jint (::_Jv_AttachCurrentThread) (java::lang::Thread* thread);
  friend java::lang::Thread* ::_Jv_AttachCurrentThread (jstring name, java::lang::ThreadGroup* group);
  friend java::lang::Thread* ::_Jv_AttachCurrentThreadAsDaemon (jstring name, java::lang::ThreadGroup* group);
  friend jint (::_Jv_DetachCurrentThread) ();
};

#endif // __java_lang_Thread__
