aboutsummaryrefslogtreecommitdiff
path: root/src/micro/micro.c
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-15 14:32:10 +0330
committerGravatar zinc <zinc@downsta.ir> 2026-10-15 14:32:10 +0330
commit253ac862c696d73fb17c14a847270b6e08aa8769 (patch)
tree0206220c056ad9559d6924dbd2c8428b54b326cf /src/micro/micro.c
parentactors: micro workers map a copy-on-write snapshot too; inherited input is on... (diff)
hold blocks: top-level hold { shared let ...; fn ... } monitors; shared values kept by the host and copied in/out at the outermost call, reentrant per-block locks in declaration order (core, micro)
Diffstat (limited to 'src/micro/micro.c')
-rw-r--r--src/micro/micro.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/micro/micro.c b/src/micro/micro.c
index 9924d5e..e095451 100644
--- a/src/micro/micro.c
+++ b/src/micro/micro.c
@@ -34,6 +34,10 @@
#include "micro_port.h"
#include "fops.h"
#include "bops.h"
+#ifdef ZY_THREADS
+#define HOLD_THREADS
+#endif
+#include "hold.h"
#define NENH 512
#define XOP0 22
#define XPOOL 4096
@@ -537,6 +541,11 @@ static int run_from(int p, int s, int r)
/* poll: a streaming port suspends once, so its host can deliver input that is waiting */
result = micro_syscall(m, b, 0, 0, 0);
if (result == MICRO_WAIT) { sus_p = p - 1; sus_s = s; sus_r = r; return MICRO_SUSPENDED; }
+ } else if (b == 57) {
+ result = hold_enter(m, mw, m[a + 1], m[a + 2]);
+ if (result == -2) { micro_msg("zy: a hold block was entered while a later one was held; hold blocks are entered in the order they are declared\n"); context_call(7, 2, 0, 0, s + 2, r); return 1; } /* a trap: exit status 2 */
+ } else if (b == 58) {
+ result = hold_leave(m, mw, m[a + 1], m[a + 2]);
} else result = context_call(b, m[a + 1], m[a + 2], m[a + 3], s + 2, r);
m[a] = result;
s += 2;
@@ -718,7 +727,7 @@ static void *context_worker(void *opaque) {
if (!context->requested_exit) context->exit_code = context_cancelled() ? 0 : result ? -1 : inmem(final_s) ? (int)m[final_s] : 0;
context_close(context->worker_channel.handle);
while (context_children) context_join(context_children->token, 1);
- micro_context_port_free(); m = 0; atomic_fetch_sub(&context_memory_live, 1); context_current = 0; return 0;
+ hold_release_all(); micro_context_port_free(); m = 0; atomic_fetch_sub(&context_memory_live, 1); context_current = 0; return 0;
}
static Cell context_start(Cell entry, Cell channel, int sp, int rp) {
if (!inmem(entry) || !inmem(channel) || (entry >= HEAP_LO && (!inmem(entry - 3) || m[entry - 3] != (entry ^ 0x2B7E1516)))) return -1;