
// 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;
    }
  }
}

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::lang::ThreadLocalMap * 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
  ::java::lang::ThreadLocalMap * 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__
