Ejemplo n.º 1
0
static void spawn_init_start(int8_t *cmd_line)
{
	proc_t *init_proc = proc_make(noval);	// group leader set later
	assert(init_proc != 0);

	init_proc->cap.regs[0] = parse_cmd_line(&init_proc->hp, cmd_line);
	assert(init_proc->cap.regs[0] != noval);
	init_proc->cap.live = 1;

	init_proc->init_call_mod = A_INIT;
	init_proc->init_call_func = A_BOOT;
	init_proc->init_call_arity = 1;

	export_t *exp = code_base_lookup(A_INIT, A_BOOT, 1);
	assert(exp != 0);

	init_proc->cap.ip = exp->entry;
	module_info_t *mi = code_base_module_by_name(A_INIT, 0);
	assert(mi != 0);
	init_proc->cap.cp = mi->code_starts + mi->code_size-1;

	scheduler_enlist0(init_proc);	// pid assigned
	init_proc->group_leader = init_proc->pid;	// init is its own leader

	proc_main(init_proc);

	/* UNREACHANBLE */
}
Ejemplo n.º 2
0
static void proc_apply(process_t *proc, term_t mod, term_t fun, term_t args)
{
	celem_t *ip;
	int arity = lst_len(args);

	term_t mdi = intnum(proc->mod_index);
	term_t off = intnum(proc->ip - proc->code);

	ip = code_base_lookup(proc->base,
		mod, fun, arity, &proc->mod_index, &proc->code);
	if (ip == 0)
	{
		*(term_t *)apr_array_push(proc->cstack) = args;
		*(term_t *)apr_array_push(proc->cstack) = fun;
		*(term_t *)apr_array_push(proc->cstack) = mod;

		ip = code_base_lookup(proc->base,
			A_ERROR_HANDLER, A_UNDEFINED_FUNCTION, 3, &proc->mod_index, &proc->code);
	}
	else
	{
		// pushing args in reverse order: kludgy

		term_t l;
		int i;
		for (i = 0; i < arity; i++)
			*(term_t *)apr_array_push(proc->cstack) = AI_UNDEFINED;

		l = args;
		i = 0;
		while (l != nil)
		{
			(((term_t *)proc->cstack->elts)[proc->cstack->nelts-i-1]) = lst_value(l);
			l = lst_next(l);
			i++;
		}
	}

	*(term_t *)apr_array_push(proc->cstack) = mdi;
	*(term_t *)apr_array_push(proc->cstack) = off;

	proc->ip = ip;
}