diff --git a/erl.sh b/erl.sh index 3a7a89da..28e1b28c 100755 --- a/erl.sh +++ b/erl.sh @@ -4,8 +4,8 @@ if [ "x${OTPROOT}" == "x" ]; then OTPROOT=/sw/lib/erlang fi -java -ea -cp erjang-0.1.jar \ - -Derj.threads=1 \ +java -server -ea -cp erjang-0.1.jar \ + -Derj.threads=2 \ -Derjpath=$OTPROOT/lib/erts-5.7.3/ebin erjang.OTPMain \ -root $OTPROOT \ -progname erl \ diff --git a/lib/kilim-0.6-krab.jar b/lib/kilim-0.6-krab.jar index 071d7e96..1eba2171 100644 Binary files a/lib/kilim-0.6-krab.jar and b/lib/kilim-0.6-krab.jar differ diff --git a/src/main/java/erjang/EHandle.java b/src/main/java/erjang/EHandle.java index 2bdef479..912787c3 100644 --- a/src/main/java/erjang/EHandle.java +++ b/src/main/java/erjang/EHandle.java @@ -20,6 +20,7 @@ package erjang; import kilim.Pausable; +import kilim.Task; /** * An EHandle is either an EPort or an EPID. EHandles can be sent messages @@ -51,6 +52,13 @@ public boolean exists() { public void send(EObject msg) throws Pausable { ETask task = task(); if (task != null) { + + task.reds += task.mbox.size(); + if (task.reds > 1000) { + task.reds = 0; + Task.yield(); + } + task.mbox_send(msg); } } diff --git a/src/main/java/erjang/EInternalPID.java b/src/main/java/erjang/EInternalPID.java index 47ee6ee0..e5639f33 100644 --- a/src/main/java/erjang/EInternalPID.java +++ b/src/main/java/erjang/EInternalPID.java @@ -20,6 +20,7 @@ package erjang; import kilim.Pausable; +import kilim.Task; /** * This is a PID on this node @@ -63,6 +64,13 @@ EProc task() { public void send(EObject msg) throws Pausable { EProc task = this.task; if (task != null) { + + task.reds += task.mbox.size(); + if (task.reds > 1000) { + task.reds = 0; + Task.yield(); + } + task.mbox.put(msg); } } diff --git a/src/main/java/erjang/ERT.java b/src/main/java/erjang/ERT.java index 54809c34..35672a05 100644 --- a/src/main/java/erjang/ERT.java +++ b/src/main/java/erjang/ERT.java @@ -458,6 +458,8 @@ public static EObject send(EProc proc, EObject pid, EObject msg) throws Pausable { // TODO handle ports also? proc.check_exit(); + + //System.out.println(""+proc+" :: "+pid+" ! "+msg); EHandle p; if ((p = pid.testHandle()) != null) { @@ -711,7 +713,9 @@ public static void run(Task task) { /** peek mbox at current index (proc.midx), which is 0 upon entry to the loop. */ public static EObject loop_rec(EProc proc) { - EObject msg = proc.mbox.peek(proc.midx); + int idx = proc.midx; + EObject msg = proc.mbox.peek(idx); + if (DEBUG_WAIT) System.err.println("WAIT| entered loop #"+idx+" message="+msg); return msg; } @@ -748,13 +752,15 @@ public static boolean wait_timeout(EProc proc, EObject howlong) /** wait forever, for one more message to be available */ public static void wait(EProc proc) throws Pausable { - if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" waits for messages"); - proc.mbox.untilHasMessages(proc.midx + 1); - if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" wakes up after timeout"); + int idx = proc.midx + 1; + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" waits for "+idx+" messages"); + proc.mbox.untilHasMessages(idx); + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" wakes up after timeout; now has "+(idx)); } /** message reception timed out, reset message index */ public static void timeout(EProc proc) { + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" timed out"); proc.midx = 0; } diff --git a/src/main/java/erjang/ETask.java b/src/main/java/erjang/ETask.java index bf46c59c..e8c04edc 100644 --- a/src/main/java/erjang/ETask.java +++ b/src/main/java/erjang/ETask.java @@ -129,8 +129,8 @@ public void remove_monitor(ERef r, boolean flush) { } - - protected Mailbox mbox = new Mailbox(10, 1000); + static final int MAX_MAILBOX_SIZE = 1000; + protected Mailbox mbox = new Mailbox(10, MAX_MAILBOX_SIZE); protected static enum State { INIT, // has not started yet @@ -144,6 +144,8 @@ protected static enum State { protected State pstate = State.INIT; protected EObject exit_reason; + public int reds; + /** * @throws Pausable *