//===---------------- Threads.h - Micro-vm threads ------------------------===//
//
//                     The Micro Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef MVM_THREAD_H
#define MVM_THREAD_H

#include "types.h"

#include "MvmGC.h"
#include "mvm/Threads/Key.h"


class Collector;

namespace mvm {

/// Thread - This class is the base of custom virtual machines' Thread classes.
/// It provides static functions to manage threads. An instance of this class
/// contains all thread-specific informations.
class Thread : public gc {
public:
  
  /// yield - Yield the processor to another thread.
  ///
  static void yield(void);
  
  /// yield - Yield the processor to another thread. If the thread has been
  /// askink for yield already a number of times (n), then do a small sleep.
  ///
  static void yield(unsigned int* n);
  
  /// self - The thread id of the current thread, which is specific to the
  /// underlying implementation.
  ///
  static int self(void);

  /// initialise - Initialise the thread implementation. Used for pthread_key.
  ///
  static void initialise(void);

  /// kill - Kill the thread with the given pid by sending it a signal.
  ///
  static int kill(int tid, int signo);

  /// exit - Exit the current thread.
  ///
  static void exit(int value);
  
  /// start - Start the execution of a thread, creating it and setting its
  /// Thread instance.
  ///
  static int start(int *tid, int (*fct)(void *), void *arg);
 
  /// threadKey - the key for accessing the thread specific data.
  ///
  static mvm::Key<Thread>* threadKey;
 
  /// GC - The collector of this thread.
  ///
  Collector* GC;
  
  /// baseSP - The base stack pointer.
  ///
  void* baseSP;
  
  /// threadID - The virtual machine specific thread id.
  ///
  uint32 threadID;

  /// get - Get the thread specific data of the current thread.
  ///
  static Thread* get() {
    return (Thread*)Thread::threadKey->get();
  }
  
  /// set - Set the thread specific data of the current thread.
  ///
  static void set(Thread* th) {
    return Thread::threadKey->set(th);
  }

};


} // end namespace mvm
#endif // MVM_THREAD_H
