Beispiel #1
0
/*
 *  Allocate a new RDL instance under library state [rl].
 */
static struct rdl * rdl_new (struct rdllib *rl)
{
    struct rdl * rdl = malloc (sizeof (*rdl));
    if (rdl == NULL)
        return NULL;
    /*
     *  Each rdl instance is a new thread in global lua state rl->L
     */
    rdl->L = create_thread (rl->L);
    rdl->lua_ref = luaL_ref (rl->L, LUA_REGISTRYINDEX);

    if (!rdl->L || rdl->lua_ref == LUA_NOREF) {
        rdl_destroy (rdl);
        return (NULL);
    }

    /* Pointer back to 'library'instance */
    rdl->rl = rl;
    rdl->resource_list = list_create ((ListDelF) rdl_resource_destroy_nolist);

    /*
     *  Link this rdl to rdllib rdl list:
     */
    list_append (rl->rdl_list, rdl);

    /* Leave rdl instance on top of stack */
    return (rdl);
}
Beispiel #2
0
static struct rdl * loadfn (struct rdllib *rl, const char *fn, const char *s)
{
    int rc;
    struct rdl * rdl = rdl_new (rl);
    if (rdl == NULL)
        return NULL;

    /*
     *  First, get function to evaluate rdl:
     */
    rc = rdl_dostringf (rdl, "return require 'RDL'.%s", fn);
    if (rc <= 0) {
        VERR (rl, "rdl_load: Failed to get function RDL.%s\n", fn);
        rdl_destroy (rdl);
        return (NULL);
    }

    /*
     *  Now push function arg `s' onto stack, and evaluate the function:
     */
    if (s)
        lua_pushstring (rdl->L, s);
    if (lua_pcall (rdl->L, s?1:0, LUA_MULTRET, 0)) {
        VERR (rl, "rdl_load: RDL.%s: %s\n", fn, lua_tostring (rdl->L, -1));
        rdl_destroy (rdl);
        return (NULL);
    }

    if (lua_type (rdl->L, -1) != LUA_TTABLE) {
        VERR (rl, "rdl_load: %s\n", lua_tostring (rdl->L, -1));
        rdl_destroy (rdl);
        return (NULL);
    }
    lua_setglobal (rdl->L, "rdl");
    lua_settop (rdl->L, 0);
    return (rdl);
}
Beispiel #3
0
resrc_flow_t *resrc_flow_generate_rdl (const char *path, char *uri)
{
    resrc_flow_t *flow = NULL;
    struct rdl *rdl = NULL;
    struct rdllib *l = NULL;
    struct resource *r = NULL;

    if (!(l = rdllib_open ()) || !(rdl = rdl_loadfile (l, path)))
        goto ret;

    if ((r = rdl_resource_get (rdl, uri)))
        flow = resrc_flow_add_rdl (NULL, r);

    rdl_destroy (rdl);
    rdllib_close (l);
ret:
    return flow;
}
Beispiel #4
0
int main (int argc, char *argv[])
{
    struct rdllib *l;
    struct rdl *rdl1, *rdl2;
    struct rdl_accumulator *a;
    struct resource *r, *c;
    int64_t val;
    const char *h = NULL;

    const char *filename = argv[1];

    log_init (basename (argv[0]));
    rdllib_set_default_errf (NULL, &perr);

    if (!(l = rdllib_open ()))
        log_err_exit ("rdllib_open");

    if (filename == NULL || *filename == '\0')
        filename = getenv ("TESTRDL_INPUT_FILE");

    if (!(rdl1 = rdl_loadfile (l, filename)))
        log_err_exit ("loadfile: %s", filename);

    while ((h = rdl_next_hierarchy (rdl1, h)))
        fprintf (stderr, "%s\n", h);

    if (!(rdl2 = rdl_copy (rdl1)))
        log_err_exit ("copy");

    r = rdl_resource_get (rdl1, "default");
    if (rdl_resource_set_int (r, "test-tag", 5959) < 0)
        exit (1);
    rdl_resource_get_int (r, "test-tag", &val);
    if (val != 5959)
        exit (1);
     rdl_resource_delete_tag (r, "test-tag");

    c = rdl_resource_next_child (r);

    a = rdl_accumulator_create (rdl1);
    if (rdl_accumulator_add (a, c) < 0)
        exit (1);

    rdl2 = rdl_accumulator_copy (a);
    rdl_accumulator_destroy (a);

    print_resource (rdl_resource_get (rdl2, "default"), 0);

    /*
     *  Test find
     */
    json_t *args = Jnew ();
    Jadd_str (args, "type", "node");
    Jadd_int (args, "id", 300);
    rdl2 = rdl_find (rdl1, args);
    if (rdl2 == NULL)
        log_err_exit ("rdl_find");
    json_decref (args);
    r = rdl_resource_get (rdl2, "default");
    if (r == NULL)
        exit (1);

    c = rdl_resource_next_child (r);
    printf ("found %s\n", rdl_resource_name (c));

    rdl_resource_destroy (r);
    rdl_destroy (rdl2);

    r = rdl_resource_get (rdl1, "default:/hype/hype300/socket0/memory");
    if (r == NULL)
        exit (1);

    print_resource (r, 0);
    rdl_resource_alloc (r, 1024);
    printf ("After alloc:\n");
    print_resource (r, 0);
    rdl_resource_free (r, 1024);
    printf ("After free:\n");
    print_resource (r, 0);

    rdllib_close (l);

    log_fini ();

    return 0;
}