redefined gcfin_proc and ossig_proc as class instance variables of System
This commit is contained in:
		| @ -13,6 +13,8 @@ class System(Apex) | |||||||
| 	var(#class) asyncsg. | 	var(#class) asyncsg. | ||||||
| 	var(#class) gcfin_sem. | 	var(#class) gcfin_sem. | ||||||
| 	var(#class) gcfin_should_exit := false. | 	var(#class) gcfin_should_exit := false. | ||||||
|  | 	var(#class) gcfin_proc. | ||||||
|  | 	var(#class) ossig_proc. | ||||||
| 	var(#class) shr. // signal handler registry | 	var(#class) shr. // signal handler registry | ||||||
|  |  | ||||||
| 	pooldic Log | 	pooldic Log | ||||||
| @ -62,7 +64,7 @@ class System(Apex) | |||||||
|  |  | ||||||
| 	method(#class) startup(class_name, method_name) | 	method(#class) startup(class_name, method_name) | ||||||
| 	{ | 	{ | ||||||
| 		| class ret gcfin_proc ossig_proc | | 		| class ret | | ||||||
|  |  | ||||||
| 		System gc. | 		System gc. | ||||||
|  |  | ||||||
| @ -77,11 +79,11 @@ class System(Apex) | |||||||
| 		// start the gc finalizer process and os signal handler process | 		// start the gc finalizer process and os signal handler process | ||||||
| 		//[ self __gc_finalizer ] fork. | 		//[ self __gc_finalizer ] fork. | ||||||
| 		//[ self __os_sig_handler ] fork. | 		//[ self __os_sig_handler ] fork. | ||||||
| 		gcfin_proc := [ self __gc_finalizer ] newProcess. | 		self.gcfin_proc := [ self __gc_finalizer ] newProcess. | ||||||
| 		ossig_proc := [ :caller | self __os_sig_handler: caller ] newProcess(thisProcess). | 		self.ossig_proc := [ :caller | self __os_sig_handler: caller ] newProcess(thisProcess). | ||||||
|  |  | ||||||
| 		gcfin_proc resume. | 		self.gcfin_proc resume. | ||||||
| 		ossig_proc resume. | 		self.ossig_proc resume. | ||||||
|  |  | ||||||
| 		[ | 		[ | ||||||
| 			// TODO: change the method signature to variadic and pass extra arguments to perform??? | 			// TODO: change the method signature to variadic and pass extra arguments to perform??? | ||||||
| @ -145,6 +147,7 @@ class System(Apex) | |||||||
| 			self.gcfin_sem signal. // in case the process is stuck in wait. | 			self.gcfin_sem signal. // in case the process is stuck in wait. | ||||||
| 			self.gcfin_sem unsignal. | 			self.gcfin_sem unsignal. | ||||||
| 			System logNl: 'End of GC finalization process ' & (thisProcess id) asString. | 			System logNl: 'End of GC finalization process ' & (thisProcess id) asString. | ||||||
|  | 			self.gcfin_proc := nil. | ||||||
| 		]. | 		]. | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -203,7 +206,8 @@ class System(Apex) | |||||||
| 			 2 -> __os_sig_handler  | 			 2 -> __os_sig_handler  | ||||||
| 			 3 ..  -> other processes started by application. | 			 3 ..  -> other processes started by application. | ||||||
| 			*/ | 			*/ | ||||||
| 			proc := System _findProcessByIdGreaterThan: 2. | /* TODO: this loop is error-prone as it can't handle when the processs id wraps back and the id of gcfin_proc and ossig_proc gets bigger than normal child processes */ | ||||||
|  | 			proc := System _findProcessByIdGreaterThan: (self.ossig_proc id). | ||||||
| 			while (proc notError) | 			while (proc notError) | ||||||
| 			{ | 			{ | ||||||
| 				pid := proc id. | 				pid := proc id. | ||||||
| @ -221,6 +225,7 @@ class System(Apex) | |||||||
| 			self.gcfin_should_exit := true. | 			self.gcfin_should_exit := true. | ||||||
| 			self.gcfin_sem signal. // wake the gcfin process. | 			self.gcfin_sem signal. // wake the gcfin process. | ||||||
|  |  | ||||||
|  | 			self.ossig_proc := nil. | ||||||
| 			self _halting. // inform VM that it should get ready for halting. | 			self _halting. // inform VM that it should get ready for halting. | ||||||
| 		]. | 		]. | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -405,7 +405,7 @@ static kernel_class_info_t kernel_classes[] = | |||||||
| 	{ 6, | 	{ 6, | ||||||
| 	  { 'S','y','s','t','e','m' }, | 	  { 'S','y','s','t','e','m' }, | ||||||
| 	  0, | 	  0, | ||||||
| 	  4, /* asyncsg, gcfin_sem, gcfin_should_exit, shr */ | 	  6, /* asyncsg, gcfin_sem, gcfin_should_exit, gcfin_proc, ossig_proc, shr */ | ||||||
| 	  0, | 	  0, | ||||||
| 	  0, | 	  0, | ||||||
| 	  MOO_OBJ_TYPE_OOP, | 	  MOO_OBJ_TYPE_OOP, | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ blddir=${topdir}/bld/emcc | |||||||
|  |  | ||||||
| emcc -Wall -O2 -g   \ | emcc -Wall -O2 -g   \ | ||||||
| 	${blddir}/lib/.libs/libmoo.a \ | 	${blddir}/lib/.libs/libmoo.a \ | ||||||
|  | 	${blddir}/lib/.libs/libmoox.a \ | ||||||
| 	${topdir}/wasm/main.c \ | 	${topdir}/wasm/main.c \ | ||||||
| 	-DMOO_HAVE_CFG_H \ | 	-DMOO_HAVE_CFG_H \ | ||||||
| 	-I${blddir}/lib \ | 	-I${blddir}/lib \ | ||||||
| @ -16,5 +17,7 @@ emcc -Wall -O2 -g   \ | |||||||
| 	--embed-file ${topdir}/kernel/ \ | 	--embed-file ${topdir}/kernel/ \ | ||||||
| 	--pre-js ${topdir}/wasm/moo.cb.js | 	--pre-js ${topdir}/wasm/moo.cb.js | ||||||
|  |  | ||||||
| cp -pf ${topdir}/wasm/moo.html . | ##cp -pf ${topdir}/wasm/moo.html . | ||||||
| cp -pf ${topdir}/wasm/moo.worker.js . | ##cp -pf ${topdir}/wasm/moo.worker.js . | ||||||
|  | ln -sf ${topdir}/wasm/moo.html moo.html | ||||||
|  | ln -sf ${topdir}/wasm/moo.worker.js moo.worker.js | ||||||
|  | |||||||
| @ -110,3 +110,20 @@ EMSCRIPTEN_KEEPALIVE int open_moo (void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | EMSCRIPTEN_KEEPALIVE moo_bch_t* get_errmsg_from_moo (moo_t* moo) | ||||||
|  | { | ||||||
|  | #if defined(MOO_OOCH_IS_UCH) | ||||||
|  | /* TODO: no static.... error check... */ | ||||||
|  | 	static moo_bch_t bm[256]; | ||||||
|  | 	moo_oow_t bl = MOO_COUNTOF(bm); | ||||||
|  | 	moo_convutobcstr (moo, moo_geterrmsg(moo), MOO_NULL, bm, &bl); | ||||||
|  | 	return bm; | ||||||
|  | #else | ||||||
|  | 	return moo_geterrmsg(moo); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | EMSCRIPTEN_KEEPALIVE void switch_process_in_moo (moo_t* moo) | ||||||
|  | { | ||||||
|  | 	moo_switchprocess(moo);  | ||||||
|  | } | ||||||
|  | |||||||
| @ -3,29 +3,51 @@ | |||||||
| <head><meta charset="utf-8" /></head> | <head><meta charset="utf-8" /></head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
|     <input type="button" value="Test" onclick="do_test();" /> | 	<input type="button" value="Open" onclick="do_open();" /> | ||||||
|  | 	<input type="button" value="Run" onclick="do_run();" /> | ||||||
|  | 	<input type="button" value="Close" onclick="do_close();" /> | ||||||
|  |  | ||||||
|     <script type="text/javascript"> | 	<script type="text/javascript"> | ||||||
|         var g_WebWorker = new Worker("moo.worker.js"); | 		var g_WebWorker = new Worker("moo.worker.js"); | ||||||
|         if (typeof(WebAssembly) === 'undefined') | 		if (typeof(WebAssembly) === 'undefined') | ||||||
|         { | 		{ | ||||||
|               alert ('No web assebly support in this browser'); | 		    alert ('No web assebly support in this browser'); | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | 		window.addEventListener('beforeunload', function(event) { | ||||||
|  | 			//g_WebWorker.terminate (); | ||||||
|  | 			//g_WebWorkder = null; | ||||||
|  |  | ||||||
|         g_WebWorker.onerror = function (evt) {  | 			var confirmationMessage = "\o/"; | ||||||
| 		console.log(`Error from Web Worker: ${evt.message}`);  | 			(event || window.event).returnValue = confirmationMessage;     //Gecko + IE | ||||||
| 	}; | 			return confirmationMessage; | ||||||
|  | 		}); | ||||||
|  | */ | ||||||
|  |  | ||||||
|         g_WebWorker.onmessage = function (evt) {  | 		g_WebWorker.onerror = function (evt) {  | ||||||
| 		console.log(`Message from the Web Worker:\n\n ${evt.data}`);  | 			console.log(`Error from Web Worker: ${evt.message}`);  | ||||||
| 	}; | 		}; | ||||||
|  |  | ||||||
|         function do_test() | 		g_WebWorker.onmessage = function (evt) {  | ||||||
| 	{ | 			console.log(`Message from the Web Worker:\n\n ${evt.data}`);  | ||||||
|                 g_WebWorker.postMessage({ "cmd": "test-moo", "data": "nothing as of now.." }); | 		}; | ||||||
|         } |  | ||||||
|     </script> | 		function do_open() | ||||||
|  | 		{ | ||||||
|  | 			 g_WebWorker.postMessage({ "cmd": "open-moo", "data": "nothing as of now.." }); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		function do_run() | ||||||
|  | 		{ | ||||||
|  | 			 g_WebWorker.postMessage({ "cmd": "run-moo", "data": "nothing as of now.." }); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		function do_close() | ||||||
|  | 		{ | ||||||
|  | 			 g_WebWorker.postMessage({ "cmd": "close-moo", "data": "nothing as of now.." }); | ||||||
|  | 		} | ||||||
|  | 	</script> | ||||||
|  |  | ||||||
|  |  | ||||||
| </body> | </body> | ||||||
|  | |||||||
| @ -1,60 +1,108 @@ | |||||||
| self.importScripts('libmoo.js'); | self.importScripts('libmoo.js'); | ||||||
| self.__ready = false; | self.libmoo = null; | ||||||
|  | self.moo = null; | ||||||
|  |  | ||||||
|  | Module.noExitRuntime = false; | ||||||
|  | Module.onExit = function (status) { | ||||||
|  | 	console.log ('exiting....'); | ||||||
|  | }; | ||||||
|  |  | ||||||
| Module.onRuntimeInitialized = function() | Module.onRuntimeInitialized = function() | ||||||
| { | { | ||||||
|         self.__ready = true; | 	console.log ('runtime is ready now...'); | ||||||
|         console.log ('runtime is ready now...'); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| const libmoo = { | 	self.libmoo = { | ||||||
|         open: Module.cwrap('moo_openstd', 'number', ['number', 'number', 'number']), | 		open: Module.cwrap('moo_openstd', 'number', ['number', 'number', 'number']), | ||||||
|         close: Module.cwrap('moo_close', '', ['number']), | 		close: Module.cwrap('moo_close', '', ['number']), | ||||||
| 	ignite: Module.cwrap('moo_ignite', 'number', ['number', 'number']), | 		ignite: Module.cwrap('moo_ignite', 'number', ['number', 'number']), | ||||||
| 	initdbgi: Module.cwrap('moo_initdbgi', 'number', ['number', 'number']), | 		initdbgi: Module.cwrap('moo_initdbgi', 'number', ['number', 'number']), | ||||||
| 	compilefile: Module.cwrap('moo_compilefileb', 'number', ['number', 'string']), | 		compilefile: Module.cwrap('moo_compilefileb', 'number', ['number', 'string']), | ||||||
| 	invoke: Module.cwrap('moo_invokebynameb', 'number', ['number', 'string', 'string']) | 		invoke: Module.cwrap('moo_invokebynameb', 'number', ['number', 'string', 'string']), | ||||||
|  | 		geterrmsg: Module.cwrap('get_errmsg_from_moo', 'string', ['number']), | ||||||
|  | 		switchprocess: Module.cwrap('switch_process_in_moo', 'undefined', ['number']) | ||||||
|  | 	}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* |  | ||||||
| var log_write = Module.addFunction(function() { |  | ||||||
|  |  | ||||||
| }); |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| //self.onmessage = function (evt) { | //self.onmessage = function (evt) { | ||||||
| self.addEventListener ('message', function (evt) { | self.addEventListener ('message', function (evt) { | ||||||
|         var objData = evt.data; | 	var objData = evt.data; | ||||||
|  |  | ||||||
|         var cmd = objData.cmd; | 	var cmd = objData.cmd; | ||||||
|         if (cmd === "test-moo") | 	if (cmd === "run-moo") | ||||||
|         { | 	{ | ||||||
|                 //var x = Module.ccall('moo_openstd', [0, null, null]); | 		 //var x = Module.ccall('moo_openstd', [0, null, null]); | ||||||
|                 //Module.ccall('moo_close', x); | 		 //Module.ccall('moo_close', x); | ||||||
|  |  | ||||||
|                 if (self.__ready) | 		if (self.moo !== null) | ||||||
|                 { | 		{ | ||||||
|                         var moo, tmp; | 			var tmp, msg = ""; | ||||||
| 			var msg = ""; | 			//var ticker; | ||||||
|  |  | ||||||
| 			moo = libmoo.open(0, null, null); | 			// while self.libmoo.invoke() is running, setInterval() is unable to trigger the timed event. | ||||||
|  | 			// it's an architectural issue. emscripten doesn't implement setitimer() yet.  | ||||||
|  | 			// the moo program should 'yield' manually for process switching for now. | ||||||
|  | 			//ticker = setInterval(function() { self.libmoo.switchprocess (self.moo); console.log("ticking"); }, 100); | ||||||
|  |  | ||||||
|  | 			tmp = self.libmoo.invoke(self.moo, "MyObject", "main"); | ||||||
|  | 			msg = msg.concat("invoke - " + tmp); | ||||||
|  |  | ||||||
|  | 			//clearInterval (ticker); | ||||||
|  |  | ||||||
|  | 			self.postMessage (msg); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			self.postMessage ("not open"); | ||||||
|  | 		} | ||||||
|  | 	}  | ||||||
|  | 	else if (cmd == "open-moo") | ||||||
|  | 	{ | ||||||
|  | 		if (self.libmoo === null) | ||||||
|  | 		{ | ||||||
|  | 			self.postMessage ("not ready"); | ||||||
|  | 		} | ||||||
|  | 		else if (self.moo === null) | ||||||
|  | 		{ | ||||||
|  | 			var tmp, msg = ""; | ||||||
|  |  | ||||||
|  | 			self.moo = self.libmoo.open(0, null, null); | ||||||
| 			msg = msg.concat("open - " + moo); | 			msg = msg.concat("open - " + moo); | ||||||
|  |  | ||||||
| 			tmp = libmoo.ignite(moo, 5000000); | 			tmp = self.libmoo.ignite(self.moo, 5000000); | ||||||
| 			msg = msg.concat(" ignite - " + tmp); | 			msg = msg.concat(" ignite - " + tmp); | ||||||
|  |  | ||||||
| 			tmp = libmoo.initdbgi(moo, 102400); | 			tmp = self.libmoo.initdbgi(self.moo, 102400); | ||||||
| 			msg = msg.concat(" initdgbi - " + tmp); | 			msg = msg.concat(" initdgbi - " + tmp); | ||||||
|  |  | ||||||
| 			tmp = libmoo.compilefile(moo, "kernel/t.moo"); | 			tmp = self.libmoo.compilefile(self.moo, "kernel/t.moo"); | ||||||
| 			msg = msg.concat(" compilefile - " + tmp); | 			if (tmp == -1) | ||||||
|  | 			{ | ||||||
|  | 				msg = msg.concat(" compilefile - " + self.libmoo.geterrmsg(self.moo)); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				msg = msg.concat(" compilefile - " + tmp); | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 			tmp = libmoo.invoke(moo, "MyObject", "main"); | 			self.postMessage (msg); | ||||||
| 			msg = msg.concat(" invoke - " + tmp); | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			self.postMessage ("already open"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|                         self.postMessage (msg); | 	else if (cmd == "close-moo") | ||||||
| 			 | 	{ | ||||||
|                         libmoo.close (moo); | 		if (self.moo !== null)  | ||||||
|                 } | 		{ | ||||||
|         }  | 			self.libmoo.close (self.moo); | ||||||
|  | 			self.moo = null; | ||||||
|  | 			self.postMessage ("close ok"); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			self.postMessage ("already closed"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user