aboutsummaryrefslogtreecommitdiff
path: root/src/core/core.c
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-15 14:21:49 +0330
committerGravatar zinc <zinc@downsta.ir> 2026-10-15 14:21:49 +0330
commit5b43760187e21f80d3a57e7a80058c8baed051a2 (patch)
tree922908311ff4aea3b92b7bdc7377afefd432e3af /src/core/core.c
parentactors: large per-thread compiler tables mapped on first use instead of stati... (diff)
actors: remaining tls tables and the input buffer allocated on use; a worker inherits only unread input
Diffstat (limited to 'src/core/core.c')
-rw-r--r--src/core/core.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/core/core.c b/src/core/core.c
index bf48b19..77c4a99 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -256,6 +256,7 @@ static atomic_int context_records_live, context_code_live, context_memory_live;
size_t io_context_size(void);
void io_context_snapshot(void *destination);
void io_context_restore(const void *source);
+void io_context_release(void);
#else
static VM_TLS int context_default_stop;
#endif
@@ -622,10 +623,6 @@ typedef struct {
Uop *u;
signed char *reg; /* physical register per value, for the jit; 0 if it didn't fit */
} Enh;
-static VM_TLS Enh enh[NENH];
-static VM_TLS int need_flush;
-
-#define MAXUOP 4096
/* large per-thread tables live behind a pointer and are mapped on first use, so a
worker thread that never compiles anything pays nothing for them (as static tls
they were zeroed into every thread's stack mapping: about 13 MB per actor) */
@@ -655,6 +652,12 @@ static void tls_big_free(void)
}
}
#define TLS_BIG(p) (*((p) ? (p) : (__typeof__(p))tls_big(sizeof *(p), (void **)&(p))))
+static VM_TLS Enh (*enh_tls)[NENH];
+#define enh TLS_BIG(enh_tls)
+
+static VM_TLS int need_flush;
+
+#define MAXUOP 4096
static VM_TLS Uop (*ub_tls)[MAXUOP];
#define ub TLS_BIG(ub_tls)
static VM_TLS int un, unv, uerr; /* the program being built */
@@ -1154,11 +1157,19 @@ typedef struct {
unsigned gen; /* bumped every time the region's code is dropped: a copy made from an older one is stale */
} Rg;
#define MAXRG 4096
-static VM_TLS Rg *rgs[MAXRG];
+static VM_TLS Rg * (*rgs_tls)[MAXRG];
+#define rgs TLS_BIG(rgs_tls)
+
static VM_TLS int nrg;
-static VM_TLS int fn_pc[MAXRG];
-static VM_TLS Rg *fn_rg_[MAXRG];
-static VM_TLS Rg *fn_cache[1024];
+static VM_TLS int (*fn_pc_tls)[MAXRG];
+#define fn_pc TLS_BIG(fn_pc_tls)
+
+static VM_TLS Rg * (*fn_rg__tls)[MAXRG];
+#define fn_rg_ TLS_BIG(fn_rg__tls)
+
+static VM_TLS Rg * (*fn_cache_tls)[1024];
+#define fn_cache TLS_BIG(fn_cache_tls)
+
static VM_TLS int nfn;
/* ---- bookkeeping for translated code, shared by the backends ----
@@ -1809,7 +1820,9 @@ static Cell ffi_cbmake(Cell entry, Cell sig)
/* a native call the o3 lifter has resolved: the micro-ops narg and ncall carry
an index into this table. imm of narg is the argument's position */
typedef struct { void *f; Cell sig; int n; char name[48]; } Ncd;
-static VM_TLS Ncd ncd[256];
+static VM_TLS Ncd (*ncd_tls)[256];
+#define ncd TLS_BIG(ncd_tls)
+
static VM_TLS int nncd;
static int ncd_get(Cell blk)
{
@@ -2407,7 +2420,9 @@ static VM_TLS int (*g_isk_tls)[MAXUOP * 4];
#define g_isk TLS_BIG(g_isk_tls)
static VM_TLS Cell (*g_kv_tls)[MAXUOP * 4];
#define g_kv TLS_BIG(g_kv_tls)
-static VM_TLS int g_omap[MAXUOP + 16];
+static VM_TLS int (*g_omap_tls)[MAXUOP + 16];
+#define g_omap TLS_BIG(g_omap_tls)
+
static int cjoin(CIn *d, const CIn *s)
{
int j, ch = 0;
@@ -3360,7 +3375,9 @@ static VM_TLS void **tab; /* vm address -> translation */
typedef struct { void *stub; int fslots; int argc; } FnNat;
static VM_TLS FnNat *fn_nat;
#define LINKN 1024
-static VM_TLS void *linkstk[LINKN];
+static VM_TLS void * (*linkstk_tls)[LINKN];
+#define linkstk TLS_BIG(linkstk_tls)
+
static VM_TLS Cell jit_depth;
#endif
static void be_drop(int j) { tab[ix_blk[j].a] = 0; cdec(cov, ix_blk[j].a, ix_blk[j].b); if (trace) fprintf(stderr, "jit: dropped %d..%d\n", ix_blk[j].a, ix_blk[j].b - 1); }
@@ -6307,7 +6324,9 @@ static void x64_enh(Enh *e)
under ZYO3INTERP=1. */
static VM_TLS int x64_o3interp;
static void perfmap_note(JW *start, JW *end, const char *kind, int a, int b);
-static VM_TLS signed char rxr[MAXUOP * 4 + 16];
+static VM_TLS signed char (*rxr_tls)[MAXUOP * 4 + 16];
+#define rxr TLS_BIG(rxr_tls)
+
#define RXNREG 6
static void rsave(void) { int j; for (j = 0; j < RXNREG; j++) push_r(xreg[j]); }
static void rrest(void) { int j; for (j = RXNREG - 1; j >= 0; j--) pop_r(xreg[j]); }
@@ -7563,7 +7582,7 @@ static void context_engine_free(void) {
free(lcov); free(lt); free(hot);
#endif
#endif
- if (memory_mapped) vm_memory_unmap(m); else free(m); m = 0; snap_drop(); tls_big_free(); atomic_fetch_sub(&context_memory_live, 1);
+ if (memory_mapped) vm_memory_unmap(m); else free(m); m = 0; snap_drop(); tls_big_free(); io_context_release(); atomic_fetch_sub(&context_memory_live, 1);
}
static void *context_worker(void *opaque) {
VmContext *context = opaque;