haxe/src/sys/thread/Thread.cs
// Generated by Haxe 4.3.7 (patched: no System.Threading.Thread/Mutex)

#pragma warning disable 109, 114, 219, 429, 168, 162
namespace sys.thread._Thread {
	public class HaxeThread : global::haxe.lang.HxObject {
		
		static HaxeThread() {
			{
				global::sys.thread._Thread.HaxeThread.threadsMutex = new global::sys.thread.Mutex();
				global::sys.thread._Thread.HaxeThread.allocateCount = 0;
				global::sys.thread._Thread.HaxeThread.mainHaxeThread = new global::sys.thread._Thread.HaxeThread(((object) (null) ));
				global::sys.thread._Thread.HaxeThread.mainHaxeThread.events = new global::sys.thread.EventLoop();
			}
			
		}
		
		
		public HaxeThread(global::haxe.lang.EmptyObject empty) {
		}
		
		
		public HaxeThread(object native) {
			global::sys.thread._Thread.HaxeThread.__hx_ctor_sys_thread__Thread_HaxeThread(this, native);
		}
		
		
		protected static void __hx_ctor_sys_thread__Thread_HaxeThread(global::sys.thread._Thread.HaxeThread __hx_this, object native) {
			__hx_this.messages = new global::sys.thread.Deque<object>();
			{
				__hx_this.native = native;
			}
			
		}
		
		
		public static global::sys.thread._Thread.HaxeThread mainHaxeThread;
		
		public static global::sys.thread.Mutex threadsMutex;
		
		public static int allocateCount;
		
		public static global::sys.thread._Thread.HaxeThread @get() {
			return global::sys.thread._Thread.HaxeThread.mainHaxeThread;
		}
		
		
		public static global::sys.thread._Thread.HaxeThread current() {
			return global::sys.thread._Thread.HaxeThread.mainHaxeThread;
		}
		
		
		public static global::sys.thread._Thread.HaxeThread allocate(object native, bool withEventLoop) {
			global::sys.thread._Thread.HaxeThread hx = new global::sys.thread._Thread.HaxeThread(((object) (native) ));
			if (withEventLoop) {
				hx.events = new global::sys.thread.EventLoop();
			}
			
			return hx;
		}
		
		
		public static void runWithEventLoop(global::haxe.lang.Function job) {
			global::sys.thread._Thread.HaxeThread thread = global::sys.thread._Thread.HaxeThread.current();
			if (( thread.events == null )) {
				thread.events = new global::sys.thread.EventLoop();
				try {
					job.__hx_invoke0_o();
					thread.events.loop();
					thread.events = null;
				}
				catch (global::System.Exception _g){
					global::haxe.Exception e = global::haxe.Exception.caught(_g);
					thread.events = null;
					throw ((global::System.Exception) (global::haxe.Exception.thrown(e)) );
				}
				
				
			}
			else {
				job.__hx_invoke0_o();
			}
			
		}
		
		
		public object native;
		
		public global::sys.thread.EventLoop events;
		
		public global::sys.thread.Deque messages;
		
		public object readMessage(bool block) {
			return ((object) (global::haxe.lang.Runtime.callField(this.messages, "pop", 5594513, new object[]{block})) );
		}
		
		
		public virtual void sendMessage(object msg) {
			object __temp_expr1 = ((object) (global::haxe.lang.Runtime.callField(this.messages, "add", 4846113, new object[]{msg})) );
		}
		
		
		public override object __hx_setField(string field, int hash, object @value, bool handleProperties) {
			unchecked {
				switch (hash) {
					case 889051340:
					{
						this.messages = ((global::sys.thread.Deque) (@value) );
						return @value;
					}
					
					
					case 376065817:
					{
						this.events = ((global::sys.thread.EventLoop) (@value) );
						return @value;
					}
					
					
					case 572311959:
					{
						this.native = ((object) (@value) );
						return @value;
					}
					
					
					default:
					{
						return base.__hx_setField(field, hash, @value, handleProperties);
					}
					
				}
				
			}
		}
		
		
		public override object __hx_getField(string field, int hash, bool throwErrors, bool isCheck, bool handleProperties) {
			unchecked {
				switch (hash) {
					case 605915487:
					{
						return ((global::haxe.lang.Function) (new global::haxe.lang.Closure(this, "sendMessage", 605915487)) );
					}
					
					
					case 1828505873:
					{
						return ((global::haxe.lang.Function) (new global::haxe.lang.Closure(this, "readMessage", 1828505873)) );
					}
					
					
					case 889051340:
					{
						return this.messages;
					}
					
					
					case 376065817:
					{
						return this.events;
					}
					
					
					case 572311959:
					{
						return this.native;
					}
					
					
					default:
					{
						return base.__hx_getField(field, hash, throwErrors, isCheck, handleProperties);
					}
					
				}
				
			}
		}
		
		
		public override object __hx_invokeField(string field, int hash, object[] dynargs) {
			unchecked {
				switch (hash) {
					case 605915487:
					{
						this.sendMessage(dynargs[0]);
						break;
					}
					
					
					case 1828505873:
					{
						return this.readMessage(global::haxe.lang.Runtime.toBool(dynargs[0]));
					}
					
					
					default:
					{
						return base.__hx_invokeField(field, hash, dynargs);
					}
					
				}
				
				return null;
			}
		}
		
		
		public override void __hx_getFields(global::Array<string> baseArr) {
			baseArr.push("messages");
			baseArr.push("events");
			baseArr.push("native");
			base.__hx_getFields(baseArr);
		}
		
		
	}
}



