Bug fixes
This commit is contained in:
		
							parent
							
								
									5809a89eae
								
							
						
					
					
						commit
						eb5a23761d
					
				
							
								
								
									
										44
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								main.c
									
									
									
									
									
								
							@ -36,21 +36,44 @@ static size_t table_insert(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, L
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This function is intended for small-medium runtimes, since the caller thread's heap is not touchable during this call.
 | 
					struct ThreadsParallelCtx {
 | 
				
			||||||
 | 
						LVM *L;
 | 
				
			||||||
 | 
						LFunc *func;
 | 
				
			||||||
 | 
						_Atomic uint32_t finished;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					static int threads_parallel_worker(void *arg) {
 | 
				
			||||||
 | 
						struct ThreadsParallelCtx *ctx = arg;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						LRegSet regset = {};
 | 
				
			||||||
 | 
						lvm_reset_regs(®set);
 | 
				
			||||||
 | 
						lvm_run(ctx->L, ctx->func, 0, ®set);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						atomic_fetch_add(&ctx->finished, 1);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
static size_t threads_parallel(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, LRegSet *regset) {
 | 
					static size_t threads_parallel(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, LRegSet *regset) {
 | 
				
			||||||
	size_t no = lvalue_to_int32(regset->regs[0]);
 | 
						size_t no = lvalue_to_int32(regset->regs[0]);
 | 
				
			||||||
	LFunc *func = (LFunc*) (regset->regs[1].u & ~LTAG_MASK);
 | 
						LFunc *func = (LFunc*) (regset->regs[1].u & ~LTAG_MASK);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	atomic_fetch_sub(&lvm->active_thread_count, 1);
 | 
						if(no == 0) {
 | 
				
			||||||
	
 | 
							return 0;
 | 
				
			||||||
	#pragma omp parallel for
 | 
					 | 
				
			||||||
	for(size_t i = 0; i < no; i++) {
 | 
					 | 
				
			||||||
		LRegSet regset = {};
 | 
					 | 
				
			||||||
		lvm_reset_regs(®set);
 | 
					 | 
				
			||||||
		lvm_run(lvm, func, 0, ®set);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	atomic_fetch_add(&lvm->active_thread_count, 1);
 | 
						struct ThreadsParallelCtx ctx = {.L = lvm, .func = func, .finished = 0};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						thrd_t thrds[no];
 | 
				
			||||||
 | 
						for(size_t i = 1; i < no; i++) {
 | 
				
			||||||
 | 
							thrd_create(&thrds[i], threads_parallel_worker, &ctx);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						LRegSet set = {.parent = regset};
 | 
				
			||||||
 | 
						lvm_reset_regs(&set);
 | 
				
			||||||
 | 
						lvm_call(lvm, func, 0, heap, &set);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						while(atomic_load(&ctx.finished) != no - 1) {
 | 
				
			||||||
 | 
							lvm->safepoint_func(lvm, heap, regset);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -122,6 +145,9 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	LVM lvm = {};
 | 
						LVM lvm = {};
 | 
				
			||||||
	lvm_init(&lvm);
 | 
						lvm_init(&lvm);
 | 
				
			||||||
 | 
						lvm.unit_count = 1;
 | 
				
			||||||
 | 
						lvm.units = calloc(1, sizeof(*lvm.units));
 | 
				
			||||||
 | 
						lvm.units[0] = unit;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	LRegSet regset = {.parent = NULL};
 | 
						LRegSet regset = {.parent = NULL};
 | 
				
			||||||
	lvm_reset_regs(®set);
 | 
						lvm_reset_regs(®set);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								parse.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								parse.c
									
									
									
									
									
								
							@ -1195,7 +1195,7 @@ LUnit *lparse(size_t sz, Token *tokens, LTable *environment) {
 | 
				
			|||||||
	P.unit_functions.data[0].lua_instrs = P.current_chunk.instrs.data;
 | 
						P.unit_functions.data[0].lua_instrs = P.current_chunk.instrs.data;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	unit->abyss = P.abyss;
 | 
						unit->abyss = P.abyss;
 | 
				
			||||||
	unit->func_count = 1;
 | 
						unit->func_count = P.unit_functions.size;
 | 
				
			||||||
	unit->funcs = P.unit_functions.data;
 | 
						unit->funcs = P.unit_functions.data;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for(Expr *e = last_desc; e;) {
 | 
						for(Expr *e = last_desc; e;) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vm.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								vm.c
									
									
									
									
									
								
							@ -63,9 +63,10 @@ do_getglobal:;
 | 
				
			|||||||
		
 | 
							
 | 
				
			||||||
		regset->regs[inst->a] = ltable_get(func->env, lvalue_from_string(str));
 | 
							regset->regs[inst->a] = ltable_get(func->env, lvalue_from_string(str));
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		set_LValueU_insert(heap, lvalue_from_string(str).u);
 | 
							free(str);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		lvm_gc_alert(L, &privates, sizeof(*str) + len);
 | 
							//set_LValueU_insert(heap, lvalue_from_string(str).u);
 | 
				
			||||||
 | 
							//lvm_gc_alert(L, &privates, sizeof(*str) + len);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	DISPATCH();
 | 
						DISPATCH();
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -421,7 +422,7 @@ static void gc_mark(LValue v) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
static void gc_mark_units(LVM *L) {
 | 
					static void gc_mark_units(LVM *L) {
 | 
				
			||||||
	for(size_t u = 0; u < L->unit_count; u++) {
 | 
						for(size_t u = 0; u < L->unit_count; u++) {
 | 
				
			||||||
		LUnit *unit = &L->units[u];
 | 
							LUnit *unit = L->units[u];
 | 
				
			||||||
		for(size_t f = 0; f < unit->func_count; f++) {
 | 
							for(size_t f = 0; f < unit->func_count; f++) {
 | 
				
			||||||
			LFunc *func = &unit->funcs[f];
 | 
								LFunc *func = &unit->funcs[f];
 | 
				
			||||||
			gc_mark(lvalue_from_table(func->env));
 | 
								gc_mark(lvalue_from_table(func->env));
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vm.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								vm.h
									
									
									
									
									
								
							@ -113,7 +113,7 @@ typedef struct LThreadPrivates {
 | 
				
			|||||||
#define L_THREADS_MAX 32
 | 
					#define L_THREADS_MAX 32
 | 
				
			||||||
typedef struct LVM {
 | 
					typedef struct LVM {
 | 
				
			||||||
	size_t unit_count;
 | 
						size_t unit_count;
 | 
				
			||||||
	LUnit *units;
 | 
						LUnit **units;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// The following is all used for GC
 | 
						// The following is all used for GC
 | 
				
			||||||
	_Atomic bool gcInProgress;
 | 
						_Atomic bool gcInProgress;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user