redefined gcfin_proc and ossig_proc as class instance variables of System
This commit is contained in:
parent
dbf066695b
commit
546c766a39
@ -13,6 +13,8 @@ class System(Apex)
|
||||
var(#class) asyncsg.
|
||||
var(#class) gcfin_sem.
|
||||
var(#class) gcfin_should_exit := false.
|
||||
var(#class) gcfin_proc.
|
||||
var(#class) ossig_proc.
|
||||
var(#class) shr. // signal handler registry
|
||||
|
||||
pooldic Log
|
||||
@ -62,7 +64,7 @@ class System(Apex)
|
||||
|
||||
method(#class) startup(class_name, method_name)
|
||||
{
|
||||
| class ret gcfin_proc ossig_proc |
|
||||
| class ret |
|
||||
|
||||
System gc.
|
||||
|
||||
@ -77,11 +79,11 @@ class System(Apex)
|
||||
// start the gc finalizer process and os signal handler process
|
||||
//[ self __gc_finalizer ] fork.
|
||||
//[ self __os_sig_handler ] fork.
|
||||
gcfin_proc := [ self __gc_finalizer ] newProcess.
|
||||
ossig_proc := [ :caller | self __os_sig_handler: caller ] newProcess(thisProcess).
|
||||
self.gcfin_proc := [ self __gc_finalizer ] newProcess.
|
||||
self.ossig_proc := [ :caller | self __os_sig_handler: caller ] newProcess(thisProcess).
|
||||
|
||||
gcfin_proc resume.
|
||||
ossig_proc resume.
|
||||
self.gcfin_proc resume.
|
||||
self.ossig_proc resume.
|
||||
|
||||
[
|
||||
// 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 unsignal.
|
||||
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
|
||||
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)
|
||||
{
|
||||
pid := proc id.
|
||||
@ -221,6 +225,7 @@ class System(Apex)
|
||||
self.gcfin_should_exit := true.
|
||||
self.gcfin_sem signal. // wake the gcfin process.
|
||||
|
||||
self.ossig_proc := nil.
|
||||
self _halting. // inform VM that it should get ready for halting.
|
||||
].
|
||||
}
|
||||
|
@ -405,7 +405,7 @@ static kernel_class_info_t kernel_classes[] =
|
||||
{ 6,
|
||||
{ 'S','y','s','t','e','m' },
|
||||
0,
|
||||
4, /* asyncsg, gcfin_sem, gcfin_should_exit, shr */
|
||||
6, /* asyncsg, gcfin_sem, gcfin_should_exit, gcfin_proc, ossig_proc, shr */
|
||||
0,
|
||||
0,
|
||||
MOO_OBJ_TYPE_OOP,
|
||||
|
@ -6,6 +6,7 @@ blddir=${topdir}/bld/emcc
|
||||
|
||||
emcc -Wall -O2 -g \
|
||||
${blddir}/lib/.libs/libmoo.a \
|
||||
${blddir}/lib/.libs/libmoox.a \
|
||||
${topdir}/wasm/main.c \
|
||||
-DMOO_HAVE_CFG_H \
|
||||
-I${blddir}/lib \
|
||||
@ -16,5 +17,7 @@ emcc -Wall -O2 -g \
|
||||
--embed-file ${topdir}/kernel/ \
|
||||
--pre-js ${topdir}/wasm/moo.cb.js
|
||||
|
||||
cp -pf ${topdir}/wasm/moo.html .
|
||||
cp -pf ${topdir}/wasm/moo.worker.js .
|
||||
##cp -pf ${topdir}/wasm/moo.html .
|
||||
##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
|
||||
}
|
||||
|
||||
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,7 +3,9 @@
|
||||
<head><meta charset="utf-8" /></head>
|
||||
|
||||
<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">
|
||||
var g_WebWorker = new Worker("moo.worker.js");
|
||||
@ -12,6 +14,16 @@
|
||||
alert ('No web assebly support in this browser');
|
||||
}
|
||||
|
||||
/*
|
||||
window.addEventListener('beforeunload', function(event) {
|
||||
//g_WebWorker.terminate ();
|
||||
//g_WebWorkder = null;
|
||||
|
||||
var confirmationMessage = "\o/";
|
||||
(event || window.event).returnValue = confirmationMessage; //Gecko + IE
|
||||
return confirmationMessage;
|
||||
});
|
||||
*/
|
||||
|
||||
g_WebWorker.onerror = function (evt) {
|
||||
console.log(`Error from Web Worker: ${evt.message}`);
|
||||
@ -21,9 +33,19 @@
|
||||
console.log(`Message from the Web Worker:\n\n ${evt.data}`);
|
||||
};
|
||||
|
||||
function do_test()
|
||||
function do_open()
|
||||
{
|
||||
g_WebWorker.postMessage({ "cmd": "test-moo", "data": "nothing as of now.." });
|
||||
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>
|
||||
|
||||
|
@ -1,60 +1,108 @@
|
||||
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()
|
||||
{
|
||||
self.__ready = true;
|
||||
console.log ('runtime is ready now...');
|
||||
}
|
||||
|
||||
const libmoo = {
|
||||
self.libmoo = {
|
||||
open: Module.cwrap('moo_openstd', 'number', ['number', 'number', 'number']),
|
||||
close: Module.cwrap('moo_close', '', ['number']),
|
||||
ignite: Module.cwrap('moo_ignite', 'number', ['number', 'number']),
|
||||
initdbgi: Module.cwrap('moo_initdbgi', 'number', ['number', 'number']),
|
||||
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.addEventListener ('message', function (evt) {
|
||||
var objData = evt.data;
|
||||
|
||||
var cmd = objData.cmd;
|
||||
if (cmd === "test-moo")
|
||||
if (cmd === "run-moo")
|
||||
{
|
||||
//var x = Module.ccall('moo_openstd', [0, null, null]);
|
||||
//Module.ccall('moo_close', x);
|
||||
|
||||
if (self.__ready)
|
||||
if (self.moo !== null)
|
||||
{
|
||||
var moo, tmp;
|
||||
var msg = "";
|
||||
var tmp, msg = "";
|
||||
//var ticker;
|
||||
|
||||
moo = libmoo.open(0, null, null);
|
||||
msg = msg.concat("open - " + moo);
|
||||
// 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 = libmoo.ignite(moo, 5000000);
|
||||
msg = msg.concat(" ignite - " + tmp);
|
||||
tmp = self.libmoo.invoke(self.moo, "MyObject", "main");
|
||||
msg = msg.concat("invoke - " + tmp);
|
||||
|
||||
tmp = libmoo.initdbgi(moo, 102400);
|
||||
msg = msg.concat(" initdgbi - " + tmp);
|
||||
|
||||
tmp = libmoo.compilefile(moo, "kernel/t.moo");
|
||||
msg = msg.concat(" compilefile - " + tmp);
|
||||
|
||||
tmp = libmoo.invoke(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 = "";
|
||||
|
||||
libmoo.close (moo);
|
||||
self.moo = self.libmoo.open(0, null, null);
|
||||
msg = msg.concat("open - " + moo);
|
||||
|
||||
tmp = self.libmoo.ignite(self.moo, 5000000);
|
||||
msg = msg.concat(" ignite - " + tmp);
|
||||
|
||||
tmp = self.libmoo.initdbgi(self.moo, 102400);
|
||||
msg = msg.concat(" initdgbi - " + tmp);
|
||||
|
||||
tmp = self.libmoo.compilefile(self.moo, "kernel/t.moo");
|
||||
if (tmp == -1)
|
||||
{
|
||||
msg = msg.concat(" compilefile - " + self.libmoo.geterrmsg(self.moo));
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = msg.concat(" compilefile - " + tmp);
|
||||
}
|
||||
|
||||
self.postMessage (msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
self.postMessage ("already open");
|
||||
}
|
||||
}
|
||||
|
||||
else if (cmd == "close-moo")
|
||||
{
|
||||
if (self.moo !== null)
|
||||
{
|
||||
self.libmoo.close (self.moo);
|
||||
self.moo = null;
|
||||
self.postMessage ("close ok");
|
||||
}
|
||||
else
|
||||
{
|
||||
self.postMessage ("already closed");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user