| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- //
- // System.Threading.Thread.cs
- //
- // Author:
- // Dick Porter ([email protected])
- //
- // (C) Ximian, Inc. http://www.ximian.com
- //
- using System.Runtime.Remoting.Contexts;
- using System.Security.Principal;
- using System.Globalization;
- using System.Runtime.CompilerServices;
- namespace System.Threading
- {
- public sealed class Thread
- {
- public static Context CurrentContext {
- get {
- // FIXME -
- // System.Runtime.Remoting.Context not
- // yet implemented
- return(null);
- }
- }
- public static IPrincipal CurrentPrincipal {
- get {
- // FIXME -
- // System.Security.Principal.IPrincipal
- // not yet implemented
- return(null);
- }
-
- set {
- }
- }
- // Looks up the object associated with the current thread
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static Thread CurrentThread_internal();
-
- public static Thread CurrentThread {
- get {
- return(CurrentThread_internal());
- }
- }
- public static LocalDataStoreSlot AllocateDataSlot() {
- // FIXME
- return(null);
- }
- public static LocalDataStoreSlot AllocateNamedDataSlot(string name) {
- // FIXME
- return(null);
- }
- public static void FreeNamedDataSlot(string name) {
- // FIXME
- }
- public static object GetData(LocalDataStoreSlot slot) {
- // FIXME
- return(null);
- }
- public static AppDomain GetDomain() {
- // FIXME
- return(null);
- }
- public static int GetDomainID() {
- // FIXME
- return(0);
- }
- public static LocalDataStoreSlot GetNamedDataSlot(string name) {
- // FIXME
- return(null);
- }
- public static void ResetAbort() {
- // FIXME
- }
- public static void SetData(LocalDataStoreSlot slot, object data) {
- // FIXME
- }
- // Returns milliseconds remaining (due to interrupted sleep)
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static int Sleep_internal(int ms);
- // Causes thread to give up its timeslice
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static void Schedule_internal();
-
- public static void Sleep(int millisecondsTimeout) {
- if(millisecondsTimeout<0) {
- throw new ArgumentException("Negative timeout");
- }
- if(millisecondsTimeout==0) {
- // Schedule another thread
- Schedule_internal();
- } else {
- Thread thread=CurrentThread;
-
- thread.state |= ThreadState.WaitSleepJoin;
- int ms_remaining=Sleep_internal(millisecondsTimeout);
- thread.state &= ~ThreadState.WaitSleepJoin;
- if(ms_remaining>0) {
- throw new ThreadInterruptedException("Thread interrupted while sleeping");
- }
- }
-
- }
- public static void Sleep(TimeSpan timeout) {
- // LAMESPEC: says to throw ArgumentException too
- if(timeout.Milliseconds < 0 || timeout.Milliseconds > Int32.MaxValue) {
- throw new ArgumentOutOfRangeException("Timeout out of range");
- }
- if(timeout.Milliseconds==0) {
- // Schedule another thread
- Schedule_internal();
- } else {
- Thread thread=CurrentThread;
-
- thread.state |= ThreadState.WaitSleepJoin;
- int ms_remaining=Sleep_internal(timeout.Milliseconds);
- thread.state &= ~ThreadState.WaitSleepJoin;
-
- if(ms_remaining>0) {
- throw new ThreadInterruptedException("Thread interrupted while sleeping");
- }
- }
- }
- private ThreadStart start_delegate=null;
-
- public Thread(ThreadStart start) {
- if(start==null) {
- throw new ArgumentNullException("Null ThreadStart");
- }
- // Nothing actually happens here, the fun
- // begins when Thread.Start() is called. For
- // now, just record what the ThreadStart
- // delegate is.
- start_delegate=start;
- }
- public ApartmentState ApartmentState {
- get {
- // FIXME
- return(ApartmentState.Unknown);
- }
-
- set {
- }
- }
- public CultureInfo CurrentCulture {
- get {
- // FIXME
- return(null);
- }
-
- set {
- }
- }
- public CultureInfo CurrentUICulture {
- get {
- // FIXME
- return(null);
- }
-
- set {
- }
- }
- public bool IsAlive {
- get {
- // LAMESPEC: is a Stopped thread dead?
- if((state & ThreadState.Running) != 0 ||
- (state & ThreadState.Stopped) != 0) {
- return(true);
- } else {
- return(false);
- }
- }
- }
- public bool IsBackground {
- get {
- // FIXME
- return(false);
- }
-
- set {
- }
- }
- private string thread_name=null;
-
- public string Name {
- get {
- return(thread_name);
- }
-
- set {
- thread_name=value;
- }
- }
- public ThreadPriority Priority {
- get {
- // FIXME
- return(ThreadPriority.Lowest);
- }
-
- set {
- }
- }
- private ThreadState state=ThreadState.Unstarted;
-
- public ThreadState ThreadState {
- get {
- return(state);
- }
- }
- public void Abort() {
- // FIXME
- }
- public void Abort(object stateInfo) {
- // FIXME
- }
- public void Interrupt() {
- // FIXME
- }
- // The current thread joins with 'this'. Set ms to 0 to block
- // until this actually exits.
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern /*bool*/ int Join_internal(int ms, UInt32 handle);
-
- public void Join() {
- if(state == ThreadState.Unstarted) {
- throw new ThreadStateException("Thread has not been started");
- }
-
- Thread thread=CurrentThread;
-
- thread.state |= ThreadState.WaitSleepJoin;
- Join_internal(0, system_thread_handle);
- thread.state &= ~ThreadState.WaitSleepJoin;
- }
- public bool Join(int millisecondsTimeout) {
- if(millisecondsTimeout<0) {
- throw new ArgumentException("Timeout less than zero");
- }
- if(state == ThreadState.Unstarted) {
- throw new ThreadStateException("Thread has not been started");
- }
- Thread thread=CurrentThread;
-
- thread.state |= ThreadState.WaitSleepJoin;
- bool ret=(Join_internal(millisecondsTimeout,
- system_thread_handle)==1);
- thread.state &= ~ThreadState.WaitSleepJoin;
- return(ret);
- }
- public bool Join(TimeSpan timeout) {
- // LAMESPEC: says to throw ArgumentException too
- if(timeout.Milliseconds < 0 || timeout.Milliseconds > Int32.MaxValue) {
- throw new ArgumentOutOfRangeException("timeout out of range");
- }
- if(state == ThreadState.Unstarted) {
- throw new ThreadStateException("Thread has not been started");
- }
- Thread thread=CurrentThread;
-
- thread.state |= ThreadState.WaitSleepJoin;
- bool ret=(Join_internal(timeout.Milliseconds,
- system_thread_handle)==1);
- thread.state &= ~ThreadState.WaitSleepJoin;
- return(ret);
- }
- public void Resume() {
- // FIXME
- }
-
- // stores a pthread_t, which is defined as unsigned long
- // on my system. I _think_ windows uses "unsigned int" for
- // its thread handles, so that _should_ work too.
- private UInt32 system_thread_handle;
- // Returns the system thread handle
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern UInt32 Start_internal(ThreadStart start);
-
- public void Start() {
- if(state!=ThreadState.Unstarted) {
- throw new ThreadStateException("Thread has already been started");
- }
- state=ThreadState.Running;
-
- // Don't rely on system_thread_handle being
- // set before start_delegate runs!
- system_thread_handle=Start_internal(start_delegate);
- }
- public void Suspend() {
- // FIXME
- }
- ~Thread() {
- // FIXME
- }
- }
- }
|