/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_SRC_THREAD_STATE_H_
#define ART_SRC_THREAD_STATE_H_

namespace art {

enum ThreadState {
  //                                  Thread.State   JDWP state
  kTerminated,                     // TERMINATED     TS_ZOMBIE    Thread.run has returned, but Thread* still around
  kRunnable,                       // RUNNABLE       TS_RUNNING   runnable
  kTimedWaiting,                   // TIMED_WAITING  TS_WAIT      in Object.wait() with a timeout
  kSleeping,                       // TIMED_WAITING  TS_SLEEPING  in Thread.sleep()
  kBlocked,                        // BLOCKED        TS_MONITOR   blocked on a monitor
  kWaiting,                        // WAITING        TS_WAIT      in Object.wait()
  kWaitingForGcToComplete,         // WAITING        TS_WAIT      blocked waiting for GC
  kWaitingPerformingGc,            // WAITING        TS_WAIT      performing GC
  kWaitingForDebuggerSend,         // WAITING        TS_WAIT      blocked waiting for events to be sent
  kWaitingForDebuggerToAttach,     // WAITING        TS_WAIT      blocked waiting for debugger to attach
  kWaitingInMainDebuggerLoop,      // WAITING        TS_WAIT      blocking/reading/processing debugger events
  kWaitingForDebuggerSuspension,   // WAITING        TS_WAIT      waiting for debugger suspend all
  kWaitingForJniOnLoad,            // WAITING        TS_WAIT      waiting for execution of dlopen and JNI on load code
  kWaitingForSignalCatcherOutput,  // WAITING        TS_WAIT      waiting for signal catcher IO to complete
  kWaitingInMainSignalCatcherLoop, // WAITING        TS_WAIT      blocking/reading/processing signals
  kStarting,                       // NEW            TS_WAIT      native thread started, not yet ready to run managed code
  kNative,                         // RUNNABLE       TS_RUNNING   running in a JNI native method
  kSuspended,                      // RUNNABLE       TS_RUNNING   suspended by GC or debugger
};

}  // namespace art

#endif  // ART_SRC_THREAD_STATE_H_
