コード例 #1
0
ファイル: bip_shelf.c プロジェクト: CoryXie/BarrelfishOS
static int
p_shelf_create2(value vinit, type tinit, value vbag, type tbag)
{
    pword bag;
    pword *pheap, *pglobal;
    t_heap_array *obj;
    int i, err;

    Check_Ref(tbag);
    Check_Structure(tinit);
    pglobal = vinit.ptr;
    i = DidArity(pglobal->val.did);

    /* INSTANCE INITIALISATION */
    obj = (t_heap_array *) hg_alloc_size(
			    sizeof(t_heap_array) + i*sizeof(pword));
    obj->ref_ctr = 1;
    pheap = obj->array;
    pheap[0] = pglobal[0];
    for (; i > 0; --i)
    {
	pword *parg = &pglobal[i];
	Dereference_(parg);
	err = create_heapterm(&pheap[i], parg->val, parg->tag);
	Return_If_Not_Success(err);
    }
    bag = ec_handle(&heap_array_tid, (t_ext_ptr) obj);
    Return_Unify_Pw(vbag, tbag, bag.val, bag.tag);
}
コード例 #2
0
ファイル: bip_shelf.c プロジェクト: CoryXie/BarrelfishOS
static int
p_shelf_create3(value vkey, type tkey, value vinit, type tinit, value vbag, type tbag)
{
    dident key_did;
    pword *p, bag;
    t_heap_array *obj;
    int i;
    Check_Ref(tbag);
    Get_Functor_Did(vkey, tkey, key_did);
    i = DidArity(key_did);
    if (i < 1)
	{ Bip_Error(RANGE_ERROR); }

    /* INSTANCE INITIALISATION */
    obj = (t_heap_array *) hg_alloc_size(
			    sizeof(t_heap_array) + i*sizeof(pword));
    obj->ref_ctr = 1;
    p = obj->array;
    for (; i > 0; --i)
    {
	int err = create_heapterm(&p[i], vinit, tinit);
	Return_If_Not_Success(err);
    }
    p[0].val.did = key_did;
    p[0].tag.kernel = TDICT;

    bag = ec_handle(&heap_array_tid, (t_ext_ptr) obj);
    Return_Unify_Pw(vbag, tbag, bag.val, bag.tag);
}
コード例 #3
0
ファイル: bip_module.c プロジェクト: antiguru/eclipse-clp
/*
  Add 'module' to the chain of module pointed to by '*scan'.
  The module is added at the beginning of the chain.
  A reference of '*scan' is passed (**scan) to be able to modify it.
*/
static void
_add_module(dident module, didlist **start)
{
	didlist		*new_mod;

	new_mod = (didlist *) hg_alloc_size(sizeof(didlist));
	new_mod->name = module;
	new_mod->next = *start;
	*start = new_mod;
}
コード例 #4
0
ファイル: proc_desc.c プロジェクト: CoryXie/BarrelfishOS
void
add_proc_to_chain(pri *p, proc_duet **chain)
/* Locks: requires ProcChainLock. aquires nothing. */
{
    proc_duet	*gd;

    gd = (proc_duet *) hg_alloc_size(sizeof(proc_duet));
    gd->desc = p;
    gd->next = *chain;
    *chain = gd;
}
コード例 #5
0
ファイル: proc_desc.c プロジェクト: CoryXie/BarrelfishOS
static pri*
_new_pri(dident functor, dident module)
{
    pri *pd = (pri*) hg_alloc_size(sizeof(pri));
    pd->did = functor;
    pd->flags = NOREFERENCE|DEBUG_DF;
    pd->module_def = module;
    pd->module_ref = pd->trans_function = D_UNKNOWN;
    pd->nextproc = pd->next_in_mod = 0;
    pd->mode = 0;
    pd->code.vmc = 0;
    return pd;
}
コード例 #6
0
ファイル: error.c プロジェクト: CoryXie/BarrelfishOS
void
error_init(int flags)
{
    if (flags & INIT_SHARED)
    {
	int i;
	/*
	 * Due to the user entries, part of the message array is
	 * mutable and must be in shared memory.
	 */
	ErrorMessage = (char **) hg_alloc_size(sizeof(char *) * MAX_ERRORS);
	for(i=0; i<MAX_ERRORS; i++)
	{
	    ErrorMessage[i] = ec_error_message[i];
	}
	(void) built_in(in_dict("error_id", 2), p_error_id, B_UNSAFE|U_SIMPLE);
	(void) local_built_in(in_dict("max_error", 1), p_max_error, B_UNSAFE|U_SIMPLE);
	(void) local_built_in(in_dict("set_last_errno", 1), p_set_last_errno, B_SAFE);
	(void) local_built_in(in_dict("get_last_errno", 1), p_get_last_errno, B_UNSAFE|U_SIMPLE);
	(void) built_in(in_dict("errno_id", 1), 	p_errno_id1,	B_UNSAFE|U_SIMPLE);
	(void) built_in(in_dict("errno_id", 2), 	p_errno_id,	B_UNSAFE|U_SIMPLE);
    }
}
コード例 #7
0
pword *
set_modular_property(dident functor, int property_name, dident module, type mod_tag, int flag, int *err_ref)
{
    register property	*p, *head;
    module_item		*pm;

    if (flag == LOCAL_PROP && IsLocked(module)
	&& !IsModuleTag(module, mod_tag))
    {
	Property_Error(err_ref, LOCKED);
    }

    /* get pointer to property list from atom */
    a_mutex_lock(&PropListLock);
    head = p = DidProperties(functor);

    while (p && p->name != property_name)	/* find the right one	*/
    {
	head = p;
	p = p->next_prop;
    }

    if (!p)					/* no such property yet	*/
    {
	p = (property *) hg_alloc_size(sizeof(property));
	p->name = property_name;
	p->next_prop = (property *) NULL;
	p->next_mod = p;
	p->module = D_UNKNOWN;
	if (head)
	    head->next_prop = p;
	else
	    DidProperties(functor) = p;
    }

    if (flag == GLOBAL_PROP)
    {
	if (p->module == D_UNKNOWN)
	{
	    p->module = module;			/* fill unused descriptor */
	    p->property_value.tag.kernel = TEND;
	    a_mutex_unlock(&PropListLock);
	    return &p->property_value;
	}
	else
	{
	    a_mutex_unlock(&PropListLock);
	    Property_Error(err_ref, PERROR)/* global exists already */
	}
    }

    /* else if (flag == LOCAL_PROP) */
    head = p;	
    for(p = head->next_mod; p != head; p = p->next_mod)
    {
	if (p->module == module)
	{
	    a_mutex_unlock(&PropListLock);
	    Property_Error(err_ref, PERROR); /* a local exists	*/
	}
    }

    /* insert a new descriptor at the beginning	*/
    p = (property *) hg_alloc_size(sizeof(property));
    p->name = property_name;
    p->module = module;
    p->property_value.tag.kernel = TEND;
    p->next_mod = head->next_mod;
    head->next_mod = p;
    a_mutex_unlock(&PropListLock);
    
    a_mutex_lock(&ModuleLock);
    pm = (module_item *) (get_property(module, MODULE_PROP))->val.ptr;
    p->next_prop = pm->properties;
    pm->properties = p;
    a_mutex_unlock(&ModuleLock);

    return &p->property_value;
}