#pragma warning disable 109, 114, 219, 429, 168, 162
namespace sys.thread._Thread {
	public sealed class Thread_Impl_ {
		
		
		
		public static global::sys.thread._Thread.HaxeThread _new(global::sys.thread._Thread.HaxeThread thread) {
			return ((global::sys.thread._Thread.HaxeThread) (thread) );
		}
		
		
		public static global::sys.thread._Thread.HaxeThread create(global::haxe.lang.Function job) {
			global::sys.thread._Thread.HaxeThread hx = global::sys.thread._Thread.HaxeThread.allocate(((object) (null) ), false);
			job.__hx_invoke0_o();
			return ((global::sys.thread._Thread.HaxeThread) (hx) );
		}
		
		
		public static void runWithEventLoop(global::haxe.lang.Function job) {
			global::sys.thread._Thread.HaxeThread.runWithEventLoop(job);
		}
		
		
		public static global::sys.thread._Thread.HaxeThread createWithEventLoop(global::haxe.lang.Function job) {
			global::sys.thread._Thread.HaxeThread hx = global::sys.thread._Thread.HaxeThread.allocate(((object) (null) ), true);
			job.__hx_invoke0_o();
			return ((global::sys.thread._Thread.HaxeThread) (hx) );
		}
		
		
		public static global::sys.thread._Thread.HaxeThread current() {
			return ((global::sys.thread._Thread.HaxeThread) (global::sys.thread._Thread.HaxeThread.current()) );
		}
		
		
		public static object readMessage(bool block) {
			return ((global::sys.thread._Thread.HaxeThread) (global::sys.thread._Thread.HaxeThread.current()) ).readMessage(block);
		}
		
		
		public static void sendMessage(global::sys.thread._Thread.HaxeThread this1, object msg) {
			this1.sendMessage(msg);
		}
		
		
		public static object readMessageImpl(global::sys.thread._Thread.HaxeThread this1, bool block) {
			return this1.readMessage(block);
		}
		
		
		public static global::sys.thread.EventLoop get_events(global::sys.thread._Thread.HaxeThread this1) {
			if (( this1.events == null )) {
				throw new global::sys.thread.NoEventLoopException(default(string), default(global::haxe.Exception));
			}
			
			return this1.events;
		}
		
		
		public static void processEvents() {
			global::sys.thread._Thread.HaxeThread.current().events.loop();
		}
		
		
	}
}



#pragma warning disable 109, 114, 219, 429, 168, 162
namespace sys.thread._Thread {
	public class Thread_Impl__create_41__Fun : global::haxe.lang.Function {
		
		public Thread_Impl__create_41__Fun(global::haxe.lang.Function job) : base(0, 0) {
			this.job = job;
		}
		
		
		public override object __hx_invoke0_o() {
			this.Delegate();
			return null;
		}
		
		
		public void Delegate() {
			this.job.__hx_invoke0_o();
		}
		
		
		public global::haxe.lang.Function job;
		
	}
}



#pragma warning disable 109, 114, 219, 429, 168, 162
namespace sys.thread._Thread {
	public class Thread_Impl__createWithEventLoop_55__Fun : global::haxe.lang.Function {
		
		public Thread_Impl__createWithEventLoop_55__Fun(global::haxe.lang.Function job, global::sys.thread._Thread.HaxeThread[] hx) : base(0, 0) {
			this.job = job;
			this.hx = hx;
		}
		
		
		public override object __hx_invoke0_o() {
			this.Delegate();
			return null;
		}
		
		
		public void Delegate() {
			this.job.__hx_invoke0_o();
			if (( ((global::sys.thread._Thread.HaxeThread) (this.hx[0]) ) == null )) {
				global::sys.thread._Thread.HaxeThread.current().events.loop();
			}
			else {
				((global::sys.thread._Thread.HaxeThread) (this.hx[0]) ).events.loop();
			}
			
		}
		
		
		public global::haxe.lang.Function job;
		
		public global::sys.thread._Thread.HaxeThread[] hx;
		
	}
}